Thắc mắc về dictionary trong vba

Liên hệ QC

buonphatchan12

Thành viên mới
Tham gia
21/10/20
Bài viết
35
Được thích
1
Dear All,
Mình có một vấn đề như thế này mong mọi người giúp đỡ với ạ!
dic.PNG
Mình có bảng giữ liệu như trong hình. Mình vẫn hay làm là code dict ở bảng 1 ra một vùng khác, rồi từ vùng khác so sánh với item ở bảng 2 để tìm ra kết quả. Câu hỏi của mình là giúp mình chuyển thẳng kết quả của dict trong bảng 1 * số lượng ở bảng 2 rồi trả kết quả vào cột 3 của bảng 2. Thanks mọi người. FIle đính kèm bên dưới!
 

File đính kèm

  • test.xlsx
    11.2 KB · Đọc: 9
Dear All,
Mình có một vấn đề như thế này mong mọi người giúp đỡ với ạ!

Mình có bảng giữ liệu như trong hình. Mình vẫn hay làm là code dict ở bảng 1 ra một vùng khác, rồi từ vùng khác so sánh với item ở bảng 2 để tìm ra kết quả. Câu hỏi của mình là giúp mình chuyển thẳng kết quả của dict trong bảng 1 * số lượng ở bảng 2 rồi trả kết quả vào cột 3 của bảng 2. Thanks mọi người. FIle đính kèm bên dưới!
Bạn muốn KQ = KQ(Dic*cot Qty)
Dic là cái gì của Dic? Key hay item? item có lấy qty của bảng nguồn không? Nếu lấy thì có cộng dồn không?
* cot Qty là nhân Qty bảng nguồn hay Qty bảng kết quả?
 
Upvote 0
Bạn muốn KQ = KQ(Dic*cot Qty)
Dic là cái gì của Dic? Key hay item? item có lấy qty của bảng nguồn không? Nếu lấy thì có cộng dồn không?
* cot Qty là nhân Qty bảng nguồn hay Qty bảng kết quả?
Nghĩa là cộng dồn item ở bảng 1 rồi so sánh với cột mã hàng ở bảng 2 rồi lấy kết quả của dictionary cộng dồn nhân với cột qty ở bảng 2 và kết quả trả về bên cạnh cột qty ở bảng 2. Thanks bạn
 
Upvote 0
Tại sao qty lại nhân qty?
 
Upvote 0
Tại sao qty lại nhân qty?
Tại vì tiếng Tây xịn nó vậy.
Người mới học tiếng Tây thì thiếu tự tin cho nên đặt cái tên dài dòng hơn một chút để phân biệt. Nhưng dân xịn thì nhìn vào tự động hiểu Qty ở chỗ này khác ở chỗ kia.
 
Upvote 0
Tại vì tiếng Tây xịn nó vậy.
Người mới học tiếng Tây thì thiếu tự tin cho nên đặt cái tên dài dòng hơn một chút để phân biệt. Nhưng dân xịn thì nhìn vào tự động hiểu Qty ở chỗ này khác ở chỗ kia.
cái này thực chất ở 2 sheet khác nhau, mình gom vào 1 sheet để nhìn cho dễ ấy mà, thì nó là cột số lượng của mã hàng
 
Upvote 0
Giao tiếp kiểu gì mà Dear All, Thanks bạn, ... đọc "phát chán".
Bạn đọc hiểu sao vậy. Mình không biết sao trên đây bóc mẽ nhau từng chữ một thế nhỉ, mình có dear all thì mình thanks mọi người rồi, Còn thanks bạn là bạn đó trả lời thì mình cảm ơn bạn đó có vấn đề gì sao. Công việc của mình không bán nước bọt để kiếm tiền nên giao tiếp có thể hơi kém. Nhưng cái chính là mình nhờ mọi người giúp đỡ giải quyết vấn đề, mình có cảm ơn mọi người thì sao mà sao bạn chỉ có soi từng câu chữ của mình.
 
