đánh số lượng tự động nhảy ra số thứ tự cho các dòng khác

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

hoangyen14996

Thành viên mới
Tham gia
27/6/19
Bài viết
4
Được thích
1
các bác ơi em đang cần tại cột C khi đánh số 10 thì cột E tự động nhảy ra số TT từ 1 đến 10 sau đó cột C gõ 5 thì sẽ nhảy ra 5 dòng stt như trong file đính kèm. Các bác hướng dẫn e cách làm với ạ
em cảm ơn ạ
 

File đính kèm

  • test.xlsx
    8.5 KB · Đọc: 22
các bác ơi em đang cần tại cột C khi đánh số 10 thì cột E tự động nhảy ra số TT từ 1 đến 10 sau đó cột C gõ 5 thì sẽ nhảy ra 5 dòng stt như trong file đính kèm. Các bác hướng dẫn e cách làm với ạ
em cảm ơn ạ

Bạn thử công thức này nhé

E2=INDEX(MMULT(N(ROW($1:$15)>=TRANSPOSE(ROW($1:$15))),SIGN(ROW($1:$15)))-LOOKUP(ROW($1:$15),ROW($1:$15)/($C$2:$C$17<>""))+1,ROW(1:1))

Thân
 

File đính kèm

  • test-6.xlsx
    9.7 KB · Đọc: 9
Upvote 0
Dùng hàm SEQUENCE nhé bạn
 

File đính kèm

  • test.xlsx
    10.6 KB · Đọc: 12
Upvote 0
Thích macro thì xin mời tham khảo con macro sự kiện nè:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim NumRws As Integer, J As Integer
 
 If Not Intersect(Target, [C1:C9999]) Is Nothing Then
    NumRws = Target.Value
    For J = 1 To NumRws
        Target.Offset(J - 1, 2).Value = J 
    Next J
 End If
End Sub
 
Upvote 0
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then DanhSoTT Target.Value
End Sub

Private Sub DanhSoTT(mxVal As Long)
Application.EnableEvents = False
Dim Rg As Range, prev As Long
prev = Range("E" & Rows.Count).End(xlUp).Row ' last row used
Set Rg = Range("E" & (prev + 1)).Resize(mxVal) ' range to write data
Rg.Offset(IIf(Rg.Offset(-1, 0).Cells(1).Value = Empty, -1, 0)).Value = _
Evaluate("row(" & Rg.Address & ")" & "-" & prev)
Application.EnableEvents = True
End Sub
 
Upvote 0
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then DanhSoTT Target.Value
End Sub

Private Sub DanhSoTT(mxVal As Long)
Application.EnableEvents = False
Dim Rg As Range, prev As Long
prev = Range("E" & Rows.Count).End(xlUp).Row ' last row used
Set Rg = Range("E" & (prev + 1)).Resize(mxVal) ' range to write data
Rg.Offset(IIf(Rg.Offset(-1, 0).Cells(1).Value = Empty, -1, 0)).Value = _
Evaluate("row(" & Rg.Address & ")" & "-" & prev)
Application.EnableEvents = True
End Sub
Chắc là bác đang chờ gạch đá. Vậy thì em đề nghị bác:
- code phải nằm trong thẻ.
- code phải có hướng dẫn sử dụng.
--=0 --=0 --=0
 
Upvote 0
Chắc là bác đang chờ gạch đá. Vậy thì em đề nghị bác:
- code phải nằm trong thẻ.
- code phải có hướng dẫn sử dụng.
--=0 --=0 --=0
Đề nghị tầm bậy. Lần sau chịu khó tìm hiểu những gì mình đề nghị do đâu mà có.
1. Code không có những blocks như IF, For, With,... thì cần gì phải dùng thẻ?
2. Tôi nói chuyện với người biết đọc code chứ có phải giúp chủ thớt đâu mà cần hướng dẫn cách sử dụng.
2.1. Code được viết theo chiều hướng tốc dộ, không có tính cách uyển chuyển (rất khó chỉnh sửa)
2.2. Code được viết để minh họa giải pháp. Mà giải pháp không có tính cách đại trà nên không cần phải rườm rà.
 
