Code Đánh số thự tự tự động theo dữ liệu phát sinh

Liên hệ QC

Thanhhoai00

Thành viên chính thức
Tham gia
19/7/20
Bài viết
58
Được thích
13
Mình có đoạn code Đánh số thứ tự tự động theo dữ liệu phát sinh như sau ạ !!!
  • Code này Mỗi lần mình gõ dữ liệu vào cột B thì bên cột A sẽ tự động nhảy Số Thứ tự
  • Mình muốn Gõ dữ liệu vào cột C để cột A tự động nhảy số thứ tự , mình phải sửa code lại thế nào ạ ????????????
Cảm ơn các bạn nhiều ạ !!!

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim i, j, k
i = Cells(Rows.Count, 2).End(xlUp).Row
k = 1
Application.EnableEvents = False
Range("A:A").ClearContents
For j = 1 To i
If Not Intersect(Range("A:B"), Target) Is Nothing Then
If Cells(j, 2) <> "" Then
Cells(j, 1) = k
k = k + 1
End If
End If
Next
Application.EnableEvents = True
End Sub
 

File đính kèm

  • Book1.xlsm
    15.3 KB · Đọc: 17
  • danhsott.png
    danhsott.png
    129.2 KB · Đọc: 12
Lần chỉnh sửa cuối:
Mình viết lại đoạn code bạn có & bạn thử diễn dịch nó sang tiếng Việt các dòng lệnh xem sao & chúc thành công:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
'On Error Resume Next   Hiên Tai Ban Không Nên Xài Câu Lênh Này'
Dim I, J, K

I = Cells(Rows.Count, "B").End(xlUp).Row
Application.EnableEvents = False
Range("A1:A" & I + 9).ClearContents
For J = 1 To I
    If Not Intersect(Range("A:B"), Target) Is Nothing Then
        If Cells(J, "B") <> "" Then
            K = K + 1
            Cells(J, "A") = K
        End If
    End If
Next
Application.EnableEvents = True
End Sub
 
Upvote 0
Bạn có thể sử dụng hàm VBA UDF sau:

Gõ vào ô bắt đầu đánh thứ tự, ví dụ ô A2:

=S_OrderAuto(A2:H1000)
Hoặc đặt số bắt đầu: =S_OrderAuto(A2:H1000, 3)
Hoặc đánh thêm vài dòng: =S_OrderAuto(A2:H1000, 3, 3)
Hoặc định dạng: =S_OrderAuto(A2:H1000, 3, 3,"0000")
Hoặc nối thêm chuỗi trước, hay chuỗi sau: =S_OrderAuto(A2:H1000, 3, 3,"0000", "STT", "SHS")

Với hàm duy nhất này bạn không cần phải sao chép code như trong sự kiện Worksheet_Change, để thực hiện cho nhiều vị trí đánh số thứ tự khác nhau trong một Sheet hoặc trong Sheet khác.

(Vì sao có S_ trước hàm, đa số hàm tôi viết đều có S_ trước hàm, vì sẽ dễ gõ để tự động)
-----------------------
JavaScript:
Option Explicit
#If 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
#If Win64 Then
  Private gTimerID As LongPtr, gTimerID2 As LongPtr
#Else
  Private gTimerID As Long, gTimerID2 As Long
#End If
Private OrderAuto_OArgs(), OrderAuto_OIndex As Integer
Function S_OrderAuto(ByVal Target As Range, _
            Optional ByVal StartNumber As Long = 1, _
            Optional ByVal OverOrder As Long = 0, _
            Optional ByVal Format As String = "0", _
            Optional ByVal BeforeName As String = "", _
            Optional ByVal AfterName As String = "") As Variant
  On Error Resume Next
  KillTimer 0&, gTimerID: gTimerID = 0
  S_OrderAuto = BeforeName & VBA.Format(StartNumber, Format) & AfterName
  If Left(CStr(S_OrderAuto), 1) = 0 Then
    S_OrderAuto = "'" & S_OrderAuto
  End If
  Dim K As Integer
  K = UBound(OrderAuto_OArgs)
  ReDim Preserve OrderAuto_OArgs(1 To K + 1)
  OrderAuto_OArgs(K + 1) = VBA.Array(Target, StartNumber, OverOrder, Format, BeforeName, AfterName, Application.Caller)
  gTimerID = SetTimer(0&, 0&, 1, AddressOf S_OrderAuto_callback)
End Function
Private Sub S_OrderAuto_callback()
  On Error Resume Next
  Call KillTimer(0&, gTimerID): gTimerID = 0
  Call KillTimer(0&, gTimerID2): gTimerID2 = 0
  On Error GoTo 0
  Dim UA As Integer
  UA = UBound(OrderAuto_OArgs)
  If UA > 0 Then
    OrderAuto_OIndex = OrderAuto_OIndex + 1
    Dim Args As Variant, A As Variant, R As Long, C As Integer, total(), UB As Long, LR As Long
    Args = OrderAuto_OArgs(OrderAuto_OIndex)
    UB = Args(0).Rows.Count - 1
    If UB > 0 Then
      ReDim total(1 To UB, 1 To 1)
      LR = Args(0).Find("*", after:=Args(0)(1, 1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row - Args(0).Row + Args(2)
      If LR > UB Then LR = UB
      If LR > 0 Then
        For R = 1 To LR
          total(R, 1) = Args(4) & VBA.Format(Args(1) + R, Args(3)) & Args(5)
          If Left(CStr(total(R, 1)), 1) = 0 Then
            total(R, 1) = "'" & total(R, 1)
          End If
        Next
        Args(6)(2, 1).Resize(UB).value = total
      End If
    End If
    If OrderAuto_OIndex >= UA Then
      Erase OrderAuto_OArgs: OrderAuto_OIndex = 0
    Else
      gTimerID = SetTimer(0&, 0&, 1, AddressOf S_OrderAuto_callback2)
    End If
  End If
End Sub
Private Sub S_OrderAuto_callback2()
  S_OrderAuto_callback
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể sử dụng hàm VBA UDF sau:

Gõ vào ô bắt đầu đánh thứ tự, ví dụ ô A2:

=S_OrderAuto(A2:H1000)
Hoặc đặt số bắt đầu: =S_OrderAuto(A2:H1000, 3)
Hoặc đánh thêm vài dòng: =S_OrderAuto(A2:H1000, 3, 3)
Hoặc định dạng: =S_OrderAuto(A2:H1000, 3, 3,"0000")
Hoặc nối thêm chuỗi trước, hay chuỗi sau: =S_OrderAuto(A2:H1000, 3, 3,"0000", "STT", "SHS")

Với hàm duy nhất này bạn không cần phải sao chép code như trong sự kiện Worksheet_Change, để thực hiện cho nhiều vị trí đánh số thứ tự khác nhau trong một Sheet hoặc trong Sheet khác.

(Vì sao có S_ trước hàm, đa số hàm tôi viết đều có S_ trước hàm, vì sẽ dễ gõ để tự động)
-----------------------
Hàm của anh rất hay, em muốn tùy chỉnh khác ví dụ bỏ qua giá trị ô trống hay không và khi xóa giá trị của ô trong vùng thì tự động giảm giá trị đánh số thứ tự thì làm như thế nào anh?.
 
Upvote 0
Web KT

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

Back
Top Bottom