Upvote 0
Bạn đọc hiểu sao vậy. Mình không biết sao trên đây bóc mẽ nhau từng chữ một thế nhỉ, mình có dear all thì mình thanks mọi người rồi, Còn thanks bạn là bạn đó trả lời thì mình cảm ơn bạn đó có vấn đề gì sao. Công việc của mình không bán nước bọt để kiếm tiền nên giao tiếp có thể hơi kém. Nhưng cái chính là mình nhờ mọi người giúp đỡ giải quyết vấn đề, mình có cảm ơn mọi người thì sao mà sao bạn chỉ có soi từng câu chữ của mình.
Muốn cảm ơn thì "cảm ơn bạn", sao lại "thanks bạn", nửa Tây nửa Ta đọc thấy "buồn phát chán".
 
Upvote 0
Bạn đọc hiểu sao vậy. Mình không biết sao trên đây bóc mẽ nhau từng chữ một thế nhỉ, mình có dear all thì mình thanks mọi người rồi, Còn thanks bạn là bạn đó trả lời thì mình cảm ơn bạn đó có vấn đề gì sao. Công việc của mình không bán nước bọt để kiếm tiền nên giao tiếp có thể hơi kém. Nhưng cái chính là mình nhờ mọi người giúp đỡ giải quyết vấn đề, mình có cảm ơn mọi người thì sao mà sao bạn chỉ có soi từng câu chữ của mình.
Không phải bóc mẽ, mà là theo nội quy là cần phải viết tiếng Việt và giữ gìn sự trong sáng của tiếng Việt.
Ý tưởng là Add bảng 2 vào Dict chứ không phải bảng 1, đồng thời ghi vào mảng kết quả cột 2 của bảng 2.
Tiếp theo duyệt bảng 1 để cộng dồn vào item. Đồng thời ghi kết quả cộng dồn vào cột 3 bảng 2, và nhân cột 2 ghi kết quả vào cột 4 bảng 2.
TB:
Tôi cố tình ghi STT cột chứ không ghi tên cột vì nghe số lượng nhân số lượng nó phi lý đến phát ghét.
 
Upvote 0
Muốn cảm ơn thì "cảm ơn bạn", sao lại "thanks bạn", nửa Tây nửa Ta đọc thấy "buồn phát chán".
Tiếng cảm ơn, câu chào tiếng Việt thường nặng tình cảm. Người ta có thể muốn dùng tiếng Tây cho nó nhẹ. Điển hình từ "thanks" tiếng Anh nó cũng có khả năng được dùng rất hời hợt, đôi lúc chỉ dùng để chấm dứt câu chuyện.
Nói tóm lại, người ta chen tiếng Anh trong giao tiếp để giảm bớt cái cảm tính trong câu chào. Ta vẫn có câu "phớt tỉnh Ăng lê" mờ :p
 
Upvote 0
Không phải bóc mẽ, mà là theo nội quy là cần phải viết tiếng Việt và giữ gìn sự trong sáng của tiếng Việt.
Ý tưởng là Add bảng 2 vào Dict chứ không phải bảng 1, đồng thời ghi vào mảng kết quả cột 2 của bảng 2.
Tiếp theo duyệt bảng 1 để cộng dồn vào item. Đồng thời ghi kết quả cộng dồn vào cột 3 bảng 2, và nhân cột 2 ghi kết quả vào cột 4 bảng 2.
TB:
Tôi cố tình ghi STT cột chứ không ghi tên cột vì nghe số lượng nhân số lượng nó phi lý đến phát ghét.
Cám ơn! Mình là thành viên mới nên chưa đọc rõ quy định diễn đàn!
Code mình viết ntn nhưng hiện tại đang sai, có thể sửa lại giúp mình được không. Khi xoá mã hàng ở bảng 2 thì kết quả vẫn ghi vào cột 3 (cột I) của bảng 2
ccccccccccccccc.PNG
Sub test()
Dim i As Long, k As Long, MH As String, key As Variant
Dim arrT(), arr(), res(), kq()
Dim DIC As Object
Set DIC = CreateObject("scripting.dictionary")
With Sheet1
arrT = .Range("G4:H" & .Range("G" & Rows.Count).End(xlUp).Row).Value
ReDim res(1 To UBound(arrT, 1), 1 To UBound(arrT, 2))
For i = 1 To UBound(arrT, 1)
MH = arrT(i, 1)
If Not DIC.exists(MH) Then
k = k + 1
res(k, 1) = MH
res(k, 1) = arrT(i, 2)
DIC.Add MH, k
End If

