Bài viết: Tổng hợp về phương thức tìm kiếm FIND (P2) (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,902
Được thích
5,303
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Qua phần 1, ta đã hiểu được phần nào về phương thức Find.

Áp dụng vào thực tế thì ta xem tiếp các bài tập sau :

Cũng với dữ liệu này :

OdnU3wrcdKyCpKd5dLAO5gnO-BEfJ7XlV8J4VR9O6igz84IVIDxkHEct74RVlrr5ejPeV9GVXCZjb39W61McLoCOEp-Pun27iIL_9IUxt4mENeis5nAWA8ne3II-xPYUnN8dQPyPk2aW5Gzem8wDMZUj02lDNMBCPHXXAXn8hVON2FjkTQDvzQrjDGCCLKG65Pjgb7hssJel5oLbsM6a3yddsWyq_oakmdr0IsJdyOXGJucSkK0AGsb3SIa6pYc4Uy90bYxklDMSaZqzyC0u362iw-vG2biRG7ls3VbF87qDhj3b841aF0nP0bMlvc7juj-4wXTPWA8E-Yz4lbDbOItFZHph5g99vLkqXiYTM41D5oQW136yK52lyPuUJsmk0DvhKdfEo7iBj0kbp3t_0OMvkTrnA1JjC-y5wvbJSTMa1dpls--BI6Bkf3SqCVoqWuyKlYa_WDPjKk-TKcGzQOZpDvaVKob873nDeGHb5EfolNxgAtIyrErqCi3C1Iyi0cYph4rMiFekQB_T_09yuRscubeJqqIS0jBHRRzoWncSLLygReVo47q65kQEuSnnVUghnBZv6Uxw4IrYjBo8_2Q9GjMdiFUQc1a8TTkOamt9EhX4f7_9=w221-h191-no

Bài tập 1.> Yêu cầu đặt ra là tìm trong vùng A1:A10 những ô nào có chứa số 1 thì copy và dán lần lượt vào cột B. Bài toán này tương tự như việc trích lọc ra danh sách theo điều kiện trích lọc.

Ta xem đoạn code sau :

PHP:
Sub TrichLoc1()
    Dim Rng As Range, LastCell As Range, FirstAddress As String
    Set LastCell = Selection.Cells(Selection.Cells.Count)
    Set Rng = Selection.Find("1*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        R = 1
        Do
            Cells(R, 2) = Rng
            R = R + 1
            Set Rng = Selection.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

Đoạn Code này cũng tương tự như đoạn Code trong thủ tục Test2. Chỉ khác ở chỗ là thay vì sau mỗi lần tìm thấy ô thỏa mãn điều kiện sẽ hiện bảng thông báo địa chỉ của ô đó thì bây giờ sẽ điền giá trị của ô đó vào cột B.
- Nếu biến Rng khác Nothing thì gán cho biến R=1, vào vòng lặp.
- Điền vào ô Cells(1,2) = [B1] giá trị của biến Rng = 1.
- Tăng biến R lên 1 đơn vị R = 1+1 = 2
- Gán biến Rng cho ô tìm được tiếp theo : Rng = [A3]
- Kiểm tra điều kiện lặp, nếu thỏa thì qua trở lại Do
- Điền vào ô Cells(2,2) = [B2] giá trị của biến Rng = 11.
- Tiếp tục cho đến hết và kết quả như sau :

wQu3HmqtU10NKsyWQEG7LNfAipT-P-Z1cFqYGOBCLWYn6zO0tZ0XAqMTQkOlblVhsvKoXV_DANwQkO8Mg4NNAL997z0lLemcJiteefMjO20i_kR5UTX4umNZC0TIucrinY0NqxBloQqjayfRxtJ4PvjX6UE1IgkMgs1Za9WbENDynWBnrvRram_JJSHixVL_w8kgVRVpNvzYvqxProgAUhvzKAqatJ9U2plftt4AlTJGVZhcCRCjiwpJTGOnqQHA3VxgBTexRF7_YYE04Mmj9a4XdR7ZmuY-deJroHygXwNibAElnUKLQvtkPV3VmzD0vfNEXnDxO47jEQo_hk1MwH_HqnifFLTgnNdg-Y6yYoD3a9AfQeT1IYIMGxf-QLqz2_mKczyodH2hP2B4BbonTY4u2Hy58o2wVxc8a8tayUKU4ShmyBCOx1pKI40x_f5XyzUcsOmofJtbSr_u5hlWSbomvYcl2vFIoPxVikCgTRpRHAK0kuUhaOGVf6aHnKdIU4pxi3y9P5q8ptLfLugwWrr4EXRpgFKobPV78vmRs4x0M2QptUikk0W8nMoXcHxW7INwofnW4TCisMOkqEX5T7MbhO_nlVCpfisVK1tQwS_X1_QO8EEO=w222-h194-no



Bài tập 2>. Yêu cầu thứ 2 là tìm trong vùng A1:A10, C1:C5 những ô nào có chứa số 1 thì copy và dán lần lượt vào cột B.

Nếu ta vẫn áp dụng thủ tục trên cho yêu cầu này thì sẽ không chính xác, vì ta sẽ không xác định được ô LastCell.

Ta sẽ tìm hiểu đoạn Code sau :

PHP:
Sub TrichLoc2()
    Dim RngData As Range, Rng As Range, LastCell As Range, FirstAddress As String
    Set RngData = Union(Range("A1:A20"), Range("C1:C5"))
    Set LastCell = Range("C1:C5").Cells(Range("C1:C5").Cells.Count)
    Set Rng = RngData.Find("1*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        R = 1
        Do
            Cells(R, 2) = Rng
            R = R + 1
            Set Rng = RngData.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

- Ở đây, ta sử dụng phương thức Union để ghép các vùng cần trích lọc lại với nhau.
- Tìm ô cuối cùng trong vùng C1:C5 và gán cho biến LastCell : LastCell = [C5].
- Các bước tiếp theo thì tương tự như các Code đã nêu trên
- Tiếp tục cho đến hết và kết quả như sau :

qgYiIYW4MwMvNQotXGpxYNPo-HHHO8vw2Iqr54FtofL1LSgqhS7lIkZVyxzx979ASFNRUflFoB-YU4O6u8PYqbYqhbwZaazV_n5HCEKdHbz-WR1ZZCt1IuCcMvOmHBb_JKstvuKoHxTUOkTrUSMopT416vDvbjKsPyLpup1vi37HgICVkkrKJij0ZqJqWhUX3LAArnr2aSHI4OCeHWXtEq7e-L1tEGc4csVLlEaIQHufd3lgpYFMniG6SdwIKQJ8ciRp7N-QRJ0f5ep7LGG8cq6rG8BD0DwFnQndoBNgMvqiFHtZYTrU4p5v02SyAVYZsEVR3BdQRm5aJhF98zqM4l6BbVBxunf-01zRXo9pyz8JiEKmII8Q9B7E4SKHbJpmN-ijL1zLMDrMhivyn3mmS3Y0xPmwvslVbN2dwJm2M_m1AK0pRvvucUXLnECRsiGzeTafZrf3WoFKwMvSWVbYhimDdKqS3eT4IUIZ0sbM14EI9ePa9y2iMe0Xx-1n4n6h71d0NGvX-sABtAvBGjatmiaaujdJEuw2dQjtoHOJrk_rq9OTiqnaSipu-McKJhBhnKy75Jf5FnVljX2VaOcOHFwTQC9R6kPfvS61Gn9p0ABMTOz736rJ=w222-h194-no

Tiếp theo là giải quyết một nhiệm vụ thực tiển về trích lọc Sổ cái tài khoản từ Sổ Nhật ký chung.

Ta có Dữ liệu mẫu như sau :

oBqTggvt7Dop0LBY0dn9g7Pa6IwlBKVpOOIsLLbJcqat3DoNrK51kr8AjYqArHHOEFm_JeJbpGq_wxCgrNgmo2Xy5hsl-IKB_cLv5s6XaTJBeaH-4zwSHLZWt_QOQ2tQLmrTG1zjPj8f5Q3F9wyS-KO056FT4KpVCxbHMoB1c9eEdLOWWSIPLUjuTFp9BDuJgv5rMJV_MERHfeo6zzDhBJLXdmQ9Oc-OZ-QBQs9GJ7pCfdZt1S9N39JIlcacxpQuS6FPWCKLaSsXt2OPj4LwdkQowtuhIr5SfnFnB1mRu0sXJwAu2yskc9HVeGcqn6W3Cul9N2JBqRSN_KuFL34kEq2og7Gx3TsPzvUI8oU5qqHIHji8Fzbp9x284hc2JFuCHWfuxwccQM7u6PjEb7A1Dl-zoMNQ8bOy7UJSf9F2DTEEHm9vycN3CkzSXEcAr6BtgsJ57_9mDHrR3mcvplT0ycDXRCZK0BDy7T9PlDncT_RuQeytgTC8GerH3zG7QkfSvNv6zafp572Y5VLUx2VMAkEVyNC1w3SZd-Sbj_3gNfzjsh2pr4AirikYC1JPu9Hy3l_cGRlSIkc-Yqpetq-Vl-fQdTIyxpL0zcmZ-AbPJkOotT4Xs4Wd=w623-h223-no


Vùng A1:D11 là dữ liệu của Sổ NKC
Vùng F1:I11 là kết quả trích lọc TK 111 từ sổ NCK ( Sổ cái TK 111)
Ta xét Macro sau :

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)
        Set Rng = .Find("111*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
        FirstAddress = Rng.Address
        If Not Rng Is Nothing Then
            R = 2
            Do
                SaveRow = Rng.Row
                Select Case Rng.Column
                Case 2
                    Cells(R, 6) = Rng.Offset(, -1)
                    Cells(R, 7) = Rng.Offset(, 1)
                    Cells(R, 8) = Rng.Offset(, 2)
                Case 3
                    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)
            Loop While FirstAddress <> Rng.Address And SaveRow <> Rng.Row
        End If
    End With
    Set LastCell = Nothing: Set Rng = Nothing
    Application.ScreenUpdating = True
End Sub

So với cách trích lọc dùng For Next thông thường thì Code này vượt trội hơn về tốc độ. Phù hợp với những cơ sở dữ liệu lớn.
Ta có thể kết hợp với thuộc tính End để làm cho dữ liệu tạo sự linh động cho dữ liệu gốc.

Trên đây là nội dung sơ lược về phương thức Find. Chúng ta sẽ cùng tìm hiểu sâu hơn về phương thức này trong các bài tiếp theo.


Một số bài viết có liên quan:
1/
Tổng hợp về phương thức tìm kiếm FIND (P1)
2/ Hướng dẫn sử dụng Ribbon trong Excel 2007 (2010)
3/ Dò tìm nâng cao với hàm VlookupD
4/ Tặng mọi người Addins thao tác và chỉnh sửa Code trong VBA viết bằng VBA và mã mở!
5/ SAP Scripting - Excel và SAP (P2)
6/ Hàm tự tạo ToTable - Chuyển dữ liệu thành dạng bảng
7/ Bạn đang ở quý mấy trong năm?
8/ Thuộc tính End() trong Excel - giới thiệu tổng quan (P1)
9/ Làm nhãn vở học sinh trên Excel
10/ Tặng hàm Calculate tính giá trị theo nội dung diễn giải
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Vế fương thức FIND() còn có vài điều thú vị như
Tìm số liệu về ngày tháng
& tìm dữ liệu trong các ô bị trộn theo hàng hay theo cột.

Rất mong HoangDanh sẽ tiếp tục loạt bài như vậy!
 
Web KT

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

Back
Top Bottom