Xin Code VBA tìm và đếm số lần xuất hiện của 1 mảng nhỏ trong 1 mảng khác lớn hơn.

Liên hệ QC

hldh

Thành viên mới
Tham gia
22/1/13
Bài viết
7
Được thích
0
Mày mò hoài không được, mong các Anh Chị & các bạn giúp đỡ.
 

File đính kèm

  • NhoGPEGiaiDap.xlsx
    44.2 KB · Đọc: 65
Mày mò hoài không được, mong các Anh Chị & các bạn giúp đỡ.

Mã:
Dim CotCuoi As Long
Dim DemTrung As Long
Dim SoCot As Long


DemTrung = 0
DongCuoi = Sheet1.Range("A60000").End(xlUp).Row
CotCuoi = Sheet1.Range("A2").End(xlToRight).Column
Arr01 = Sheet1.Range("LK2:LS" & DongCuoi)
SoCot = UBound(Arr01, 2)
For i = 1 To CotCuoi - 8
 Arr02 = Sheet1.Range(Sheet1.Cells(2, i), Sheet1.Cells(DongCuoi, i + 8))
 If Sokhop(Arr01, Arr02, DongCuoi, SoCot) Then
    DemTrung = DemTrung + 1
 End If
Next
MsgBox "co tong cong " & DemTrung & "trung"
End Sub
Function Sokhop(Arr01, Arr02, DongCuoi, SoCot)
    Dim i As Long
    Dim j As Long
        For i = 1 To DongCuoi - 1
            For j = 1 To SoCot
              If (Arr01(i, j) <> Arr02(i, j)) Then
                  Sokhop = False
                  Exit Function
              End If
            Next j
         Next i
         Sokhop = True
End Function
với dữ liệu như trên thì thử tạm code này xem sao? cả 2 thằng điều dùng chung dòng cuối, tôi chỉ làm thủ công là so khớp thôi, lấy thằng 2 dán vào thằng 1 và dán cho đến khi nào hết thì thôi, nếu khớp thì nó sẽ tăng lên 1
 

File đính kèm

  • NhoGPEGiaiDap.xlsb
    48.5 KB · Đọc: 62
Lần chỉnh sửa cuối:
Upvote 0
Bạn không cho ví dụ, điển hình dữ liệu như ở dòng 2, 3 thì kết quả ra cái gì?
Vì vậy tôi không muốn làm theo kiểu đoán mò yêu cầu.

Tôi chỉ dẫn thuật toán đơn giản cho bạn (có thuật toán khác, nhanh hơn nhưng phức tạp hơn)

Lập một vòng lặp đọc từng dòng:
Dùng hàm join, hoặc concatenate để nối mảng lớn lại thành chuỗi chuoiMe.
Dùing cách tương tự để nối mảng con lại thành chuỗi chuoiCon.
Mở một vòng lặp duyệt chuỗi; dùng hàm InStr để tìm chuoiCn trong chuoiMe. Nếu tìm ra thì cộng 1 và tiếp tục ở vị trí kế tiếp. Nếu không tìm ra thì thoát vòng lặp duyệt chuỗi.

Nối mảng thành chuỗi: nếu dữ liệu như trong file (chỉ 1 và 0) thì có thể nối thẳng, nếu là loại dữ liệu khác thì lúc nối phải có dầu ngăn (delimiters)
 
Upvote 0
Bạn xem theo file; Những mong đúng í của bạn!
 

File đính kèm

  • gpeThuThuat.rar
    14.9 KB · Đọc: 75
Upvote 0
mặc dù có code bạn phi rồi, nhưng đọc vẫn ko hiểu là làm cái gì.............hichic
lặp qua mỗi dòng của vùng B xem có trùng với dòng nào trong vùng A?
lặp qua mỗi cột vùng B xem có trùng với cột nào trong A?
hay sao?
 