Upvote 0
Bạn có thể sử dụng hàm UDF dưới đây để đánh số thứ tự, cần chép mã vào một Module trong VBA, và lưu tệp ở dạng xlsm.

Ví dụ muốn bắt sự kiện nhập ở cột A1:A10000, và đánh số thứ tự tại Cột E thì nhập vào ô cột E công thức như sau:


Ưu điểm của hàm:
  1. Hàm tự động xóa các đánh số trước đó còn sót lại.
  2. Hàm không làm hỏng chế độ Undo và Redo của bạn.
  3. Tương thích với Excel 365 và 2021 trở đi.
  4. Có thể sử dụng lại mã không cần viết thêm mã VBA.

Lưu ý: Chỉ hoạt động trên HĐH Windows.

JavaScript:
Option Explicit
#If VBA7 = 0 Then
  Private Enum LongPtr:[_]:End Enum
#End If
#If -VBA7 And -Win64 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As LongPtr
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As LongPtr
#ElseIf VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If
Private Type AutoFillOrderArguments
  newXL As Boolean
  action As Long
  direction  As Long
  ThisCell As Range
  Addr As String
  fx As String
  RangeEvent As Range
  columnFill As Long
  time As Single
  value As Variant
End Type
Private Work As AutoFillOrderArguments
Function AutoFillOrder(ByVal RangeEvent As Range, ParamArray Params())
  On Error Resume Next
  Dim r As Object, s$, k%, i%, p, j%
  Set r = Application.caller
  If Err Then Exit Function
  With Work
    Err.Clear:  s = r.Formula2: .newXL = Err = 0
    If Not .newXL Then If Not r.Parent Is ActiveSheet Then AutoFillOrder = r.value: Exit Function
    If .action = 0 Then
      .Addr = s
      Set .ThisCell = r
      Set .RangeEvent = RangeEvent
      .columnFill = r.Column - RangeEvent.Column
      .fx = r.Formula
      .action = 1
      .time = Timer
    End If
    If .action = 3 Then
      AutoFillOrder = .value
      Dim w As AutoFillOrderArguments: Work = w
      Exit Function
    Else
      AutoFillOrder = "[Filling]"
    End If
  End With
  FONSetTimer 2
End Function
Private Sub FONSetTimer(id&)
  Call SetTimer(Application.hwnd, 1241215 + id, 100, AddressOf FillOrderNumbers_callback)
End Sub
Private Sub FillOrderNumbers_callback(ByVal hwnd As LongPtr, ByVal wMsg As LongPtr, ByVal idEvent As LongPtr, ByVal dwTime As LongPtr)
  On Error Resume Next
  KillTimer hwnd, idEvent
  FillOrderNumbers_working CLng(idEvent - 1241215)
End Sub
Private Sub FillOrderNumbers_working(ByVal direction&)
  On Error Resume Next
  Static acell As Range
  If Timer - Work.time > 1 Then
    Set acell = Nothing: Work.action = 0: Exit Sub
  End If
  Select Case direction
  Case 1: SendKeys "^", False: SendKeys "^v", False: FONSetTimer 0: Exit Sub
  Case 0
    Application.Goto acell, False
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic
    Work.action = 0
    Dim w As AutoFillOrderArguments
    Work = w
    Set acell = Nothing
    Exit Sub
  End Select
  Dim r&, r0&, cr&, k&, m&, i&, c&, rg, rg1, rg2, area, n&, n2&, s, o, v
  Set acell = ActiveCell
  With Work
    .action = 2
    s = OrderNumbers(.RangeEvent, .columnFill, Not .newXL, v)
    If .newXL Then
        .action = 3: .value = s: .ThisCell.Dirty
    Else
      Application.ScreenUpdating = False
      Application.EnableEvents = False
      Application.DisplayAlerts = False
      Application.Calculation = xlCalculationManual
      .value = v
      If .ThisCell.HasArray Then
        .ThisCell.CurrentArray.Clear
        .ThisCell.Formula = .fx
      Else
        .ThisCell.Dirty
      End If
      Application.Goto .ThisCell(.ThisCell.MergeArea.Rows.Count + 1, 1), False
      With oGlb_DataObject
        .SetText s
        .PutInClipboard
      End With
      .action = 3
      FONSetTimer 1
    End If
  End With
