Giúp mình Tìm kiếm dữ liệu trong mảng (4 người xem)

Liên hệ QC

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

sanzin111085

Thành viên mới
Tham gia
16/11/10
Bài viết
25
Được thích
0
Mình có một bảng quản lý file lưu hồ sơ hải quan, trong đó có số TK trong mảng B3:U28, và Số TT của tập HSHQ là cột A. Mình có 2 cột W và X là bài tập cần làm: Trong đó cột W có số TK và mình không tìm ra hàm nào để điền số TT của HSHQ vào cột X, các bạn giúp mình với nhé.
Mình có file đính kèm. Cám ơn các bạn.
 

File đính kèm

Em đang tập tành học VBA, bài này em xin đề xuất dùng VBA nhưng kiến thức VBA của em còn non quá, tiện giúp bạn này và mạnh dạn nhờ các thầy cùng các anh sửa code giúp!
Em xin cảm ơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Cám ơn bạn nhé! Như này cũng là quá tốt rồi.
 
Em đang tập tành học VBA, bài này em xin đề xuất dùng VBA nhưng kiến thức VBA của em còn non quá, tiện giúp bạn này và mạnh dạn nhờ các thầy cùng các anh sửa code giúp!
Em xin cảm ơn!
Dùng Find Method sẽ ngắn hơn
PHP:
Sub Chon()
  Dim Clls As Range, fRng As Range
  On Error Resume Next
  With Sheet1.Range("B3:U28")
    For Each Clls In .Parent.Range("W2:W15")
      Set fRng = .Find(Clls.Value, , xlValues, xlWhole)
      If Not fRng Is Nothing Then Clls.Offset(, 1) = Intersect(fRng.EntireRow, .Parent.Range("A:A"))
    Next
  End With
End Sub
- Duyệt qua từng Clls trong vùng W2:W15
- Nếu tìm thấy giá trị của Clls trong vùng B3:U28 thì lấy giao điểm của đường băng ngang qua Clls với cột A
Thế thôi
--------------------------------
Hoan nghênh hoamattroicoi bắt đầu dấn thân vào "con đường đâu khổ" ---> CỐ LÊN
 
Thời gian sẽ giảm khoảng 5 lần, nếu vầy

PHP:
Option Explicit
Sub chon()
Dim Cls As Range, Rng As Range, Timer_ As Double

Set Rng = [b2].CurrentRegion.Offset(2)
Timer_ = Timer
For Each Cls In Range([w2], [w2].End(xlDown))
   On Error Resume Next
   Cls.Offset(, 1).Value = Cells(Rng.Find(Cls.Value, , xlFormulas, xlWhole).Row, "A")
Next Cls
[Y65432].End(xlUp).Offset(1).Value = Timer - Timer_
End Sub
 
Lần chỉnh sửa cuối:
Với bài này dùng phương thức Find có vẻ ngon hơn là rà lần lượt. Bạn thử thay code này vào và so sánh thử xem sao
Dữ liệu quá ít không lấy gì so sánh tốc độ nhưng trực quan là gọn hơn và chủ quan là nhanh hơn
(Gửi bài mới thấy bài của Bác ChanhTQ và Ndu, không ngờ lại đồng quan điểm. Đúng là mọi đường đều dẫn đến Roma thật)

Mã:
Sub chon()
Dim Cl As Range, Rg1 As Range, Rg2 As Range, i
With Sheet1
Set Rg1 = .Range(.[W2], .[W3].End(4))
Set Rg2 = .Range(.[B3], .[B3].End(4)).Resize(, 20)
For i = 1 To Rg1.Count
Set Cl = Rg2.Find(Rg1(i))
Rg1(i).Offset(, 1) = .Cells(Cl.Row, "A")
Next
End With
End Sub
 
Lần chỉnh sửa cuối:
(Gửi bài mới thấy bài của Bác ChanhTQ và Ndu, không ngờ lại đồng quan điểm. Đúng là mọi đường đều dẫn đến Roma thật)
Làm chơi thôi chứ em dám cá với anh rằng Find cũng không nhanh bằng Array (nó thuộc dạng vô đich)
Có điều dữ liệu chẳng bao nhiêu, dùng Find viết code cho nó ngắn gọn thôi
Ẹc... Ẹc...
 
Các giải pháp VBA hay thật - trông vào toàn thấy nhiều từ lạ quá (các bác giải thích cách dùng cụ thể đi ah?, thanks)

Nếu bạn không sẵn sàng VBA thì hãy thử công thức sau cho cell X2:
PHP:
=INDEX($A$3:$A$28,MAX(INDEX(ROW($1:$26)*COUNTIF(W2,$B$3:$U$28),0)))
sau đó copy cho các ô X3,X4,... vvv

Chỉ ít giây là xong và luôn động với số liệu như công thức đơn giản của excel
 
Lần chỉnh sửa cuối:
Cao thủ hàm exel!!
Sao mình nghĩ mãi mà ko ra nhỉ. Thanks bạn.
 
Em đang tập tành học VBA, bài này em xin đề xuất dùng VBA nhưng kiến thức VBA của em còn non quá, tiện giúp bạn này và mạnh dạn nhờ các thầy cùng các anh sửa code giúp!
Em xin cảm ơn!

Nhân bài của HMTC em thử mạng phép dùng Array coi sao
Mã:
Sub test()
Dim sarr, farr, i, j, k, h, arr(1 To 100, 1 To 1)
farr = Range("w2:w15")
sarr = Range("a3:u28")
For i = 1 To UBound(farr, 1)
    For k = 2 To UBound(sarr, 2)
        For j = 1 To UBound(sarr, 1)
            If farr(i, 1) = sarr(j, k) Then
            h = h + 1
            arr(h, 1) = sarr(j, 1)
            End If
        Next
    Next
Next
Range("v2").Resize(h).Value = arr
End Sub
 

File đính kèm

Nhân bài của HMTC em thử mạng phép dùng Array coi sao
Mã:
Sub test()
Dim sarr, farr, i, j, k, h, arr(1 To 100, 1 To 1)
farr = Range("w2:w15")
sarr = Range("a3:u28")
For i = 1 To UBound(farr, 1)
    For k = 2 To UBound(sarr, 2)
        For j = 1 To UBound(sarr, 1)
            If farr(i, 1) = sarr(j, k) Then
            h = h + 1
            arr(h, 1) = sarr(j, 1)
            End If
        Next
    Next
Next
Range("v2").Resize(h).Value = arr
End Sub
Trường hợp 1 giá trị tìm được 2 lần thì tính sao? Thử gõ thêm số 3 nữa vào đâu đó trong vùng A3:U28 rồi chạy code xem
Tôi sửa code lại thế này:
PHP:
Sub test()
  Dim sarr, farr, arr(), lR As Long, lC As Long, n As Long
  farr = Sheet1.Range("W2:W15").Value
  sarr = Sheet1.Range("A3:U28").Value
  ReDim arr(1 To UBound(farr, 1), 1 To 1)
  For n = 1 To UBound(farr, 1)
    For lR = 1 To UBound(sarr, 1)
      For lC = 2 To UBound(sarr, 2)
        If farr(n, 1) = sarr(lR, lC) Then arr(n, 1) = sarr(lR, 1)
      Next
    Next
  Next
  Range("v2").Resize(UBound(arr, 1)).Value = arr
End Sub
Chú ý: Thà không khai báo biến, còn nếu đã khai báo thì nên rõ ràng chút
 
Trường hợp 1 giá trị tìm được 2 lần thì tính sao? Thử gõ thêm số 3 nữa vào đâu đó trong vùng A3:U28 rồi chạy code xem
Tôi sửa code lại thế này:

Vì mỗi tờ khai nó chỉ ở 1 cặp hồ sơ, vậy thì khi đã thấy thì thôi đi tìm thằng khác, lòng vòng chi thêm nữa.Theo mình thì nên như sau hợp lý hơn


If farr(n, 1) = sarr(lR, lC) Then arr(n, 1) = sarr(lR, 1) : Exit For
 
Vì mỗi tờ khai nó chỉ ở 1 cặp hồ sơ, vậy thì khi đã thấy thì thôi đi tìm thằng khác, lòng vòng chi thêm nữa.Theo mình thì nên như sau hợp lý hơn


If farr(n, 1) = sarr(lR, lC) Then arr(n, 1) = sarr(lR, 1) : Exit For
Cái đó còn tùy... Code của em là tìm cái cuối cùng
Tuy nhiên, nếu muốn tìm thấy thì ngưng ngay cũng không Exit For thế được anh à (3 vòng lập cơ mà) ---> Ít ra phải Goto gì gì đó mới xong... mục đích phải thoát bằng được 2 vòng lập bên trong và đi tiếp vòng lập đầu tiên
 
Web KT

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

Back
Top Bottom