Upvote 0
Có lẽ là đầu bài yêu cầu so sánh cả vùng chứ không phải theo dòng => Hiểu nhầm đầu bài
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các Anh Chị đã xem và nhiệt tình giúp đỡ !
Do mình đưa yêu cầu của bài không rõ ràng nên làm vất vả mọi người rồi.
Xin được nói rõ thêm về yêu cầu của bài ( Dựa theo ý trong bài của Anh ChanhTQ@):
Trên mỗi dòng i : Lấy các ô từ Cell(LK, i) đến Cell(LS, i) làm mảng con mẫu (Mảng con mẫu này chỉ có 1 hàng và 9 cột). Tiếp đó dò tìm trên mảng lớn cũng trên dòng đó ( Mảng này cũng chỉ có 1 hàng và cột là từ Cell(A, i) đến Cell(LH, i)) . Ghi tổng số lần mà mảng mẫu con mẫu xuất hiện trong mảng lớn ra Cell(LU, i). Tô màu được như Anh ChanhTQ@ thì càng tốt :=\+.
Làm tiếp cho các dòng tiếp theo cho đến hết.
Xin các Anh Chị giúp cho.
Trân trọng cảm ơn.

 
Upvote 0
Bài này không khó; Nhưng khó ở chổ là làm sao hiểu được bạn!

Trên mỗi dòng i : Lấy các ô từ Cell(LK, i) đến Cell(LS, i) làm mảng con mẫu (Mảng con mẫu này chỉ có 1 hàng và 9 cột).