End Sub

Private Function OrderNumbers(RangeEvent, columnFill, Optional repString As Boolean, Optional value)
  On Error Resume Next
  value = vbNullString
  Dim x&, r&, r0&, cr&, k&, m&, i&, c&, rg, rg1, rg2
  Dim area, n&, n2&, s$, o, z, b As Boolean
  Set rg = RangeEvent.Resize(, 1)
  Set rg2 = rg(1, columnFill + 1)
  r0 = rg.Row
  Set rg1 = rg.SpecialCells(xlCellTypeConstants)
  n2 = r0
  ReDim z(1 To 1)
  For k = 1 To rg1.Areas.Count
    Set area = rg1.Areas(k): cr = area.Row: c = cr - r0
    Err.Clear: n = area.value
    If Err = 0 Then
      If n > 0 Then
        If cr > n2 Then
          If Not b Then b = True
          For i = 1 To area.Row - n2
            m = m + 1: ReDim Preserve z(1 To m): z(m) = vbNullString
          Next
        End If
        For i = 1 To n
          If i > 1 Then If area(i, 1).value <> Empty Then n = i: Exit For
          m = cr + i - r0: ReDim Preserve z(1 To m): z(m) = i
          If Not b Then value = 1: b = 2
        Next
        n2 = cr + n - 1
      End If
    End If
  Next
  i = n2: k = 0
 
  If repString Then
    Do
      i = i + 1: ReDim Preserve z(1 To i): z(i) = vbNullString
      If rg(i, columnFill + 1).value = Empty Then
        k = k + 1: If k > 200 Then Exit Do
      End If
    Loop
    s = Join(z, vbLf)
    s = Mid$(s, InStr(s, vbLf) + 1)
    OrderNumbers = s
  Else
    OrderNumbers = Application.Transpose(z)
  End If
End Function


Private Function oGlb_DataObject() 'as MSForms.DataObject
  Static o As Object
  If o Is Nothing Then Set o = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  If o Is Nothing Then Set o = CreateObject("New:{3181A65A-CC39-4CDE-A4DF-2E889E6F1AF1}")
  Set oGlb_DataObject = o
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Thích macro thì xin mời tham khảo con macro sự kiện nè:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim NumRws As Integer, J As Integer
 
 If Not Intersect(Target, [C1:C9999]) Is Nothing Then
    NumRws = Target.Value
    For J = 1 To NumRws
        Target.Offset(J - 1, 2).Value = J
    Next J
 End If
End Sub
em chạy đc rồi e cảm ơn bác nhiều ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Thích macro thì xin mời tham khảo con macro sự kiện nè:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim NumRws As Integer, J As Integer
 
 If Not Intersect(Target, [C1:C9999]) Is Nothing Then
    NumRws = Target.Value
    For J = 1 To NumRws
        Target.Offset(J - 1, 2).Value = J
    Next J
 End If
End Sub
bác ơi ciu em ạ, khi em qly dữ liệu thì phát sinh ra việc khác ạ.
e muốn là cùng 1 mã hàng cùng tuần khi mình có chỉ thị thêm số lượng thì cái số tt nó sẽ nhảy tiếp nối với stt trước đó. Ví dụ lần trước em làm 10 đến stt 10 rồi thì lần này e chỉ thị thêm 5 nó sẽ nhảy từ 11 ý ạ
 

File đính kèm

  • test-2.xlsm
    16.3 KB · Đọc: 3
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom