Tìm kiếm phần tử chung của nhiều mảng

Liên hệ QC

thungdols

Thành viên chính thức
Tham gia
27/3/09
Bài viết
66
Được thích
2
Em có một bài toán nhờ các anh chị trên GPE giúp đỡ:
Bài toán là:
Em có 3 mảng trong cùng 1 sheet. Mỗi mảng có 3 dòng và 10 cột.
Hãy dùng câu lệnh VBA để tìm kiếm phần tử cùng xuất hiện cả trong 3 mảng . Rồi điền vào dòng 15.
Em xin chân thành cám ơn toàn thể anh chị GPE. Chúc các anh,chị luôn hạnh phúc}}}}}}}}}}}}}}}
 

File đính kèm

Em có một bài toán nhờ các anh chị trên GPE giúp đỡ:
Bài toán là:
Em có 3 mảng trong cùng 1 sheet. Mỗi mảng có 3 dòng và 10 cột.
Hãy dùng câu lệnh VBA để tìm kiếm phần tử cùng xuất hiện cả trong 3 mảng . Rồi điền vào dòng 15.
Em xin chân thành cám ơn toàn thể anh chị GPE. Chúc các anh,chị luôn hạnh phúc}}}}}}}}}}}}}}}
Bạn thử dùng công thức mảng thử xem:
Mã:
=TEXT(CHOOSE(SMALL(--$C$2:$L$4,ROW($1:$30)),SMALL(IF(ISERROR(MATCH(SMALL(--$C$2:$L$4,ROW($1:$30)),SMALL(--$C$4:$L$6,ROW($1:$30)),0)*MATCH(SMALL(--$C$2:$L$4,ROW($1:$30)),SMALL(--$C$7:$L$9,ROW($1:$30)),0)),"",ROW($1:$30)),1)),"00")
 
Upvote 0
cám ơn anh đã chỉ dạy. nhưng em muốn có một macro viết về cái này có được không anh. Cám ơn anh trứơc nha.
 
Upvote 0
cám ơn anh đã chỉ dạy. nhưng em muốn có một macro viết về cái này có được không anh. Cám ơn anh trứơc nha.
Nếu bạn muốn Macro thì đây. Dạng UDF nhé.
PHP:
Function GiongNhau(ParamArray Args() As Variant) As String
Dim i As Long, Cll As Range
For Each Cll In Args(0)
    For i = 1 To UBound(Args)
        If Args(i).Find(What:=Cll.Value, LookAt:=xlWhole) Is Nothing Then
            GoTo NextCll
        End If
    Next
    GiongNhau = Cll.Value
NextCll:
Next
End Function
 

File đính kèm

Upvote 0
cám ơn anh. Nhưng em cảm thấy hàm người dùng này không ổn lắm nhờ bác xem xét lại giùm em. Ví dụ của em ở đây mới chỉ là 3 mảng và mảng lại chỉ có 30 phần tử. Nếu em có 30 mảng thì em viết chắc....Bác giúp giùm em nha. Em chân thành cám ơn bác
 
Lần chỉnh sửa cuối:
Upvote 0
cám ơn anh. Nhưng em cảm thấy hàm người dùng này không ổn lắm nhờ bác xem xét lại giùm em. Ví dụ của em ở đây mới chỉ là 3 mảng và mảng lại chỉ có 30 phần tử. Nếu em có 30 mảng thì em viết chắc....Bác giúp giùm em nha. Em chân thành cám ơn bác
Bạn thấy không ổn chỗ nào. 30 mảng thì cũng vậy thôi chứ có gì khác nhau đâu.
 
Upvote 0
ý em nói ở đây là có điều kiện phụ để tìm ra mảng. Sau đó đem các mảng ra so sánh với nhau để tìm ra phần tử chung. Nhưng nếu mà làm theo Function mà anh viết cho em thì em lại phải dò bằng tay sau đó viết từng mảng vào 1 viết đền khoảng 100 cái thì chảng thể nhìn nỏi mình viết đến cái nào nữa hoa hết cả mắt lên rồi -+*/-+*/. Hì hì mong anh tha lỗi cho em vì em đã không biết viết rõ ràng. Xin anh đừng giận và giúp đỡ em nha. Chân thành cám ơn anh}}}}}
 
Upvote 0
ý em nói ở đây là có điều kiện phụ để tìm ra mảng. Sau đó đem các mảng ra so sánh với nhau để tìm ra phần tử chung. Nhưng nếu mà làm theo Function mà anh viết cho em thì em lại phải dò bằng tay sau đó viết từng mảng vào 1 viết đền khoảng 100 cái thì chảng thể nhìn nỏi mình viết đến cái nào nữa hoa hết cả mắt lên rồi -+*/-+*/. Hì hì mong anh tha lỗi cho em vì em đã không biết viết rõ ràng. Xin anh đừng giận và giúp đỡ em nha. Chân thành cám ơn anh}}}}}
Vậy bạn phải giải thích lại rõ ràng một chút. Đầu tiên bạn có những gì, từ những cái đã có đó làm thế nào để tìm ra được các mảng cần so sánh.
 
Upvote 0
em đã gửi lại file rồi đó. Chân thành mong anh giúp đỡ. Cám ơn anh nhiều lắm
 
Upvote 0
Bạn tải file về chạy thử.
PHP:
Sub GPE()
Dim Cll As Range, Arr, i As Long
Set Cll = [B:B].Find("T", [B1], xlValues, 2)
If Cll Is Nothing Then Exit Sub
[O1:IV1].ClearContents
With CreateObject("Scripting.Dictionary")
Do
    Set Cll = [B:B].FindNext(Cll)
    If Not .Exists(Cll.Address) Then
        .Add Cll.Address, ""
    Else
        Exit Do
    End If
Loop
Arr = .Keys
End With
For Each Cll In Range(Arr(0)).Offset(, 1).Resize(3, 10)
    For i = 1 To UBound(Arr)
        If Range(Arr(i)).Offset(, 1).Resize(3, 10).Find(What:=Cll.Value, LookAt:=xlWhole) Is Nothing Then
            GoTo NextCll
        End If
    Next
    [IV1].End(xlToLeft).Offset(, 1).Value = Cll.Value
NextCll:
Next
End Sub
 

File đính kèm

Upvote 0
Code chạy rất ngon. Cám ơn anh rất nnhiều. Ah! anh có thể giải thích từng câu lệnh giùm em được không. Em dốt quá. Mong anh thông cảm
 
Upvote 0
Code chạy rất ngon. Cám ơn anh rất nnhiều. Ah! anh có thể giải thích từng câu lệnh giùm em được không. Em dốt quá. Mong anh thông cảm
"Ngon" là tốt rồi!
Giờ mà kêu giải thích từng câu lệnh chắc anh Thắng... đói luôn quá
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
Bác giải thích giùm em nốt nha huhu tại em ngu quá+-+-+-++-+-+-++-+-+-+



Bạn tải file về chạy thử.
PHP:
Sub GPE()
Dim Cll As Range, Arr, i As Long '==>> khai báo biến
Set Cll = [B:B].Find("T", [B1], xlValues, 2) '==>> tìm kiếm tại cột B (Tim chữ "T", bắt đầu từ ô B1, tìm giá trị, số 2 không hiểu nghĩa là thế nào nữa??)
If Cll Is Nothing Then Exit Sub ==>> nếu không tìm thấy giá trị thì thoát khỏi Sub
[O1:IV1].ClearContents ==>> Xoá từ ô [O1] đến ô [IV1]
With CreateObject("Scripting.Dictionary") '==>>tạo đối tượng gì gì đó cũng không hiểu 
Do
    Set Cll = [B:B].FindNext(Cll) '==>> làm việc với công thức tìm kiếm tại cột B
    If Not .Exists(Cll.Address) Then '==>>không hiểu 
        .Add Cll.Address, ""  '==>> không hiểu 
    Else
        Exit Do
    End If
Loop
Arr = .Keys ==>> không hiểu
End With
For Each Cll In Range(Arr(0)).Offset(, 1).Resize(3, 10) '==>> không hiểu tại sao luôn huhu
    For i = 1 To UBound(Arr)
        If Range(Arr(i)).Offset(, 1).Resize(3, 10).Find(What:=Cll.Value, LookAt:=xlWhole) Is Nothing Then
            GoTo NextCll
        End If
    Next
    [IV1].End(xlToLeft).Offset(, 1).Value = Cll.Value ==>> nhập giá trị tìm được
NextCll:
Next
End Sub
 
Upvote 0
Thôi em post luôn cái phần mở rộng của tìm phần tử trùng trong mảng ra. Để anh chị giúp đỡ chứ em thì pó tay chịu trói rối tại em dốt nát quá+-+-+-++-+-+-++-+-+-++-+-+-+. Mong các anh chị hồi âm sớm. Em chân thành cám ơn}}}}}}}}}}}}}}}

