Giúp tìm chỗ sai trong phương thức Find

Liên hệ QC

Hong.Van

Busy
Tham gia
7/5/12
Bài viết
2,330
Được thích
1,763
Em muốn tìm các mã mà có giá trị đầu tiên (tính từ trên xuống)
Code của em
Mã:
Sub TimTenMaTK()
    Dim i As Long
    Dim KqArr, Ma
    Dim K As Range, Khoi As Range
    '1. Côòt muôìn doÌ
    With ActiveSheet
        Ma = .Range(.[A2], .[A65536].End(3)).Value    ' maÞ doÌ
    End With
    '2. DoÌ õÒ côòt
    With Sheets("MA")
        Set K = .Range(.[I12], .[I500].End(3))    ' khôìi maÞ doÌ ðêÒ tiÌm
         'Set K = .Range(.[I11], .[I500].End(3))    ' khôìi maÞ doÌ ðêÒ tiÌm
    End With
    '3. Redim Khôìi kêìt quaÒ vaÌ tiÌm
    ReDim KqArr(1 To UBound(Ma, 1), 1 To 3)
    For i = 1 To UBound(Ma, 1)
        Set Khoi = K.Find(Ma(i, 1), , xlValues, xlWhole)    ' bãìt ðâÌu tiÌm
        If Not Khoi Is Nothing Then
            If Ma(i, 1) <> "" Then
               
                KqArr(i, 1) = K.Find(Ma(i, 1), , xlValues, xlWhole).Offset(, 1)
                KqArr(i, 2) = K.Find(Ma(i, 1), , xlValues, xlWhole).Offset(, 2)
               
            End If
        End If
    Next i
    '4. gaìn kêìt quaÒ
    ActiveSheet.Range("B2").Resize(UBound(KqArr), 3).Value = KqArr
End Sub
Code trên tạm tìm đúng số theo yêu cầu
Nhưng bây giờ em thí nghiệm như sau
Tại sheet Ma, cell I16 và J16 em thêm lần lượt là 1111 và giá trị là 123
sau khi chạy code lại thì kết quả ở sheet TK bị thay đổi
cụ thể mã 1111 nó thay số 1.000.000 thành số 123
Nếu thêm mã và giá trị của những thằng khác thì không bị ảnh hưởng!?
Nếu code trên sửa dòng
Mã:
Set K = .Range(.[I12], .[I500].End(3))
Thành
Mã:
Set K = .Range(.[I11], .[I500].End(3))
Thì hết lỗi, cho em hỏi tại sao? em cảm ơn!
 

File đính kèm

  • Bai_Find_Hoi.xlsm
    31.2 KB · Đọc: 13
Bạn xem hình:
1569590660124.png

Bạn đang bỏ trống tham số After, và excel sẽ lấy mặc định After ô đầu tiên của range K, ô đầu tiên bị bỏ qua và chỉ tìm after nó mà thôi
Bạn sẽ hỏi câu kế tiếp là: nếu bỏ qua thì sao khi chưa có I16 vẫn tìm thấy? Là vì nó bỏ qua ở bước đầu tiên nhưng lại nhét nó vào bước cuối: Nó sẽ tìm từ 13 đến 15, quay lại 12 rồi mới ngưng.
Nếu I12 là "222" và bên dưới có năm bảy ô "1111" thì vẫn tìm đúng "1111" đầu tiên vì ô bị bỏ qua là "222"

Khi bạn sửa tìm trong I11 đến I cuối thì ô bị bỏ qua là I11 và không xảy ra lỗi nói trên
 
Upvote 0
Với code của bạn thì Find sẽ tìm từ I13 chứ không từ I12. Khi nó tìm tới cuối mà không thấy thì nó mới tìm trong I12.
Ngoàui ra tôi không hiểu sao bạn dùng 2 Find. Sau khi tìm được Khoi rồi thì dịch sang phải để đọc kết quả thôi.
Thay toàn bộ từ Redim tới hết bằng
Mã:
ReDim KqArr(1 To UBound(Ma, 1), 1 To 2)
For i = 1 To UBound(Ma, 1)
    If Ma(i, 1) <> "" Then
        Set Khoi = K.Find(Ma(i, 1), K(K.Count), xlValues, xlWhole)    ' băět đâĚu tiĚm
        If Not Khoi Is Nothing Then
            KqArr(i, 1) = Khoi.Offset(, 1)
            KqArr(i, 2) = Khoi.Offset(, 2)
        End If
    End If
Next i
ActiveSheet.Range("B2").Resize(UBound(KqArr), 2).Value = KqArr
Với code trên thì Find bắt đầu tìm từ ô sau ô cuối cùng, tức là tìm từ I12 (tính theo "vòng tròn" - sau cuối là đầu)
Ngoài ra KqArr có 2 cột là đủ.
 
Upvote 0
Hình như bạn có vấn đề với phương thức FIND() thì phải!
Mà bạn tự làm khó mình & khó cho người khác vì tên các tham biến không gợi nhớ nếu không muốn nói là tùy tiện
Hai dòng lệnh này:
Mã:
  KqArr(i, 1) = K.Find(Ma(i, 1), , xlValues, xlWhole).Offset(, 1)
  KqArr(i, 2) = K.Find(Ma(i, 1), , xlValues, xlWhole).Offset(, 2)
Sẽ giúp bạn giải quyết vấn đề gì vậy?
Bạn thử chúng cho bạn những kết quả gì?
 
Lần chỉnh sửa cuối:
Upvote 0
Và để hiểu sâu hơn thì:
Ở trường hợp này Khoi sẽ nhận một Cells đơn lẻ từ Phương thức Find nên không cần sử dụng Offset
Tức là:
Khoi = Khoi(1, 1)
Khoi(1, 2) = Khoi.Offset(0, 1)

Range("A1")(1, 2) = Range("A1").Offset(0, 1)
Range("A1")(1, 2) = [A1].Offset(0, 1)


Offset được sử dụng khi:
1. Có Phương thức khác nằm sau Range Object:
Range("A1").End(xlUp).Offset(1, 1)
2. Range được tạo từ cặp dấu ngoặc Vuông
[A1].Offset(0, 1)
3. Range nằm trong một Block With
With Range("A1")
.Offset(, 1)
End With
4. Khi thay đổi vị trí mà không thay đổi vùng Range trước đó:
Range("A1:C1").Offset(0, 2) = Range("C1:E1")
 
Upvote 0
Hình như bạn có vấn đề với phương thức FIND() thì phải!
Mà bạn tự làm khó mình & khó cho người khác vì tên các tham biến không gợi nhớ nếu không muốn nói là tùy tiện
Hai dòng lệnh này:
Mã:
  KqArr(i, 1) = K.Find(Ma(i, 1), , xlValues, xlWhole).Offset(, 1)
  KqArr(i, 2) = K.Find(Ma(i, 1), , xlValues, xlWhole).Offset(, 2)
Sẽ giúp bạn giải quyết vấn đề gì vậy?
Bạn thử chúng cho bạn những kết quả gì?
Do File và code thấy trên diễn đàn, vả lại em cũng chưa rành về phương thức này
 
Upvote 0
Web KT
Back
Top Bottom