Học code DICTIONARY ARRAY

Liên hệ QC

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
346
Được thích
40
Em đang học Code về Dic Arr và có tham khảo ví dụ trên mạng nhưng chưa hiểu code nhờ anh chị giúp đỡ ạ,
- Em chưa hiểu đoạn này: Em hiểu nó sẽ kiểm tra nếu không tồn tại giá trị nào thì sẽ Add dic cái gì đó...Cái Offset, dấu "/", &1 em chưa hiểu
If Not Dic.Exists(cl.Value) Then
Dic.Add cl.Value, cl.Offset(, 1).Value2 & "|" & 1
- Em chưa hiểu đoạn này:
Dic(cl.Value) = Split(Dic(cl.Value), "|")(0) + cl.Offset(, 1).Value2 & _
"|" & Split(Dic(cl.Value), "|")(1) + 1 => Chưa hiểu đoạn này làm sao có thể tính toán được, em hiểu nó giống kiểu thay cho hàm sumif trong Excel (split (0) rồi split(1)
- Phần mã hàng em đang hiểu nó đếm sự xuất hiện chứ chưa đếm việc giống hay khác nhau: Ví dụ ở đây Bình có 2 mã hàng thì đếm là 2 thì đúng, nhưng An có 2 mã hàng giống nhau thì chỉ đếm 1 thôi, thì làm sao ạ.

- làm sao để list kết quả ra Sheet Kết quả bắt đầu từ A1 ạ.
- Anh chị nào có nhiều các giải khác thì góp ý thêm ạ, để có thêm cơ hội học ạ.

Em cảm ơn ạ.
 

File đính kèm

  • Dictionary.xlsm
    14.1 KB · Đọc: 16
Lần chỉnh sửa cuối:
Em đang học Code về Dic Arr và có tham khảo ví dụ trên mạng nhưng chưa hiểu code nhờ anh chị giúp đỡ ạ,
- Em chưa hiểu đoạn này: Em hiểu nó sẽ kiểm tra nếu không tồn tại giá trị nào thì sẽ Add dic cái gì đó...Cái Offset, dấu "/", &1 em chưa hiểu
If Not Dic.Exists(cl.Value) Then
Dic.Add cl.Value, cl.Offset(, 1).Value2 & "|" & 1
- Em chưa hiểu đoạn này:
Dic(cl.Value) = Split(Dic(cl.Value), "|")(0) + cl.Offset(, 1).Value2 & _
"|" & Split(Dic(cl.Value), "|")(1) + 1 => Chưa hiểu đoạn này làm sao có thể tính toán được, em hiểu nó giống kiểu thay cho hàm sumif trong Excel (split (0) rồi split(1)
- Phần mã hàng em đang hiểu nó đếm sự xuất hiện chứ chưa đếm việc giống hay khác nhau: Ví dụ ở đây Bình có 2 mã hàng thì đếm là 2 thì đúng, nhưng An có 2 mã hàng giống nhau thì chỉ đếm 1 thôi, thì làm sao ạ.

- làm sao để list kết quả ra Sheet Kết quả bắt đầu từ A1 ạ.
- Anh chị nào có nhiều các giải khác thì góp ý thêm ạ, để có thêm cơ hội học ạ.

Em cảm ơn ạ.
Hàm Split là hàm cắt chuỗi theo 1 ký tự nào đó và trả về mảng 1 chiều. Do đó Split(Dic(cl.Value), "|")(0) là phần tử thứ nhất, Split(Dic(cl.Value), "|")(1) là phần tử thứ 2.....
Bạn tham khảo thêm cách khác
Mã:
Sub Thu_thoi()
    Dim Dic As Object, skey As String
    Dim sArr(), I As Long, J As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    With Sheets("Tinhtoan")
        sArr = .Range("A2", .Range("A65535").End(xlUp)).Resize(, 3).Value
    End With
    For I = 1 To UBound(sArr, 1)
        skey = sArr(I, 1) 
        If Not Dic.Exists(skey) Then
            K = K + 1
            Dic.Add skey, K
            For J = 1 To UBound(sArr, 2)
                sArr(K, J) = sArr(I, J)
            Next J
        Else
            sArr(Dic.Item(skey), 2) = sArr(Dic.Item(skey), 2) + sArr(I, 2)
        End If
    Next I
    With Sheets("Ketqua")
        .Range("A2").Resize(K, 3) = sArr
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cho tôi học ké với cái "cô xinh xinh" kai ơi. Tôi chưa biết Dictionary Array là gì.
Theo trình tiếng Anh của tôi thì tôi tạm hiểu nó là một mảng mà các phần tử là dic.
Nhưng trình Vietlish của tôi là 0 nên chịu thua.
 
Upvote 0
Hàm Split là hàm cắt chuỗi theo 1 ký tự nào đó và trả về mảng 1 chiều. Do đó Split(Dic(cl.Value), "|")(0) là phần tử thứ nhất, Split(Dic(cl.Value), "|")(1) là phần tử thứ 2.....
Bạn tham khảo thêm cách khác
Mã:
Sub Thu_thoi()
    Dim Dic As Object, skey As String
    Dim sArr(), I As Long, J As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    With Sheets("Tinhtoan")
        sArr = .Range("A2", .Range("A65535").End(xlUp)).Resize(, 3).Value
    End With
    For I = 1 To UBound(sArr, 1)
        skey = sArr(I, 1) & "#" & sArr(I, 3)
        If Not Dic.Exists(skey) Then
            K = K + 1
            Dic.Add skey, K
            For J = 1 To UBound(sArr, 2)
                sArr(K, J) = sArr(I, J)
            Next J
        Else
            sArr(Dic.Item(skey), 2) = sArr(Dic.Item(skey), 2) + sArr(I, 2)
        End If
    Next I
    With Sheets("Ketqua")
        .Range("A2").Resize(K, 3) = sArr
    End With
End Sub
Mình cảm ơn bạn nhiều. Học thêm được một cách mới !
 
Upvote 0
Cho tôi học ké với cái "cô xinh xinh" kai ơi. Tôi chưa biết Dictionary Array là gì.
Theo trình tiếng Anh của tôi thì tôi tạm hiểu nó là một mảng mà các phần tử là dic.
Nhưng trình Vietlish của tôi là 0 nên chịu thua.
Cháu chỉ đi Copy ở trên mạng rồi dán vào thôi mà -\\/. -\\/. -\\/.
 
Upvote 0
Hàm Split là hàm cắt chuỗi theo 1 ký tự nào đó và trả về mảng 1 chiều. Do đó Split(Dic(cl.Value), "|")(0) là phần tử thứ nhất, Split(Dic(cl.Value), "|")(1) là phần tử thứ 2.....
Bạn tham khảo thêm cách khác
Mã:
Sub Thu_thoi()
    Dim Dic As Object, skey As String
    Dim sArr(), I As Long, J As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    With Sheets("Tinhtoan")
        sArr = .Range("A2", .Range("A65535").End(xlUp)).Resize(, 3).Value
    End With
    For I = 1 To UBound(sArr, 1)
        skey = sArr(I, 1)
        If Not Dic.Exists(skey) Then
            K = K + 1
            Dic.Add skey, K
            For J = 1 To UBound(sArr, 2)
                sArr(K, J) = sArr(I, J)
            Next J
        Else
            sArr(Dic.Item(skey), 2) = sArr(Dic.Item(skey), 2) + sArr(I, 2)
        End If
    Next I
    With Sheets("Ketqua")
        .Range("A2").Resize(K, 3) = sArr
    End With
End Sub
Hi Bạn,
Mình đang học hiểu đoạn Code mà bạn giúp mình, bạn giải thích dùm mình một số cái chưa rõ được không ạ.
- Đoạn Code này mình đang hiểu thế này có đúng không ?
For I = 1 To UBound(sArr, 1)
skey = sArr(I, 1)
If Not Dic.Exists(skey) Then
K = K + 1
Dic.Add skey, K

Sẽ duyệt từ 1 đến Số lượng phần tử lớn nhất trong mảng từ A2:C7. Số 1 trong UBound(sArr, 1) mình hiểu là giá trị lớn nhất của mảng một chiều tức mảng A2:C7 à bạn ?
Sẽ tạo một mảng là Skey sau đó nó kiểm tra tồn tại của các phần tử trong skey này nếu có tồn tại thì nó cộng dồn lại và thêm vào mảng với Key là Skey và items là K ở bằng đoạn Code Dic.Add skey, K
- Đoạn dưới này mình không hiểu luôn ?
For J = 1 To UBound(sArr, 2)
sArr(K, J) = sArr(I, J)
Next
Else
sArr(Dic.Item(skey), 2) = sArr(Dic.Item(skey), 2) + sArr(I, 2)

+ Cái sUBound(sArr, 2) thì sArr này có phải là sArr ở trên không bạn ? Mình chưa hiểu ý nghĩa số 2 là gì ?
+ sArr(K, J) = sArr(I, J) nghĩa là sao bạn ? Đang hiểu là làm cho hai mảng bằng nhau
+ Đoạn này nghĩa là sao bạn sArr(Dic.Item(skey), 2) = sArr(Dic.Item(skey), 2) + sArr(I, 2)

Mong bạn giải thích dùm ạ. Đọc mãi vẫn khó hiểu chưa hiểu ý tưởng giải bài này ? Nhìn không khó nhưng vẫn khó.hic
 
Upvote 0
Số 1 trong UBound(sArr, 1) mình hiểu là giá trị lớn nhất của mảng một chiều tức mảng A2:C7 à bạn ?
Nếu viết UBound(sArr, 1) thì có nghĩa là độ lớn của chiều thứ nhất
Nếu viết UBound(sArr, 2) thì có nghĩa là độ lớn của chiều thứ hai
Cái này giống như hình chữ nhật có 2 chiều là chiều rộng và chiều dài vậy đó
Lưu ý rằng mảng được lấy từ vùng dữ liệu (A2:C7) sẽ luôn là mảng 2 chiều (bảng hình chữ nhật có chiều rộng và dài)
 
Upvote 0
Sẽ duyệt từ 1 đến Số lượng phần tử lớn nhất trong mảng từ A2:C7. Số 1 trong UBound(sArr, 1) mình hiểu là giá trị lớn nhất của mảng một chiều tức mảng A2:C7 à bạn ?
Cái Ubound(sarr,1) cái này là độ dài lớn nhất của chiều thứ 1 nhé.Chứ cái này không phải mảng 1 chiều.
 
Upvote 0
Ubound() không phải trả về độ (dài) lớn nhất. Mà nó trả về chỉ số lớn nhất của chiều cần xác định của mảng đó.

"Độ" - số lượng, kích thước của một chiều = UBound() - LBound() + 1.

Lý thuyết là như vậy. Nếu muốn nói cụ thể trong trường hợp Array được tạo ra do chép Range vào thì cần ghi chú cụ thể.


1591777820419.png
 
Upvote 0
Nếu viết UBound(sArr, 1) thì có nghĩa là độ lớn của chiều thứ nhất
Nếu viết UBound(sArr, 2) thì có nghĩa là độ lớn của chiều thứ hai
Cái này giống như hình chữ nhật có 2 chiều là chiều rộng và chiều dài vậy đó
Lưu ý rằng mảng được lấy từ vùng dữ liệu (A2:C7) sẽ luôn là mảng 2 chiều (bảng hình chữ nhật có chiều rộng và dài)
Em xin cảm ơn sự chỉ dạy của các Thầy, các anh quản trị của GPE ạ !
 
Upvote 0
Ubound() không phải trả về độ (dài) lớn nhất. Mà nó trả về chỉ số lớn nhất của chiều cần xác định của mảng đó.

"Độ" - số lượng, kích thước của một chiều = UBound() - LBound() + 1.
...
Bài #7 nói không rõ. Cho nên bạn cần ví dụ:
UBound một mảng chỉ có nghĩa là chận trên chỉ số (của chiều nào đó, tuỳ theo tham thứ hai) mảng ấy. Nói cách khác nó là chỉ số của phần tử cuối cùng trong chiều ấy của mảng. Hoàn toàn không liên hệ đến độ lớn.
Nếu mảng được khai báo a(101 To 200, 5 To 10). Mảng này rõ rằng được khai báo là chỉ số của phần tử cuối chủa chiều thứ nhất là 200. Biểu thức UBound(a) sẽ trả về 200. Trong khi độ lớn của chiều thứ nhất của a chỉ là 101->200 = 100. Biểu thức UBound(a, 2) sẽ trả về 10. Trong khi đọ lớn của chiều thứ hai chỉ là 5->10 = 6.
 
Upvote 0
Bài #7 nói không rõ. Cho nên bạn cần ví dụ:
UBound một mảng chỉ có nghĩa là chận trên chỉ số (của chiều nào đó, tuỳ theo tham thứ hai) mảng ấy. Nói cách khác nó là chỉ số của phần tử cuối cùng trong chiều ấy của mảng. Hoàn toàn không liên hệ đến độ lớn.
Nếu mảng được khai báo a(101 To 200, 5 To 10). Mảng này rõ rằng được khai báo là chỉ số của phần tử cuối chủa chiều thứ nhất là 200. Biểu thức UBound(a) sẽ trả về 200. Trong khi độ lớn của chiều thứ nhất của a chỉ là 101->200 = 100. Biểu thức UBound(a, 2) sẽ trả về 10. Trong khi đọ lớn của chiều thứ hai chỉ là 5->10 = 6.
Em cảm ơn anh ạ. EM đang tìm hiểu thêm để hiểu ạ. Em thấy dùng Dictionary rất mạnh và hiệu quả làm việc với bảng tính nên em đang cố hiểu về nó. Về cơ bản nhiều cái có thể làm với Pivotble nhưng dùng VBA thì nó hay ạ.
 
Upvote 0
Em cảm ơn anh ạ. EM đang tìm hiểu thêm để hiểu ạ. Em thấy dùng Dictionary rất mạnh và hiệu quả làm việc với bảng tính nên em đang cố hiểu về nó. Về cơ bản nhiều cái có thể làm với Pivotble nhưng dùng VBA thì nó hay ạ.
Tôi biết bạn bị Dic nó nhập rồi nên có nói gì cũng không nghe.
Tôi nói lời này để cảnh báo các bạn chưa bị nhập:
1. cái từ "mạnh và hiệu quả" xảy ra ở đây là vì 2 lý do:
(a) nhiều bạn ở diễn đàn này thích nó cho nên nó được xử dụng ở cả những trường hợp mà cái khác thực ra hiệu quả hơn. Điển hình là nếu key là số thì cấu trúc mảng hiệu quả hơn. Tuy nhiên, những bạn sử dụng Dictionary thường yếu về mảng cho nên không muốn thử.
(b) có nhiều trường hợp nếu chỉnh lại thiết kế bảng hoặc dùng sort trước khi đọc dữ liệu sẽ hiệu quả hơn. Nhưng cũng như trên, các bạn quen dùng Dic rồii cho nên quên bẳng cách đọc dữ liệu đã sort.
2. VBA đem so sánh với Pivot Table là so sánh thiên vị. Bởi vì dân diễn đàn này thích làm từ dưới lên trên thay vì từ trên xuống dưới. Pivot Table là công cụ không thể thiếu của quản lý. VBA là công cụ của trợ lý quản lý.

- Tôi hiểu rõ mảng hơn dictionary. Điều đó làm tôi yên tâm với trình độ code của mình.
- Tôi hiểu rõ VBA hơn Pivot Table. Điều này không làm tôi yên tâm với trình độ sử dụng bảng tính của mình. Nếu có thể ngược lại thì tốt hơn.
 
Upvote 0
Tôi biết bạn bị Dic nó nhập rồi nên có nói gì cũng không nghe.
Tôi nói lời này để cảnh báo các bạn chưa bị nhập:
1. cái từ "mạnh và hiệu quả" xảy ra ở đây là vì 2 lý do:
(a) nhiều bạn ở diễn đàn này thích nó cho nên nó được xử dụng ở cả những trường hợp mà cái khác thực ra hiệu quả hơn. Điển hình là nếu key là số thì cấu trúc mảng hiệu quả hơn. Tuy nhiên, những bạn sử dụng Dictionary thường yếu về mảng cho nên không muốn thử.
(b) có nhiều trường hợp nếu chỉnh lại thiết kế bảng hoặc dùng sort trước khi đọc dữ liệu sẽ hiệu quả hơn. Nhưng cũng như trên, các bạn quen dùng Dic rồii cho nên quên bẳng cách đọc dữ liệu đã sort.
2. VBA đem so sánh với Pivot Table là so sánh thiên vị. Bởi vì dân diễn đàn này thích làm từ dưới lên trên thay vì từ trên xuống dưới. Pivot Table là công cụ không thể thiếu của quản lý. VBA là công cụ của trợ lý quản lý.

- Tôi hiểu rõ mảng hơn dictionary. Điều đó làm tôi yên tâm với trình độ code của mình.
- Tôi hiểu rõ VBA hơn Pivot Table. Điều này không làm tôi yên tâm với trình độ sử dụng bảng tính của mình. Nếu có thể ngược lại thì tốt hơn.
Dạ vâng anh. Cũng là cơ hội để bọn em hiểu hơn suy nghĩ của người thành thạo VBA ạ. Cảm ơn anh ạ.
 
Upvote 0
Ở đâu tôi nói lời này vậy: "mảng dùng tốt hơn dictionary"?
 
Upvote 0
Ở đâu tôi nói lời này vậy: "mảng dùng tốt hơn dictionary"?
à, ý cháu là bác nói là "Tôi hiểu rõ mảng hơn dictionary". Cháu không hiểu ý bác là "Kiến thức của tôi về mảng tốt hơn kiến thức về dictionary " hay là "Tôi biết: mảng dùng tốt hơn dictionary. ". Một câu nói làm nảy sinh ra hai suy nghĩ trái chiếu trong cháu, nên cháu muốn hỏi lại bác cho chắc, dẫu sao đó cũng là lời bác nói, tự nghĩ không bằng đi hỏi trực tiếp.
 
Upvote 0
à, ý cháu là bác nói là "Tôi hiểu rõ mảng hơn dictionary". Cháu không hiểu ý bác là "Kiến thức của tôi về mảng tốt hơn kiến thức về dictionary " hay là "Tôi biết: mảng dùng tốt hơn dictionary. ". Một câu nói làm nảy sinh ra hai suy nghĩ trái chiếu trong cháu, nên cháu muốn hỏi lại bác cho chắc, dẫu sao đó cũng là lời bác nói, tự nghĩ không bằng đi hỏi trực tiếp.
Mảng là cấu trúc căn bản của lập trình. Dictionary là một cấu trúc công cụ sử dụng.
Mảng nằm bên trong ngôn ngữ (VBA). Dictionary là một tiện ích COM mà Windows chio phép VBA gọi ra để sử dụng.
Không hiểu hết những gì bên trong ngôn ngữ làm sao nắm nó được? Vì vậy phải hiểu rõ mảng như lòng bàn tay.
Tiện ích thì Windows có cả đống, học hết mệt lắm.
Trước mắt thì chỉ cần biết Dictionary là côing cụ dùng để tra Key/Item. Và vài ứng dụng của nó. Hết.
 
Upvote 0
Upvote 0
Mã:
Option Explicit

Sub GetFileNames()

Dim xRow As Long

Dim xDirect$, xFname$, InitialFoldr$

ActiveSheet.Range("C2").Select

InitialFoldr$ = "C:\"

With Application.FileDialog(msoFileDialogFolderPicker)

.InitialFileName = Application.DefaultFilePath & "\"

.Title = "Please select a folder to list Files from"

.InitialFileName = InitialFoldr$

.Show

If .SelectedItems.Count <> 0 Then

xDirect$ = .SelectedItems(1) & "\"

xFname$ = Dir(xDirect$, 7)

Do While xFname$ <> ""

ActiveCell.Offset(xRow) = xFname$

xRow = xRow + 1

xFname$ = Dir

Loop

End If

End With

End Sub

chào các bác trong diễn đàn,em cũng vừa bắt đầu tìm hiểu và học VBA ,tò mò lên mạng tìm được code này. (xin lỗi vì không gán nguồn vì em quên lấy ở đâu rồi) nhưng các bác có thể giải thích giúp em là code ở trên dùng để lấy tên file từ một folder ra bẳng tính excel nhưng lúc em chạy code thì có kết quả nhưng đối với những tên file là tiếng việt có dấu thì lại bị lỗi font chữ,các bác giúp em khăc phuc với ạ
Bài đã được tự động gộp:

1591916107010.png
đây là lỗi khi chạy code lấy tên file ạ
 
Upvote 0
Web KT

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

Back
Top Bottom