em chỉ làm đựơc đến như này thôi hic phàn còn lại em không biết viêt thế nào nữa.

Sub TimPT()
Dim dc, dl As Worksheet, Rng As Range, sRng As Range
Dim Col As Byte, j As Byte, i As Byte, rc As Integer
Dim StrC As String

Set dl = Sheets("du lieu"): rc = dl.[C2].CurrentRegion.Rows.Count
Col = dl.[C2].CurrentRegion.Columns.Count
Set dc = Sheets("doi chieu")

Sheets("doi chieu").Select

For i = 1 To 27
For j = 1 To rc
Set Rng = dl.Cells(j + 1, 3).Resize(, Col)
StrC = dc.Cells(2, i + 2)
Set sRng = Rng.Find(StrC, , xlValues, xlPart)
If Not sRng Is Nothing Then
Dim Rng0 As Range, sRng0 As Range, StrC0 As String
Set Rng0 = dl.Cells(j + 2, 3).Resize(, Col)
StrC0 = dc.Cells(3, i + 2)
Set sRng0 = Rng0.Find(StrC0, , xlValues, xlPart)
If sRng0 Is Nothing Then
' tiep theo la so sanh cac mang voi nhau thi em chiu

Cells(1, i) = 1 + i
Cells(j, 1) = 1 + j

End If

Next j
Next i
dc.Select
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn đi thẳng vào vấn đề ngay từ đầu có phải là đỡ cực hơn không. Đi lòng vòng chi cho mất thời gian.
Tôi đọc phần giải thích trong file của bạn rồi nhưng vẫn không hiểu. Bạn có thể giải thích lại rõ ràng một chút được không.
Quan trọng nhất: Hai vùng màu vàng được xác định như thế nào?
 
Upvote 0
2 vùng mầu vàng là hai mảng tìm được sau khi đã đạt đủ điều kiện (mảng tìm được ở đây chỉ có 3 dòng và 27 cột) . của bảng đối chiếu. Sau đó đem 2 vùng màu vàng so sánh với nhâu để tìm được phần tử trùng. Em cám ơn anh nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
2 vùng mầu vàng là hai mảng tìm được sau khi đã đạt đủ điều kiện (mảng tìm được ở đây chỉ có 3 dòng và 27 cột) . của bảng đối chiếu. Sau đó đem 2 vùng màu vàng so sánh với nhâu để tìm được phần tử trùng. Em cám ơn anh nhiều
Biết thế nhưng điều kiện đó nó như thế nào bạn ơi. Bạn nên giải thích rõ cách xác định những vùng đó.
 
Upvote 0
Biết thế nhưng điều kiện đó nó như thế nào bạn ơi. Bạn nên giải thích rõ cách xác định những vùng đó.

Chạy lần lượt từ các phàn tử (ví dụ phần tử cells(2,i))tại dòng 1 bảng đối chiếu xem có phần tử nào trùng trong bảng dữ liệu hay không (tìm thấy tại dòng n chẳng hạn). Nếu có thì ta lấy (tiếp theo lấy cells(3,i) cùng cột đó nhưng ở dòng 2 của bảng đối chiếu so sánh với dòng tiếp theo của bảng dữ liệu (đem so sánh với dòng n 1). nếu có phần tử đó thì tìm ra mảng màu vàng. (có từ dòng n 2 đến n 5)
Híc em không biết cách ăn nói. Cách giải thích của em thì rối rắm. Mong anh thong cảm
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy lần lượt từ các phàn tử (ví dụ phần tử cells(2,i))tại dòng 1 bảng đối chiếu xem có phần tử nào trùng trong bảng dữ liệu hay không (tìm thấy tại dòng n chẳng hạn). Nếu có thì ta lấy (tiếp theo lấy cells(3,i) cùng cột đó nhưng ở dòng 2 của bảng đối chiếu so sánh với dòng tiếp theo của bảng dữ liệu (đem so sánh với dòng n+1). nếu có phần tử đó thì tìm ra mảng màu vàng. (có từ dòng n+2 đến n+5)
Híc em không biết cách ăn nói. Cách giải thích của em thì rối rắm. Mong anh thong cảm
1. Khi tìm thấy một phần tử trong dòng 1 bảng đối chiếu xuất hiện trong dữ liệu thì có tiếp tục tìm các phần tử khác hay không?
2. Bảng đối chiếu của bạn chỉ có 2 dòng hay có thể nhiều hơn?
 
Upvote 0
Web KT

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

Back
Top Bottom