Chưa hiểu Rng.row là gì, nhờ được giải thích

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
PHP:
Sub TrichLocSocai()
 Dim Rng As Range, LastCell As Range
 Dim FirstAddress As String, R As Long, SaveRow As Long
 Application.ScreenUpdating = False
 With Range("B2:C11")
    Set LastCell = .Cells(.Cells.Count)
1    Set Rng = .Find("111*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        R = 2
        Do
2             SaveRow = Rng.Row
             Select Case Rng.Column
             Case 2
3                   Cells(R, 6) = Rng.Offset(, -1)
                   Cells(R, 7) = Rng.Offset(, 1)
                   Cells(R, 8) = Rng.Offset(, 2)
             Case 3
4                   Cells(R, 6) = Rng.Offset(, -2)
                   Cells(R, 7) = Rng.Offset(, -1)
                   Cells(R, 9) = Rng.Offset(, 1)
             End Select
             R = R + 1
             Set Rng = .FindNext(Rng)
5        Loop While FirstAddress <> Rng.Address And SaveRow <> Rng.Row '<==|'
    End If
 End With
Set LastCell = Nothing: Set Rng = Nothing
Application.ScreenUpdating = True
           End Sub

Em đang đọc lại phương thức Find thì có đoạn bôi đỏ trên em chưa hiểu
SaveRow <> Rng.Row
Em thử test Rng.row thì thấy msg box luôn báo là 1. Em nghĩ trong phương thức Find trên chỉ cần FirstAddress <> Rng.Address là đủ chứ ạh?
Mục đích mình cho thêm SaveRow <> Rng.Row là để làm gì?
Em còn dốt quá xin chỉ bảo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em đang đọc lại phương thức Find thì có đoạn bôi đỏ trên em chưa hiểu
SaveRow <> Rng.Row
Em thử test Rng.row thì thấy msg box luôn báo là 1. Em nghĩ trong phương thức Find trên chỉ cần FirstAddress <> Rng.Address là đủ chứ ạh?
Mục đích mình cho thêm SaveRow <> Rng.Row là để làm gì?
Theo câu lệnh 1, chúng ta phải tìm trong vùng 'B2:C11' những ô nào chứng từ '111*'
Để tìm tất thảy các ô thỏa, người ta dùng vòng lặp Do . . . Loop phía bên dưới
Tiếp đến, để thoát vòng lặp này, người ta dùng 2 điều kiện;
(*) Điều kiện thứ thứ là địa chỉ ô thỏa đang tìm thấy (& là ô cuối được tìm thấy) này phải khác với địa chỉ ô đầu tiên thỏa điều kiện ('111*') của vùng được tìm thấy;
(**) Trong vòng lặp Do. . .Loop, biến SaveRow sẽ lưu giữ dòng của ô đầu tiên trong hàng thỏa điều kiện được tìm thấy;
Tất nhiên đây sẽ khác với chỉ số dòng của Rng được tìm thấy đầu tiên
Để thấy sự thay đổi của biến này, bạn nên dùng câu lệnh
MsgBox SaveRow
ngay trước câu Set Rng = .FindNext(Rng) xem sao?!

Trong macro trên, mình còn đề xuất vấn đề cần giao hoán giữa 2 câu lệnh sau câu lệnh được đánh số 1 nêu trên;
Có vậy mới đúng theo logic của vấn đề, là:
Tìm đã thấy Rng thì mới gán địa chỉ nó vô biến FirstAddress được;
Trường hợp nếu không tìm thấy thì dễ đi đến lỗi to là đằng khác!

Còn viết như trên thì gượm gạo & ép uổng giống như:

Hãy ra chợ tìm cô gái
Dắt cô ta về nhà
Nếu cô ta đồng í làm vơ, thì tổ chức cưới

Lỡ ra chợ toàn các lão ông lão bà thì có mà . . . .!
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Anh SA_DQ nhiều, em hiểu ý nghĩa của Saverow trên rồi, muc đích của nó là tránh lọc lại một saverow đã lưu.
Ngoài cái lỗi "ra chợ toàn ông lão bà lão ra" nếu một bút toán là nợ 111a, một bút toán có là 111b thì (ví dụ cùng save row =2, nợ cột B, có cột C)
biến saverow sẽ làm sub thoát và ko lọc hết các tài khoản thỏa mãn 111 ở phía dưới dưới

Cám ơn Anh nhiều
 
Upvote 0
Web KT

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

Back
Top Bottom