TrờivàothuViNamđẹplắmemơi
Thành viên mới 

			
		- Tham gia
- 31/3/21
- Bài viết
- 12
- Được thích
- 0




Chào các bạn,
mình có hai bảng dữ liệu tại bảng 1.Dữ liệu cơ sở và 2.Dữ liệu nhờ mọi người giúp mình tìm kiếm và tách dữ liệu sau đó nhân hệ số
kết quả mong muốn tại bảng 3.Kết quả, cảm ơn các bạn.
View attachment 260634
Dim aTach()
Sub Troi_Vao_Thu_Viet_Nam_Buon_Lam_Anh_Oi_T_T()
    Dim dic As New Scripting.Dictionary
    Dim sheet As Worksheet, data(), res()
    Dim skey As String, str As String, rng As Range
    Dim i As Long, k As Long, n As Long, x As Long, r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    Set rng = sheet.Range("N5")
    r = sheet.Cells(sheet.Rows.Count, "B").End(xlUp).Row
    If r > 4 Then
        data = sheet.Range("B5:D" & r).Value
        For i = 1 To UBound(data, 1)
            skey = data(i, 1)
            str = data(i, 2) & ";" & data(i, 3)
            If Not dic.Exists(skey) Then
                dic.Add skey, str
            Else
                dic(skey) = dic(skey) & "|" & str
            End If
        Next i
    End If
    r = sheet.Cells(sheet.Rows.Count, "F").End(xlUp).Row
    If r < 5 Then Exit Sub
    data = sheet.Range("F5:G" & r).Value
    r = UBound(data, 1)
    ReDim res(1 To r * dic.Count, 1 To 3)
    For i = 1 To r
        skey = data(i, 1): k = k + 1
        If dic.Exists(skey) Then
            str = dic(skey)
            tach_tach_tach str
            x = UBound(aTach, 1)
            For n = 1 To UBound(aTach, 1)
                res(k, 1) = k
                res(k, 2) = aTach(n, 1)
                res(k, 3) = aTach(n, 2) * data(i, 2)
                If n < x Then k = k + 1
            Next n
            Erase aTach
        Else
            res(k, 1) = k
            res(k, 2) = data(i, 1)
            res(k, 3) = data(i, 2)
        End If
    Next i
    rng.CurrentRegion.ClearContents
    If k Then rng.Resize(k, 3).Value = res
End Sub
Sub tach_tach_tach(ByVal str_ As String)
    Dim arr As Variant, i As Long
    arr = Split(str_, "|")
    ReDim aTach(1 To UBound(arr) + 1, 1 To 2)
    For i = 0 To UBound(arr)
        aTach(i + 1, 1) = Split(arr(i), ";")(0)
        aTach(i + 1, 2) = Split(arr(i), ";")(1)
    Next i
End Sub



Cảm ơn befaint đã góp ý, bài này OT cũng khá trật vật loay hoay mãi,phải khai báo một biến aTach dùng chung & một sub ngoài.Gọi tới arr(i) 2 lần, tách chuỗi 2 lần.
Thêm biến vào thì chỉ gọi và tách chuỗi 1 lần.
Ai kêu viết thế cho khổ. Lại còn dùng biến toàn cục nữa.phải khai báo một biến aTach dùng chung & một sub ngoài.

Private function tach_tach_tach(ByVal str_ As String) as variant
'...
tach_tach_tach = aTach
End Sub


Cảm ơn Bạn nhiều, khi có thời gian OT sẽ đọc lại tài liệu ạ.Ai kêu viết thế cho khổ. Lại còn dùng biến toàn cục nữa.
Chưa nắm kỹ bài 9 rồi.
View attachment 260745
Có tạm vài cách thế này:
* Viết function và trả về kết quả luôn vào tên hàm.
PHP:Private function tach_tach_tach(ByVal str_ As String) as variant '... tach_tach_tach = aTach End Sub
* Viết sub / hoặc function, và một biến ByRef nhận kết quả.
Private Sub/ Function tach_tach_tach(ByVal str_ As String, ByRef aTach as variant) as variant
aTach =...
End Sub/ Function