(ác ô này ở đâu ra; Mà làm chi fải hạn chế vùng dữ liệu đến cột N thôi vậy?
 
Upvote 0
chuỗi con sau đây được tính là xuất hiện mấy lần ?
cha : 1 1 0 0 1 1 1 0 0 1 1 1
con : 1 1 0 0 1 1 1
 
Upvote 0
/-(ai!​
. . . . . . . . . .=> 2
 
Upvote 0
Cám ơn các Anh Chị đã xem và nhiệt tình giúp đỡ !
Do mình đưa yêu cầu của bài không rõ ràng nên làm vất vả mọi người rồi.
Xin được nói rõ thêm về yêu cầu của bài ( Dựa theo ý trong bài của Anh ChanhTQ@):
Trên mỗi dòng i : Lấy các ô từ Cell(LK, i) đến Cell(LS, i) làm mảng con mẫu (Mảng con mẫu này chỉ có 1 hàng và 9 cột). Tiếp đó dò tìm trên mảng lớn cũng trên dòng đó ( Mảng này cũng chỉ có 1 hàng và cột là từ Cell(A, i) đến Cell(LH, i)) . Ghi tổng số lần mà mảng mẫu con mẫu xuất hiện trong mảng lớn ra Cell(LU, i). Tô màu được như Anh ChanhTQ@ thì càng tốt :=\+.
Làm tiếp cho các dòng tiếp theo cho đến hết.
Xin các Anh Chị giúp cho.
Trân trọng cảm ơn.


Mã:
Public Sub Dem()
Dim A, B, MA(), MB(), kq(), r As Long, c As Long

A = Sheet1.Range("A2").CurrentRegion
B = Sheet1.Range("LK2").CurrentRegion

ReDim MA(1 To UBound(A)), MB(1 To UBound(B)), kq(1 To UBound(B), 1 To 1)

For r = 1 To UBound(A)
For c = 1 To UBound(A, 2)
MA(r) = MA(r) & " " & A(r, c)
Next c
MA(r) = MA(r) & " "
Next r

For r = 1 To UBound(B)
For c = 1 To UBound(B, 2)
MB(r) = MB(r) & " " & B(r, c)
Next c
Next r

With CreateObject("vbscript.regexp")
.Global = True
For r = 1 To UBound(MB)
.Pattern = MB(r) & "(?=\s)"
kq(r, 1) = .Execute(MA(r)).Count
Next r
End With

Sheet1.Range("LU2", "LU" & Sheet1.UsedRange.Row).Clear
Sheet1.Range("LU2").Resize(UBound(kq), 1) = kq
End Sub
 

File đính kèm

  • NhoGPEGiaiDap1.xlsm
    52.4 KB · Đọc: 57
Upvote 0
Cám ơn các Anh Chị đã xem và nhiệt tình giúp đỡ !
Do mình đưa yêu cầu của bài không rõ ràng nên làm vất vả mọi người rồi.
Xin được nói rõ thêm về yêu cầu của bài ( Dựa theo ý trong bài của Anh ChanhTQ@):
Trên mỗi dòng i : Lấy các ô từ Cell(LK, i) đến Cell(LS, i) làm mảng con mẫu (Mảng con mẫu này chỉ có 1 hàng và 9 cột). Tiếp đó dò tìm trên mảng lớn cũng trên dòng đó ( Mảng này cũng chỉ có 1 hàng và cột là từ Cell(A, i) đến Cell(LH, i)) . Ghi tổng số lần mà mảng mẫu con mẫu xuất hiện trong mảng lớn ra Cell(LU, i). Tô màu được như Anh ChanhTQ@ thì càng tốt :=\+.
Làm tiếp cho các dòng tiếp theo cho đến hết.
Xin các Anh Chị giúp cho.
Trân trọng cảm ơn.


Làm thí thí nhé, không biết kết quả có đúng không, đếm trong dòng có bi nhiêu màu là có bi nhiêu lần trùng.
PHP:
Public Sub GPE()
Dim tArr(), sArr(), dArr(), I As Long, J As Long, Tem As Long, Num As Long, N As Long, Mau As Long
tArr = Range("LK2:LS34").Value
sArr = Range("A2:LH34").Value
ReDim dArr(1 To 33, 1 To 1)
For I = 1 To UBound(tArr, 1)
Mau = 2
    Tem = 0
    For J = 1 To 9
        Tem = Tem & tArr(I, J)
    Next J
    For J = 1 To UBound(sArr, 2) - 9
        Num = 0
        For N = J To J + 8
            Num = Num & sArr(I, N)
        Next N
        If Num = Tem Then
            Mau = Mau + 1
            dArr(I, 1) = dArr(I, 1) + 1
            Cells(I + 1, J).Resize(, 9).Interior.ColorIndex = Mau
        End If
    Next J
Next I
[LU2].Resize(33) = dArr
End Sub
 
Upvote 0
Tuyệt vời ! Hơn cả mong đợi.
Cám ơn các Anh Chị rất nhiều !
 
Upvote 0
Thực lòng mình cám ơn các Anh Chị và các bạn đã ghé xem topic này.
Tất nhiên là biết ơn nữa với phihndhsp, ChanhTQ@, gtri, Ba Te :=\+
 
Upvote 0
cho đu dây điện tí . các anh làm lẹ wá . hihi
Mã:
Public Sub hello()
Dim fullStr As String, childStr As String, lr As Long, lPos As Long, dArr() As Long
lr = Sheet1.Range("A1000000").End(xlUp).Row
ReDim dArr(1 To lr - 1, 1 To 1)
Sheet1.Range("A2:LH" & lr).Interior.ColorIndex = 0
For r = 2 To lr Step 1
    fullStr = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose( _
              Sheet1.Range("A" & r & ":LH" & r))), " ")
    childStr = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose( _
              Sheet1.Range("LK" & r & ":LS" & r))), " ")
    lPos = InStr(fullStr, childStr)
    Do While lPos > 0
        dArr(r - 1, 1) = dArr(r - 1, 1) + 1
        Cells(r, UBound(Split(Left(fullStr, lPos), " ")) + 1).Resize(, 9).Interior.ColorIndex = Int((50 * Rnd) + 1)
        lPos = InStr(lPos + 1, fullStr, childStr)
    Loop
Next
Sheet1.[LU2].Resize(lr - 1).Value = dArr
End Sub
 