'=========================================
arr = .Range("A4:B" & .Range("A" & Rows.Count).End(xlUp).Row).Value
ReDim kq(1 To UBound(arr, 1), 1 To UBound(arr, 2))
For j = 1 To UBound(arr, 1)
If DIC.exists(arr(j, 1)) Then
kq(DIC.Item(arr(j, 1)), 1) = kq(DIC.Item(arr(j, 1)), 1) + arr(j, 2)
End If
Next j
Next i
Sheet1.Range("I4:M10000").ClearContents
Sheet1.Range("I4").Resize(k, 1) = kq
End With
End Sub
 
Upvote 0
Cám ơn! Mình là thành viên mới nên chưa đọc rõ quy định diễn đàn!
Code mình viết ntn nhưng hiện tại đang sai, có thể sửa lại giúp mình được không. Khi xoá mã hàng ở bảng 2 thì kết quả vẫn ghi vào cột 3 (cột I) của bảng 2
View attachment 255065
Sub test()
Dim i As Long, k As Long, MH As String, key As Variant
Dim arrT(), arr(), res(), kq()
Dim DIC As Object
Set DIC = CreateObject("scripting.dictionary")
With Sheet1
arrT = .Range("G4:H" & .Range("G" & Rows.Count).End(xlUp).Row).Value
ReDim res(1 To UBound(arrT, 1), 1 To UBound(arrT, 2))
For i = 1 To UBound(arrT, 1)
MH = arrT(i, 1)
If Not DIC.exists(MH) Then
k = k + 1
res(k, 1) = MH
res(k, 1) = arrT(i, 2)
DIC.Add MH, k
End If

'=========================================
arr = .Range("A4:B" & .Range("A" & Rows.Count).End(xlUp).Row).Value
ReDim kq(1 To UBound(arr, 1), 1 To UBound(arr, 2))
For j = 1 To UBound(arr, 1)
If DIC.exists(arr(j, 1)) Then
kq(DIC.Item(arr(j, 1)), 1) = kq(DIC.Item(arr(j, 1)), 1) + arr(j, 2)
End If
Next j
Next i
Sheet1.Range("I4:M10000").ClearContents
Sheet1.Range("I4").Resize(k, 1) = kq
End With
End Sub
Tốt nhất nên gởi file dữ liệu thật lên. Bài toán cộng dồn mà ghi là qty*qty
 
Upvote 0
Tốt nhất nên gởi file dữ liệu thật lên. Bài toán cộng dồn mà ghi là qty*qty
Bài thật đó ạ. Nhưng nhiều dòng e copy một ít cho đỡ nặng. Có nghĩa là kết quả cần lấy ra ở bảng 2 cột 3 sẽ bằng lượng cộng dồn ở cột 2 bảng 1 nhân với số lượng ở cột 2 bảng 2
 
Upvote 0
Bài thật đó ạ. Nhưng nhiều dòng e copy một ít cho đỡ nặng. Có nghĩa là kết quả cần lấy ra ở bảng 2 cột 3 sẽ bằng lượng cộng dồn ở cột 2 bảng 1 nhân với số lượng ở cột 2 bảng 2
Bạn thử với Sub này:
PHP:
Option Explicit

Public Sub Gpe()
Dim sArr(), dArr(), I As Long, R As Long, Txt As String
With CreateObject("Scripting.Dictionary")
    sArr = Range("A4", Range("B100000").End(xlUp)).Value
    R = UBound(sArr)
    For I = 1 To R
        Txt = sArr(I, 1)
        If Not .Exists(Txt) Then
            .Item(Txt) = sArr(I, 2)
        Else
            .Item(Txt) = .Item(Txt) + sArr(I, 2)
        End If
    Next I
    '============================================='
    sArr = Range("G4", Range("G100000").End(xlUp)).Resize(, 2).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        If sArr(I, 1) <> Space(0) Then
            Txt = sArr(I, 1)
            If .Exists(Txt) Then dArr(I, 1) = .Item(Txt) * sArr(I, 2)
        End If
    Next I
    '==============================================='
End With
Range("I4").Resize(R) = dArr
End Sub
 
Upvote 0
Bài thật đó ạ. Nhưng nhiều dòng e copy một ít cho đỡ nặng. Có nghĩa là kết quả cần lấy ra ở bảng 2 cột 3 sẽ bằng lượng cộng dồn ở cột 2 bảng 1 nhân với số lượng ở cột 2 bảng 2
Thử thế này coi sao.
Mã:
Sub ABC()
Dim Dic As Object, sArr(), dArr(), i As Long, sItem As String, sh As Worksheet
Set Dic = CreateObject("scripting.dictionary")
Set sh = Sheets("Sheet1")
sArr = sh.Range("A4", sh.[A65536].End(3)).Resize(, 2).Value
dArr = sh.Range("G4", sh.[G65536].End(3)).Resize(, 2).Value
ReDim Preserve dArr(1 To UBound(dArr), 1 To 3)
For i = 1 To UBound(sArr)
   sItem = sArr(i, 1)
   Dic(sItem) = Dic(sItem) + sArr(i, 2)
Next
For i = 1 To UBound(dArr)
   sItem = dArr(i, 1)
   If Dic.exists(sItem) Then
      dArr(i, 3) = Dic.Item(sItem) * dArr(i, 2) 'nếu chỉ cộng dồn thì bỏ phần *dArr(i, 2)
   End If
Next
sh.[G4].Resize(UBound(dArr), UBound(dArr, 2)) = dArr
End Sub
 
Upvote 0
Thử thế này coi sao.
Mã:
Sub ABC()
Dim Dic As Object, sArr(), dArr(), i As Long, sItem As String, sh As Worksheet
Set Dic = CreateObject("scripting.dictionary")
Set sh = Sheets("Sheet1")
sArr = sh.Range("A4", sh.[A65536].End(3)).Resize(, 2).Value
dArr = sh.Range("G4", sh.[G65536].End(3)).Resize(, 2).Value
ReDim Preserve dArr(1 To UBound(dArr), 1 To 3)
For i = 1 To UBound(sArr)
   sItem = sArr(i, 1)
   Dic(sItem) = Dic(sItem) + sArr(i, 2)
Next
For i = 1 To UBound(dArr)
   sItem = dArr(i, 1)
   If Dic.exists(sItem) Then
      dArr(i, 3) = Dic.Item(sItem) * dArr(i, 2) 'nếu chỉ cộng dồn thì bỏ phần *dArr(i, 2)
   End If
Next
sh.[G4].Resize(UBound(dArr), UBound(dArr, 2)) = dArr
End Sub
Bạn thử với Sub này:
PHP:
Option Explicit

Public Sub Gpe()
Dim sArr(), dArr(), I As Long, R As Long, Txt As String
With CreateObject("Scripting.Dictionary")
    sArr = Range("A4", Range("B100000").End(xlUp)).Value
    R = UBound(sArr)
    For I = 1 To R
        Txt = sArr(I, 1)
        If Not .Exists(Txt) Then
            .Item(Txt) = sArr(I, 2)
        Else
            .Item(Txt) = .Item(Txt) + sArr(I, 2)
        End If
    Next I
    '============================================='
    sArr = Range("G4", Range("G100000").End(xlUp)).Resize(, 2).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        If sArr(I, 1) <> Space(0) Then
            Txt = sArr(I, 1)
            If .Exists(Txt) Then dArr(I, 1) = .Item(Txt) * sArr(I, 2)
        End If
    Next I
    '==============================================='
End With
Range("I4").Resize(R) = dArr
End Sub
Cám ơn code của 2 a. Để e thử vào file
 
Upvote 0
Web KT
Back
Top Bottom