Nhờ giúp đỡ tìm kiếm và tách dữ liệu nhân hệ số

Liên hệ QC
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.

Untitled.jpg
 

File đính kèm

  • tachdulieu.xlsx
    13.1 KB · Đọc: 11
Lần chỉnh sửa cuối:
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

OT thấy bài này khá hay nên code thử ,bạn tham khảo ạ, hi vọng sẽ còn nhiều cách làm khác tối ưu hơn để OT học hỏi thêm
Mã:
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
 
Upvote 0
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.
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.
Nếu bạn có hứng thú Bạn chỉ thêm cho OT cách dùng khác với ạ.
 
Upvote 0
phải khai báo một biến aTach dùng chung & một sub ngoài.
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.
1623816785099.png

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
 
Upvote 0
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
Cảm ơn Bạn nhiều, khi có thời gian OT sẽ đọc lại tài liệu ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom