đánh số thứ tự bằng vba

Liên hệ QC

minhhangg

Thành viên hoạt động
Tham gia
4/5/11
Bài viết
197
Được thích
61
Hỏi những gì trong file. Thank you trước.
Theo thứ tự tăng dần, có dữ liệu thì có STT, không có dữ liệu thì bỏ trống.
 

File đính kèm

  • STT. VBA.xls
    13.5 KB · Đọc: 545
Lần chỉnh sửa cuối:
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub
Biết là lâu lắm nhưng thầy giúp em với, Với code này khi sheet không có dữ liệu thì tiêu đề STT nó tự đổi thành số 1
 

File đính kèm

  • Book1QN.xlsm
    22.7 KB · Đọc: 56
Upvote 0
sheet không có dữ liệu thì tiêu đề STT nó tự đổi thành số 1
Bỏ Private Sub Worksheet_SelectionChange
PHP:
Sub STT()
    Dim SrcRng As Range, Arr, i As Long, n As Long, Res()
    Dim lRow As Long
    With Sheet2
        lRow = .Range("G" & Rows.Count).End(xlUp).Row
        If lRow < 11 Then Exit Sub
        Set SrcRng = .Range("G11:H" & lRow)
        Arr = SrcRng.Value
        ReDim Res(1 To UBound(Arr, 1), 1 To 1)
        For i = 1 To UBound(Arr, 1)
             If Arr(i, 1) <> "" Then
               n = n + 1
               Res(i, 1) = n
             End If
        Next
        SrcRng.Offset(, -2).Value = Res
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
vẫn chưa làm được và đợi gpe giúp em :(
 
Upvote 0
Các cao nhân cho em xin code dò tìm dữ liệu với.
 
Upvote 0
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub

chào thầy, nhờ thầy xem lại code nếu chỉ có 1 dòng [C7] thì số thứ tự ko đúng (không phải là 1)
nhờ thầy chỉ giúp trường hợp như trên ạ
 
Upvote 0
Mọi người cho e hỏi đây chỉ là 1 sheet. Nhưng e muốn làm cho tất cả các sheet trong 1 file hoặc cả 1 thư mục gồm nhều file excel thì e làm như thế nào ạ. E cám ơn ạ
 
Upvote 0
Xin phép thầy, bài này lâu nhưng lại đúng ý muốn làm nhưng phát triển thêm theo kiểu này không biết có được không ạ !
" Bây giờ 1 muốn đánh dấu X vào các loại hình thức hồ sơ thì chỗ "số biên nhận" sẽ tự động đánh số thứ tự tiếp theo của hình thức đó.. Thì phải làm như thế nào ạ."
hoi.jpg
 

File đính kèm

  • Xinhoi.xlsx
    17 KB · Đọc: 6
Upvote 0
Thì vầy đi:
PHP:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([C7], [C65536].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, -2).Value = Arr
End Sub

Xin chào ndu96081631,
Phiền bạn chỉ giúp, dòng lệnh: On Error Resume Next
trong code trên để bắt lỗi gì vậy?
 
Upvote 0
Upvote 0
Để ý trong các code tôi đưa lên diễn đàn thường có dòng lệnh này. Dù đã bẫy lỗi rất kỹ nhưng vẫn cứ thêm dòng ấy vào cho chắc. Thói quen thôi bạn à
Cảm ơn ndu96081631 đã thông tin.
Phiền bạn giải thích thêm giúp OT, trong code bạn có:
Set SrcRng = Range([C7], [C65536].End(xlUp))
Arr = SrcRng.Value
và cũng có trường hợp viết:
i = .Range("C" & .Rows.Count).End(xlUp).Row
Arr = .Range("C7:C" & i).Value

Vậy trong trường hợp nào thì phải sử dụng set, trường hợp nào thì không sử dụng?
Khi sử dụng Set SrcRng thì kết thúc có phải Set SrcRng = nothing không?
 
Upvote 0
Cảm ơn ndu96081631 đã thông tin.
Phiền bạn giải thích thêm giúp OT, trong code bạn có:
Set SrcRng = Range([C7], [C65536].End(xlUp))
Arr = SrcRng.Value
và cũng có trường hợp viết:
i = .Range("C" & .Rows.Count).End(xlUp).Row
Arr = .Range("C7:C" & i).Value

Vậy trong trường hợp nào thì phải sử dụng set, trường hợp nào thì không sử dụng?
Khi sử dụng Set SrcRng thì kết thúc có phải Set SrcRng = nothing không?
Cứ cái nào là biến đối tượng (như Range, Object, Shape...) thì phải khởi tạo bằng động tác Set. Không phải đối tượng thì khỏi cần Set
Theo đó thì: do Dim SrcRng As Range ở trên ---> suy ra SrcRng là biến đối tượng, vậy phải Set
Arr là biến Variant, không phải đối tượng nên không cần Set, chỉ gán là được
 
Upvote 0
:oops:
Xin phép thầy, bài này lâu nhưng lại đúng ý muốn làm nhưng phát triển thêm theo kiểu này không biết có được không ạ !
" Bây giờ 1 muốn đánh dấu X vào các loại hình thức hồ sơ thì chỗ "số biên nhận" sẽ tự động đánh số thứ tự tiếp theo của hình thức đó.. Thì phải làm như thế nào ạ."
View attachment 204523
:oops:
 
Upvote 0
(2) Phiền bạn chỉ giúp, dòng lệnh: On Error Resume Next trong code trên để bắt lỗi gì vậy?
(1) Khi sử dụng Set SrcRng thì kết thúc có phải Set SrcRng = nothing không?
(1) Rất nên & đó là thói quen rất chi là tốt!
(2) Một khi ta biết chắc rằng chương trình gặp lỗi có thể bỏ qua để đi tiếp & không ảnh hưởng gì đến hòa bình thế giới, thì mới nên xài câu lệnh này.
Nhưng tốt hơn hết là là nên có fần bẫy lỗi cuối chương trình theo kiểu
PHP:
Sub GPE()
On Error Goto LoiCT
' . . . . . Các câu lệnh'
Err_ : Exit Sub
LoiCT:
If Err=424 then
   Goto Err_
Else
    MsgBox Err , , Error()
    On Error Resume Next
End If
End Sub
 
Upvote 0
Giải thích về Set:
Trong lập trình, phép tính căn bản nhất phép gán.
Theo tiêu chuẩn cổ xưa của BASIC thì dấu = là phép so sánh. Muốn gán thì phải là lênh Let và dấu bằng:
Let (biến cần gán) = (trị biểu thức)
Về sau này, máy tính mạnh hơn, trình dịch được cải tiến nên Let được bỏ đi.
VBA tuy không phải là loại ngôn ngữ hướng đối tượng nhưng nó có thể làm việc được với đối tượng. Căn bản là hầu hết các giao diện giữa VBA và Excel đều qua các đối tượng của Excel Application, Workbook, và Worksheet.
Tuy nhiên, các đối tượng hầu như luôn luôn có hàm mặc định để lấy giá trị, tức là lấy một thuộc tính nào đó của nó.
VBA quy định rằng lệnh gán bình thường (dấu =) sẽ là phép gọi hàm mặc định để lấy thuộc tính. Và để gán cả đối tượng thì dùng phép gán Set
Điển hình:
a = Range("a1") gọi hàm mặc định của range để lấy trị trong ô a1, gán cho biến a. Như vậy, sau lệnh này, a sẽ có trị bằng trị chứa trong a1
Set a = Range("a1") gán đối tượng Range("a1") cho a. Như vậy, sau lệnh này, a sẽ trỏ vào a1

Lưu ý rằng thực ra phép gán Set là gán tham chiếu/reference, gán địa chỉ. Trỏ biến vào địa chỉ của đối tượng

Vì vậy, nếu code Set đối tượng thì thường khi dùng xong, code sẽ Set nó về Nothing (tức là trỏ nó vào khoảng trống) để tránh tình trạng nó vẫn còn trỏ vào đối tượng ấy.
Tuy nhiên, nếu biến này là biến nội (được khai báo bên trong) của một Sub hay Function thì khi thoát Sub/Function nó sẽ tự giải thoát. Và do điều này, nhiều ngừoi cho rằng lệnh Set Nothing là thừa.
Tôi đã từng có bài so sánh thiệt hơn của hai quan niệm này. Việc bạn theo quan niệm nào là quyền của bạn. Tôi chỉ khuyên rằng đối với những người có thói quen dùng biến toàn cục thì lệnh Set khá nguy hiểm, lúc dùng phải cẩn thận theo dõi phạm vi của nó.

Giải thích về On Error Resume Next:
Trong lập trình, bẫy lỗi là điều quan trọng để bắt những sự kiện ngoài ý muốn.
Cụm từ "bẫy lỗi" là dịch tiếng nghề "error trap". Đó là từ xưa của lập trình. Ngày nay, các ngôn ngữ lập trình gọi nó là "exception handling" - "xử lý sự kiện ngoại lệ"
Khi chương trình bị một lỗi nào đó, ví dụ chia 0, thì tự nó sẽ không biết xử lý như thế nào, và sẽ "chết" (crash). Thực ra, bên trong hệ thống có phần xử lý an toàn, và có cả một quy trình xét ngăn xếp để biết chuyện gì xảy ra. Lệnh On Error dặn VBA đặt điều kiện trước để xử lý khi gặp lỗi. Lệnh Resume có nghĩa là bỏ qua lỗi đi và tiếp tục ở cái chỗ sau từ khoá Resume.
Như vậy On Error Resume Next có nghĩa là nếu gặp lỗi thì kệ nó đi và tiếp tục ở dòng kế tiếp.

Ở diễn đàn này, nhiều ngừoi thích sử dụng On Error Resume Next để trơn tru công việc. Thực ra, trước khi sử dụng nó, ngừoi lập trình phải cân nhắc các điểm sau:
- các lệnh xét lôgic (IF). Next của lệnh này là chỗ nào?
- các lệnh kép (ngăn bởi dấu ":"). Next của chúng lắm khi đưa vào chỗ sai.
- các lệnh gọi sub/function. Như trên, phải nắm vững là sub/function lúc đó đã chạy chưa. Nhất là các sub/function làm việc với biến/đối tượng toàn cục.
- các nơi vòng lặp duyệt. Bỏ qua như vậy là bỏ qua con tính hay bỏ qua một biến vòng lặp? Ví dụ, code lấy dữ liệu từ các files trong một folder. Lúc găp lỗi thì bỏ qua file đó. Như vậy, cuối cùng làm sao biết file nào được xử lý và file nào bị bỏ qua?

Tóm lại, lệnh On Error Resume Next là lệnh nguy hiểm. Toi khong hề nói là không nên dùng. Tôi chỉ nhấn mạnh là nếu dùng thì phải nắm vững cách xử lý các trường hợp tôi nêu trên.

Chú: lệnh On Error GoTo... ít nguy hiểm hơn, nhưng nên lưu ý rằng GoTo là lệnh rẽ nhánh không có kiểm soát. Nếu không cẩn thận thì sẽ dẫn đến tình trạng code rối chỉ (tiếng chính là spaghetti/mì Ý)
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào ndu96081631,SA_DQ,VetMini.

Oanh Thơ (OT) xin cảm ơn những giải thích rất chi tiết của các bạn.
Mặc dù OT tham ra GPE từ lâu nhưng tham gia chỉ hỏi thôi (không học) :(
Thời gian tới OT sẽ cố gắng không chỉ hỏi mà sẽ dành thời gian để tìm hiểu về Excel giao lưu với các bạn trên GPE,hi vọng sẽ nhận được những sự hỗ trợ nhiệt tình của các bạn trên GPE.

Cảm ơn các bạn , cảm ơn diễn đàn.
 
Upvote 0
Nếu trong userform thì làm thế nào vậy các a/c?
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Bạn cần làm gì trong cái UserForm thân thương của bạn?
& đầu câu sao không viết hoa?
Mình thiết kế userform có sẵn textbox để nhập số thứ tự, giờ mình muốn để texbox đó tự động điền số thứ tự vào vì mình ẩn workbook chỉ để hiện form nhập liệu nên không biết được dữ liệu mình nhập vào ở thứ tự bao nhiêu. Mong được các a/c trên forum hướng dẫn. Xin chân thành cảm ơn!
 
Upvote 0
Bạn không nhìn thấy số thứ tự trước đó bạn đã nhập, nhưng máy sẽ nhìn thấy
Thì bảo máy nó cọng thêm 1 vô số TT có sẵn gần nhất phía trên nó
Ví dụ:

Cells(lRw,"A").Value= Cells(lRw-1,"A").Value + 1

Còn STT phát sinh lại theo ngày thì là chuyện khác thêm nữa.
 
Upvote 0
Web KT
Back
Top Bottom