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