Upvote 0
Bạn không cho ví dụ, điển hình dữ liệu như ở dòng 2, 3 thì kết quả ra cái gì?
Vì vậy tôi không muốn làm theo kiểu đoán mò yêu cầu.

Tôi chỉ dẫn thuật toán đơn giản cho bạn (có thuật toán khác, nhanh hơn nhưng phức tạp hơn)

Lập một vòng lặp đọc từng dòng:
Dùng hàm join, hoặc concatenate để nối mảng lớn lại thành chuỗi chuoiMe.
Dùing cách tương tự để nối mảng con lại thành chuỗi chuoiCon.
Mở một vòng lặp duyệt chuỗi; dùng hàm InStr để tìm chuoiCn trong chuoiMe. Nếu tìm ra thì cộng 1 và tiếp tục ở vị trí kế tiếp. Nếu không tìm ra thì thoát vòng lặp duyệt chuỗi.

Nối mảng thành chuỗi: nếu dữ liệu như trong file (chỉ 1 và 0) thì có thể nối thẳng, nếu là loại dữ liệu khác thì lúc nối phải có dầu ngăn (delimiters)
Mình có chỗ này chưa hiểu lắm, có thể xin thông tin của bạn được k ?
Bài đã được tự động gộp:

Làm thí thí nhé, không biết kết quả có đúng không, đếm trong dòng có bi nhiêu màu là có bi nhiêu lần trùng.
PHP:
Public Sub GPE()
Dim tArr(), sArr(), dArr(), I As Long, J As Long, Tem As Long, Num As Long, N As Long, Mau As Long
tArr = Range("LK2:LS34").Value
sArr = Range("A2:LH34").Value
ReDim dArr(1 To 33, 1 To 1)
For I = 1 To UBound(tArr, 1)
Mau = 2
    Tem = 0
    For J = 1 To 9
        Tem = Tem & tArr(I, J)
    Next J
    For J = 1 To UBound(sArr, 2) - 9
        Num = 0
        For N = J To J + 8
            Num = Num & sArr(I, N)
        Next N
        If Num = Tem Then
            Mau = Mau + 1
            dArr(I, 1) = dArr(I, 1) + 1
            Cells(I + 1, J).Resize(, 9).Interior.ColorIndex = Mau
        End If
    Next J
Next I
[LU2].Resize(33) = dArr
End Sub
cho tớ xin thông tin để tiện liên hệ ạ, có chỗ này mình cần hỏi sâu hơn 1 tý
 
Upvote 0
Public Sub hello() Dim fullStr As String, childStr As String, lr As Long, lPos As Long, dArr() As Long lr = Sheet1.Range("A1000000").End(xlUp).Row ReDim dArr(1 To lr - 1, 1 To 1) Sheet1.Range("A2:LH" & lr).Interior.ColorIndex = 0 For r = 2 To lr Step 1 fullStr = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose( _ Sheet1.Range("A" & r & ":LH" & r))), " ") childStr = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose( _ Sheet1.Range("LK" & r & ":LS" & r))), " ") lPos = InStr(fullStr, childStr) Do While lPos > 0 dArr(r - 1, 1) = dArr(r - 1, 1) + 1 Cells(r, UBound(Split(Left(fullStr, lPos), " ")) + 1).Resize(, 9).Interior.ColorIndex = Int((50 * Rnd) + 1) lPos = InStr(lPos + 1, fullStr, childStr) Loop Next Sheet1.[LU2].Resize(lr - 1).Value = dArr End Sub
em cảm ơn anh nhiều vì đã có những chia sẻ và giúp đỡ mọi người trên diễn đàn. Hiện tại e có một vấn đề mà không có cách giải quyết muốn nhờ anh code hộ ak!. a có thể viết hộ e cách tìm số lần xuất hiện của một chữ xuất hiện trong chuỗi kiểu dạng đếm số lần xuất hiện kí tự trong chuỗi như hàm countifs đó ak.Thanks anh nhiều
 
Upvote 0
Web KT

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

Back
Top Bottom