Cô gái 1m52
Thành viên mới

- Tham gia
- 3/4/20
- Bài viết
- 25
- Được thích
- 0
Thử code.Xin chào các bạn,
Tôi có một bảng dữ liệu đầu vào maxnv, và công việc như cột A,B.
Mong các bạn giúp đỡ tôi thống kê số nhân viên và mã nv đưa vào cột F,G
Cảm ơn các bạn.
View attachment 246484
Sub congviec()
Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq
Set dic = CreateObject("scripting.dictionary")
With Sheets("TK")
lr = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A2:B" & lr).Value
ReDim kq(1 To UBound(arr), 1 To 3)
For i = 1 To UBound(arr)
dk = arr(i, 2)
If Not dic.exists(dk) Then
a = a + 1
dic.Add dk, a
kq(a, 1) = arr(i, 2)
kq(a, 2) = 1
kq(a, 3) = arr(i, 1)
Else
b = dic.Item(dk)
dks = "," & arr(i, 1) & ","
If InStr(1, "," & kq(b, 3) & ",", dks) = 0 Then
kq(b, 3) = kq(b, 3) & "," & arr(i, 1)
kq(b, 2) = kq(b, 2) + 1
End If
End If
Next i
lr = .Range("E" & Rows.Count).End(xlUp).Row
If lr > 1 Then .Range("E2:G" & lr).ClearContents
If a Then .Range("e2:g2").Resize(a).Value = kq
End With
End Sub
Cảm ơn bạn đã giúp đỡ, phiền bạn có thể sửa giúp cột công việc (cột E) để nhập tay được không, nghĩa là nhập tay công việc nào thì dữ liệu sẽ tìm kiếm và điền theo công việc đó, chứ không phải là liệt kê hết công việc ạ.Thu
Thử code.
Mã:Sub congviec() Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq Set dic = CreateObject("scripting.dictionary") With Sheets("TK") lr = .Range("A" & Rows.Count).End(xlUp).Row arr = .Range("A2:B" & lr).Value ReDim kq(1 To UBound(arr), 1 To 3) For i = 1 To UBound(arr) dk = arr(i, 2) If Not dic.exists(dk) Then a = a + 1 dic.Add dk, a kq(a, 1) = arr(i, 2) kq(a, 2) = 1 kq(a, 3) = arr(i, 1) Else b = dic.Item(dk) dks = "," & arr(i, 1) & "," If InStr(1, "," & kq(b, 3) & ",", dks) = 0 Then kq(b, 3) = kq(b, 3) & "," & arr(i, 1) kq(b, 2) = kq(b, 2) + 1 End If End If Next i lr = .Range("E" & Rows.Count).End(xlUp).Row If lr > 1 Then .Range("E2:G" & lr).ClearContents If a Then .Range("e2:g2").Resize(a).Value = kq End With End Sub
Cột F hàm COUNTIFXin chào các bạn,
Tôi có một bảng dữ liệu đầu vào maxnv, và công việc như cột A,B.
Mong các bạn giúp đỡ tôi thống kê số nhân viên và mã nv đưa vào cột F,G
Cảm ơn các bạn.
View attachment 246484
Bạn thử xem fileXin chào các bạn,
Tôi có một bảng dữ liệu đầu vào maxnv, và công việc như cột A,B.
Mong các bạn giúp đỡ tôi thống kê số nhân viên và mã nv đưa vào cột F,G
Cảm ơn các bạn.
Bạn thử.Cảm ơn bạn đã giúp đỡ, phiền bạn có thể sửa giúp cột công việc (cột E) để nhập tay được không, nghĩa là nhập tay công việc nào thì dữ liệu sẽ tìm kiếm và điền theo công việc đó, chứ không phải là liệt kê hết công việc ạ.
Sub congviec()
Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq, lr1
Set dic = CreateObject("scripting.dictionary")
With Sheets("TK")
lr = .Range("E" & Rows.Count).End(xlUp).Row
If lr < 1 Then Exit Sub
.Range("F2:G" & lr).ClearContents
kq = .Range("E2:G" & lr).Value
For i = 1 To UBound(kq)
dk = kq(i, 1)
dic.Item(dk) = i
Next i
lr1 = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A2:B" & lr1).Value
For i = 1 To UBound(arr)
dk = arr(i, 2)
If dic.exists(dk) Then
b = dic.Item(dk)
dks = "," & arr(i, 1) & ","
If kq(b, 3) = Empty Then
kq(b, 3) = arr(i, 1)
kq(b, 2) = 1
ElseIf InStr(1, "," & kq(b, 3) & ",", dks) = 0 Then
kq(b, 3) = kq(b, 3) & "," & arr(i, 1)
kq(b, 2) = kq(b, 2) + 1
End If
End If
Next i
.Range("e2:g" & lr).Value = kq
End With
End Sub
Nếu đã dùng power pivot thì nên để source gốc trong Data model rồi dùng Dax xử lý, chứ bạn dùng PQ xử lý thì nó trả về cho 1 trường hợp riêng lẽ, thống kê cho các trường hợp khác thì lại phải tạo source khác từ source gốc rất bất tiện, bạn xem thử!Bạn thử xem file
Các hàm DAX mình chưa biết nhiều, chỉ biết 1 số hàm cơ bản nên mới phải dùng PQ để loại trùng. Trước giờ xử lý nối chuỗi loại trùng toàn phải dùng PQ, nay biết thêm hàm DISTINCTNếu đã dùng power pivot thì nên để source gốc trong Data model rồi dùng Dax xử lý, chứ bạn dùng PQ xử lý thì nó trả về cho 1 trường hợp riêng lẽ, thống kê cho các trường hợp khác thì lại phải tạo source khác từ source gốc rất bất tiện, bạn xem thử!
Nên tìm hiểu bạn ạ, các hàm Dax tượng tự excel và dễ hơn excel, nhưng với những người rành về mảng excel sẽ khó tiếp cận hơn những người chưa biết excel vì có thể xem Dax là dynamic array, nhưng khi tiếp cận rồi thì nó hấp dẫn hơn excel, Dax là rễ của Power pivot và power BI nên nó sẽ mang lại rất nhiều lợi ích cho bạn trong công việc so với cách làm bây giờ.Các hàm DAX mình chưa biết nhiều, chỉ biết 1 số hàm cơ bản nên mới phải dùng PQ để loại trùng. Trước giờ xử lý nối chuỗi loại trùng toàn phải dùng PQ, nay biết thêm hàm DISTINCT
Cám ơn bạn nhiều
Chúc bạn vui vẻ
Tiếp cận DAX thì nên tiếp cận theo hướng cơ sở dữ liệu, cụ thể các TABLE, FIELDs (Columns), hay RECORDs (Rows) - là phép tính với các đối tượng đó - nó tổng quan và trừu tượng hơn chút so với hàm excel chỉ đối với cell và range.Nên tìm hiểu bạn ạ, các hàm Dax tượng tự excel và dễ hơn excel, nhưng với những người rành về mảng excel sẽ khó tiếp cận hơn những người chưa biết excel vì có thể xem Dax là dynamic array, nhưng khi tiếp cận rồi thì nó hấp dẫn hơn excel, Dax là rễ của Power pivot và power BI nên nó sẽ mang lại rất nhiều lợi ích cho bạn trong công việc so với cách làm bây giờ.
Dax xử lý custom table và custom column không có Custom Row và Cells, nhưng chỉ cần vậy là làm được hết nhưng phải rành về dynamic array điều kiện filter và hoàn cảnh filter, đôi khi không sử dụng hàm mảng nó vẫn biến đổi bởi vậy tôi mới nói những người rành về mảng bên excel qua Dax sẽ bị hố nếu vẫn giữ tư duy của mảng excel, Dax có thể xử lý mọi Case mà không cần dùng tới M trong PQ, chỉ có các trường hợp đệ quy mới cần dùng M nhưng nếu cần xử lý vậy thì làm ngay data gốc luôn chứ chẳng cần PQ xử lýTiếp cận DAX thì nên tiếp cận theo hướng cơ sở dữ liệu, cụ thể các TABLE, FIELDs (Columns), hay RECORDs (Rows) - là phép tính với các đối tượng đó - nó tổng quan và trừu tượng hơn chút so với hàm excel chỉ đối với cell và range.
Nhưng đúng là thú vị và nhanh hơn trong excel nhiều, song lại thiếu linh động nếu ai xử lý từng cells, ranges (vùng)
Cảm ơn các bạn đã giúp đỡ tôi, code trên của bạn đúng với những gì tôi cần.Bạn thử.
Mã:Sub congviec() Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq, lr1 Set dic = CreateObject("scripting.dictionary") With Sheets("TK") lr = .Range("E" & Rows.Count).End(xlUp).Row If lr < 1 Then Exit Sub .Range("F2:G" & lr).ClearContents kq = .Range("E2:G" & lr).Value For i = 1 To UBound(kq) dk = kq(i, 1) dic.Item(dk) = i Next i lr1 = .Range("A" & Rows.Count).End(xlUp).Row arr = .Range("A2:B" & lr1).Value For i = 1 To UBound(arr) dk = arr(i, 2) If dic.exists(dk) Then b = dic.Item(dk) dks = "," & arr(i, 1) & "," If kq(b, 3) = Empty Then kq(b, 3) = arr(i, 1) kq(b, 2) = 1 ElseIf InStr(1, "," & kq(b, 3) & ",", dks) = 0 Then kq(b, 3) = kq(b, 3) & "," & arr(i, 1) kq(b, 2) = kq(b, 2) + 1 End If End If Next i .Range("e2:g" & lr).Value = kq End With End Sub
Bạn dùng Function cho "chủ động". Muốn kết quả tới đâu thì Copy công thức xuống đến đó.Cảm ơn bạn đã giúp đỡ, phiền bạn có thể sửa giúp cột công việc (cột E) để nhập tay được không, nghĩa là nhập tay công việc nào thì dữ liệu sẽ tìm kiếm và điền theo công việc đó, chứ không phải là liệt kê hết công việc ạ.
Bạn dùng power pivot phiên bản năm bao nhiêu thế ạNếu đã dùng power pivot thì nên để source gốc trong Data model rồi dùng Dax xử lý, chứ bạn dùng PQ xử lý thì nó trả về cho 1 trường hợp riêng lẽ, thống kê cho các trường hợp khác thì lại phải tạo source khác từ source gốc rất bất tiện, bạn xem thử!
Tôi đang sài power pivot của office 365 bạn ạBạn dùng power pivot phiên bản năm bao nhiêu thế ạ
Bạn thử code này nhé.Cảm ơn các bạn đã giúp đỡ tôi, code trên của bạn đúng với những gì tôi cần.
Do nhu cầu báo cáo rõ ràng nên tôi cần bổ sung thêm cột điểm (cột c)
Làm phiền bạn và mọi người giúp đỡ tôi thêm số điểm tổng hợp ứng với từng mã Nhân viên như ở cột G với ạ.
Với hình ảnh đính kèm bên dưới tôi đang ví dụ minh họa cho 2 trường hợp tại CV01: NV0001[23];NV0002[20];
View attachment 246493
Sub congviec()
Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq, s As String
Set dic = CreateObject("scripting.dictionary")
With Sheets("TK")
lr = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A2:C" & lr).Value
ReDim Preserve arr(1 To UBound(arr), 1 To 4)
For i = 1 To UBound(arr)
dk = arr(i, 2) & "#" & arr(i, 1)
If Not dic.exists(dk) Then
dic.Add dk, i
arr(i, 4) = arr(i, 3)
Else
b = dic.Item(dk)
arr(b, 4) = arr(i, 3) + arr(b, 4)
End If
Next i
For i = 1 To UBound(arr)
dk = arr(i, 2)
If Not dic.exists(dk) Then
If arr(i, 4) = 1 Then
s = arr(i, 1)
Else
s = arr(i, 1) & "[" & arr(i, 4) & "]"
End If
dic.Add dk, Array(1, s)
Else
a = dic.Item(dk)(0)
s = dic.Item(dk)(1)
If arr(i, 4) > 0 Then
a = a + 1
If arr(i, 4) = 1 Then
s = s & "," & arr(i, 1)
Else
s = s & "," & arr(i, 1) & "[" & arr(i, 4) & "]"
End If
End If
dic.Item(dk) = Array(a, s)
End If
Next i
lr = .Range("E" & Rows.Count).End(xlUp).Row
If lr > 1 Then .Range("F2:G" & lr).ClearContents
kq = .Range("E2:G" & lr).Value
For i = 1 To UBound(kq)
dk = kq(i, 1)
If dic.exists(dk) Then
kq(i, 2) = dic.Item(dk)(0)
kq(i, 3) = dic.Item(dk)(1)
End If
Next i
.Range("E2:G" & lr).Value = kq
End With
End Sub
Cảm ơn bạn, tôi thử code trên thấy có mã NV không ra điểm số ví dụ: NV0038,NV0041,NV0043,NV0045, tại CV10.Bạn thử code này nhé.
Mã:Sub congviec() Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq, s As String Set dic = CreateObject("scripting.dictionary") With Sheets("TK") lr = .Range("A" & Rows.Count).End(xlUp).Row arr = .Range("A2:C" & lr).Value ReDim Preserve arr(1 To UBound(arr), 1 To 4) For i = 1 To UBound(arr) dk = arr(i, 2) & "#" & arr(i, 1) If Not dic.exists(dk) Then dic.Add dk, i arr(i, 4) = arr(i, 3) Else b = dic.Item(dk) arr(b, 4) = arr(i, 3) + arr(b, 4) End If Next i For i = 1 To UBound(arr) dk = arr(i, 2) If Not dic.exists(dk) Then If arr(i, 4) = 1 Then s = arr(i, 1) Else s = arr(i, 1) & "[" & arr(i, 4) & "]" End If dic.Add dk, Array(1, s) Else a = dic.Item(dk)(0) s = dic.Item(dk)(1) If arr(i, 4) > 0 Then a = a + 1 If arr(i, 4) = 1 Then s = s & "," & arr(i, 1) Else s = s & "," & arr(i, 1) & "[" & arr(i, 4) & "]" End If End If dic.Item(dk) = Array(a, s) End If Next i lr = .Range("E" & Rows.Count).End(xlUp).Row If lr > 1 Then .Range("F2:G" & lr).ClearContents kq = .Range("E2:G" & lr).Value For i = 1 To UBound(kq) dk = kq(i, 1) If dic.exists(dk) Then kq(i, 2) = dic.Item(dk)(0) kq(i, 3) = dic.Item(dk)(1) End If Next i .Range("E2:G" & lr).Value = kq End With End Sub
Thế nó bằng 1 rồi còn ra gì nữa.Ở trên cũng như vậy không thì sửa code như sau.Cảm ơn bạn, tôi thử code trên thấy có mã NV không ra điểm số ví dụ: NV0038,NV0041,NV0043,NV0045, tại CV10.
Phiền bạn xem và xử lý giúp ạ.
Sub congviec()
Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq, s As String
Set dic = CreateObject("scripting.dictionary")
With Sheets("TK")
lr = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A2:C" & lr).Value
ReDim Preserve arr(1 To UBound(arr), 1 To 4)
For i = 1 To UBound(arr)
dk = arr(i, 2) & "#" & arr(i, 1)
If Not dic.exists(dk) Then
dic.Add dk, i
arr(i, 4) = arr(i, 3)
Else
b = dic.Item(dk)
arr(b, 4) = arr(i, 3) + arr(b, 4)
End If
Next i
For i = 1 To UBound(arr)
dk = arr(i, 2)
If Not dic.exists(dk) Then
s = arr(i, 1) & "[" & arr(i, 4) & "]"
dic.Add dk, Array(1, s)
Else
a = dic.Item(dk)(0)
s = dic.Item(dk)(1)
If arr(i, 4) > 0 Then
a = a + 1
s = s & "," & arr(i, 1) & "[" & arr(i, 4) & "]"
End If
dic.Item(dk) = Array(a, s)
End If
Next i
lr = .Range("E" & Rows.Count).End(xlUp).Row
If lr > 1 Then .Range("F2:G" & lr).ClearContents
kq = .Range("E2:G" & lr).Value
For i = 1 To UBound(kq)
dk = kq(i, 1)
If dic.exists(dk) Then
kq(i, 2) = dic.Item(dk)(0)
kq(i, 3) = dic.Item(dk)(1)
End If
Next i
.Range("E2:G" & lr).Value = kq
End With
End Sub
Bác có thể chỉ giúp làm thế nào để nối chuỗi vậy không? Em dùng office 2010, có tải power pivot về rồi nhưng đến đoạn nối chuỗi em chịu (em chưa dùng cái này bao giờ). File của bác thì phiên bản máy của em lại không mở chi tiết ra xem đượcNên tìm hiểu bạn ạ, các hàm Dax tượng tự excel và dễ hơn excel, nhưng với những người rành về mảng excel sẽ khó tiếp cận hơn những người chưa biết excel vì có thể xem Dax là dynamic array, nhưng khi tiếp cận rồi thì nó hấp dẫn hơn excel, Dax là rễ của Power pivot và power BI nên nó sẽ mang lại rất nhiều lợi ích cho bạn trong công việc so với cách làm bây giờ.
Office 2010 em cài thêm power pivot mà không thấy hàm concatenatexBạn vô Power pivot-Data model (Manage) là thấy chi tiết
View attachment 246535
Có thể rút bớt 1 for được không bạn?For i = 1 To UBound(arr)
...
Next i
For i = 1 To UBound(arr)
...
Next i
Chắc là power pivot phiên bản cũ nó không có hàm đó, bạn thử xem trên máy nào có phiên bản office cao hơn thử xem.Office 2010 em cài thêm power pivot mà không thấy hàm concatenatex
View attachment 246537
Rồi cũng không thấy mục Data Model luôn
View attachment 246539
Vâng bác, để em về cài trên máy ở nhà xem sao. Em cũng muốn biết thêm cái này chứ đi làm office cũ nên ít khi được tiếp cậnChắc là power pivot phiên bản cũ nó không có hàm đó, bạn thử xem trên máy nào có phiên bản office cao hơn thử xem.
Mình cũng thế, mình còn không làm được như bạn nên mình mới hỏi.Mình không rút gọn được.Bạn rút gọn được không đăng lên cho mình tham khảo cái.
Tôi thì không hiểu đề bài muốn gì, để mà rút gọnMình cũng thế, mình còn không làm được như bạn nên mình mới hỏi.
Thế nó bằng 1 rồi còn ra gì nữa.Ở trên cũng như vậy không thì sửa code như sau.
Mã:Sub congviec() Dim i As Long, lr As Long, dic As Object, a As Long, dk As String, dks As String, b As Long, arr, kq, s As String Set dic = CreateObject("scripting.dictionary") With Sheets("TK") lr = .Range("A" & Rows.Count).End(xlUp).Row arr = .Range("A2:C" & lr).Value ReDim Preserve arr(1 To UBound(arr), 1 To 4) For i = 1 To UBound(arr) dk = arr(i, 2) & "#" & arr(i, 1) If Not dic.exists(dk) Then dic.Add dk, i arr(i, 4) = arr(i, 3) Else b = dic.Item(dk) arr(b, 4) = arr(i, 3) + arr(b, 4) End If Next i For i = 1 To UBound(arr) dk = arr(i, 2) If Not dic.exists(dk) Then s = arr(i, 1) & "[" & arr(i, 4) & "]" dic.Add dk, Array(1, s) Else a = dic.Item(dk)(0) s = dic.Item(dk)(1) If arr(i, 4) > 0 Then a = a + 1 s = s & "," & arr(i, 1) & "[" & arr(i, 4) & "]" End If dic.Item(dk) = Array(a, s) End If Next i lr = .Range("E" & Rows.Count).End(xlUp).Row If lr > 1 Then .Range("F2:G" & lr).ClearContents kq = .Range("E2:G" & lr).Value For i = 1 To UBound(kq) dk = kq(i, 1) If dic.exists(dk) Then kq(i, 2) = dic.Item(dk)(0) kq(i, 3) = dic.Item(dk)(1) End If Next i .Range("E2:G" & lr).Value = kq End With End Sub
Hihi, cảm ơn bạn nhiều do nhu cầu công việc nên tôi muốn sửa đổi bổ sung cho rõ ràng hơn.Bạn dùng Function cho "chủ động". Muốn kết quả tới đâu thì Copy công thức xuống đến đó.
---------------------------------
"Má ơi"
Làm xong lại thấy bài #12.
Bạn không hiểu chỗ nào vậy, để tôi giải thích thêm ạ?Tôi thì không hiểu đề bài muốn gì, để mà rút gọn
Chạy codeCảm ơn các bạn đã giúp đỡ tôi, code trên của bạn đúng với những gì tôi cần.
Do nhu cầu báo cáo rõ ràng nên tôi cần bổ sung thêm cột điểm (cột c)
Làm phiền bạn và mọi người giúp đỡ tôi thêm số điểm tổng hợp ứng với từng mã Nhân viên như ở cột G với ạ.
Với hình ảnh đính kèm bên dưới tôi đang ví dụ minh họa cho 2 trường hợp tại CV01: NV0001[23];NV0002[20];
View attachment 246493
Sub XYZ()
Dim dic As Object, sArr(), aCV(), Arr As Variant, Res()
Dim sRow&, i&, k&, ik&, iKey$, iKey2$, tmp$
Set dic = CreateObject("scripting.dictionary")
With Sheets("TK")
sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value
aCV = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value
End With
sRow = UBound(sArr)
ReDim Preserve sArr(1 To sRow, 1 To 4)
For i = 1 To sRow
iKey2 = sArr(i, 2)
If Not dic.exists(iKey2) Then dic.Add iKey2, Array(0, ",")
Arr = dic.Item(iKey2)
iKey = sArr(i, 2) & "#" & sArr(i, 1)
If Not dic.exists(iKey) Then
dic.Add iKey, i
If sArr(i, 3) = 1 Then sArr(i, 4) = sArr(i, 1) Else sArr(i, 4) = sArr(i, 1) & "[" & sArr(i, 3) & "]"
Arr(0) = Arr(0) + 1
Arr(1) = Arr(1) & sArr(i, 4) & ","
Else
ik = dic.Item(iKey)
sArr(ik, 3) = sArr(i, 3) + sArr(ik, 3)
If sArr(ik, 3) = 1 Then tmp = sArr(i, 1) Else tmp = sArr(i, 1) & "[" & sArr(ik, 3) & "]"
Arr(1) = Replace(Arr(1), "," & sArr(ik, 4) & ",", "," & tmp & ",")
sArr(ik, 4) = tmp
End If
dic.Item(iKey2) = Arr
Next i
sRow = UBound(aCV)
ReDim Res(1 To sRow, 1 To 2)
For i = 1 To sRow
iKey2 = aCV(i, 1)
If dic.exists(iKey2) Then
Arr = dic.Item(iKey2)
Res(i, 1) = Arr(0)
Res(i, 2) = Mid(Arr(1), 2, Len(Arr(1)) - 2)
End If
Next i
Sheets("TK").Range("F2").Resize(sRow, 2) = Res
End Sub
Cảm ơn bạn rất nhiều, tôi thử code, kết quả không lấy lấy được những số lượng =1 giống như bài 17 bạn xem giúp ạ.Chạy code
Mã:Sub XYZ() Dim dic As Object, sArr(), aCV(), Arr As Variant, Res() Dim sRow&, i&, k&, ik&, iKey$, iKey2$, tmp$ Set dic = CreateObject("scripting.dictionary") With Sheets("TK") sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value aCV = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value End With sRow = UBound(sArr) ReDim Preserve sArr(1 To sRow, 1 To 4) For i = 1 To sRow iKey2 = sArr(i, 2) If Not dic.exists(iKey2) Then dic.Add iKey2, Array(0, ",") Arr = dic.Item(iKey2) iKey = sArr(i, 2) & "#" & sArr(i, 1) If Not dic.exists(iKey) Then dic.Add iKey, i If sArr(i, 3) = 1 Then sArr(i, 4) = sArr(i, 1) Else sArr(i, 4) = sArr(i, 1) & "[" & sArr(i, 3) & "]" Arr(0) = Arr(0) + 1 Arr(1) = Arr(1) & sArr(i, 4) & "," Else ik = dic.Item(iKey) sArr(ik, 3) = sArr(i, 3) + sArr(ik, 3) If sArr(ik, 3) = 1 Then tmp = sArr(i, 1) Else tmp = sArr(i, 1) & "[" & sArr(ik, 3) & "]" Arr(1) = Replace(Arr(1), "," & sArr(ik, 4) & ",", "," & tmp & ",") sArr(ik, 4) = tmp End If dic.Item(iKey2) = Arr Next i sRow = UBound(aCV) ReDim Res(1 To sRow, 1 To 2) For i = 1 To sRow iKey2 = aCV(i, 1) If dic.exists(iKey2) Then Arr = dic.Item(iKey2) Res(i, 1) = Arr(0) Res(i, 2) = Mid(Arr(1), 2, Len(Arr(1)) - 2) End If Next i Sheets("TK").Range("F2").Resize(sRow, 2) = Res End Sub
2 code kết quả giống i sì mờCảm ơn bạn rất nhiều, tôi thử code, kết quả không lấy lấy được những số lượng =1 giống như bài 17 bạn xem giúp ạ.
Mình chạy thử có thấy khác phần số điểm là 1 mà bạn.2 code kết quả giống i sì mờ
Nếu dùng Power pivot không qua trung gian Power query sao bạn không nhấn nút Add to Data Model ngay trên Ribbon luôn?Nếu đã dùng power pivot thì nên để source gốc trong Data model rồi dùng Dax xử lý, chứ bạn dùng PQ xử lý thì nó trả về cho 1 trường hợp riêng lẽ, thống kê cho các trường hợp khác thì lại phải tạo source khác từ source gốc rất bất tiện, bạn xem thử!
Office 2010 là Create linked tableRồi cũng không thấy mục Data Model luôn
Chào Bác em mới học vba,Có thắc mắc mong Bác giải thích cho.Em thấy các Bác khai bảo biến Dim sRow&, i&, k&, ik&, iKey$, iKey2$, tmp$ có thêm & , $ vậy Bác cho hỏi là các ký tự này có ý nghĩa,chức năng gì đặc biệt trong code không hay là để dễ phân biệt các biến ạ?Chạy code
Mã:Sub XYZ() Dim dic As Object, sArr(), aCV(), Arr As Variant, Res() Dim sRow&, i&, k&, ik&, iKey$, iKey2$, tmp$ Set dic = CreateObject("scripting.dictionary") With Sheets("TK") sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value aCV = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value End With sRow = UBound(sArr) ReDim Preserve sArr(1 To sRow, 1 To 4) For i = 1 To sRow iKey2 = sArr(i, 2) If Not dic.exists(iKey2) Then dic.Add iKey2, Array(0, ",") Arr = dic.Item(iKey2) iKey = sArr(i, 2) & "#" & sArr(i, 1) If Not dic.exists(iKey) Then dic.Add iKey, i If sArr(i, 3) = 1 Then sArr(i, 4) = sArr(i, 1) Else sArr(i, 4) = sArr(i, 1) & "[" & sArr(i, 3) & "]" Arr(0) = Arr(0) + 1 Arr(1) = Arr(1) & sArr(i, 4) & "," Else ik = dic.Item(iKey) sArr(ik, 3) = sArr(i, 3) + sArr(ik, 3) If sArr(ik, 3) = 1 Then tmp = sArr(i, 1) Else tmp = sArr(i, 1) & "[" & sArr(ik, 3) & "]" Arr(1) = Replace(Arr(1), "," & sArr(ik, 4) & ",", "," & tmp & ",") sArr(ik, 4) = tmp End If dic.Item(iKey2) = Arr Next i sRow = UBound(aCV) ReDim Res(1 To sRow, 1 To 2) For i = 1 To sRow iKey2 = aCV(i, 1) If dic.exists(iKey2) Then Arr = dic.Item(iKey2) Res(i, 1) = Arr(0) Res(i, 2) = Mid(Arr(1), 2, Len(Arr(1)) - 2) End If Next i Sheets("TK").Range("F2").Resize(sRow, 2) = Res End Sub
Lúc trước tôi thường connect trực tiếp từ data model, nhưng connect trực tiếp vậy có nhiều hạn chế, không append, merged, dynamic query.... được nên tôi chuyển sang connect bằng PQ trước sau đó mới add vào data model, sau này làm nhiều rồi quen mặc dù không có edit gì.Nếu dùng Power pivot không qua trung gian Power query sao bạn không nhấn nút Add to Data Model ngay trên Ribbon luôn?
View attachment 246731
Office 2010 là Create linked table
View attachment 246732
Mục đích giảm số ký tự khai báoChào Bác em mới học vba,Có thắc mắc mong Bác giải thích cho.Em thấy các Bác khai bảo biến Dim sRow&, i&, k&, ik&, iKey$, iKey2$, tmp$ có thêm & , $ vậy Bác cho hỏi là các ký tự này có ý nghĩa,chức năng gì đặc biệt trong code không hay là để dễ phân biệt các biến ạ?
Thử file nào ?Mình chạy thử có thấy khác phần số điểm là 1 mà bạn.
Mục đích giảm số ký tự khai báo
& long
$ string
# double
% hình như là interge
Bài đã được tự động gộp:
Thử file nào ?
Xem công thức kiểm tra trong fileChào bạn HieuCD
Mình thử file bài 12,chạy code bài 18 kết quả như sau (lấy được số điểm là 1) với công việc là CV10 :
NV0038[1],NV0041[1],NV0043[1],NV0045[1],NV0046[0.5],...
Còn code của bạn như sau (không lấy được số điểm là 1 với công việc là CV10:
NV0038,NV0041,NV0043,NV0045,NV0046[0.5],...
Cảm ơn bạn đã làm thêm chức năng so sánh giúp mình dễ quan sát, code mình lấy của bạn Snow25 là code ở bài 18 bạn ạ.Xem công thức kiểm tra trong file
Xóa bớt vài lệnhCảm ơn bạn đã làm thêm chức năng so sánh giúp mình dễ quan sát, code mình lấy của bạn Snow25 là code ở bài 18 bạn ạ.
Hình như là bạn đang lấy code ở bài 16 nên kết quả 2 code mới trùng nhau như vậy.
Sub XYZ()
Dim dic As Object, sArr(), aCV(), arr As Variant, Res()
Dim sRow&, i&, k&, ik&, iKey$, iKey2$, tmp$
Set dic = CreateObject("scripting.dictionary")
With Sheets("TK")
sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value
aCV = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value
End With
sRow = UBound(sArr)
ReDim Preserve sArr(1 To sRow, 1 To 4)
For i = 1 To sRow
iKey2 = sArr(i, 2)
If Not dic.exists(iKey2) Then dic.Add iKey2, Array(0, ",")
arr = dic.Item(iKey2)
iKey = sArr(i, 2) & "#" & sArr(i, 1)
If Not dic.exists(iKey) Then
dic.Add iKey, i
sArr(i, 4) = sArr(i, 1) & "[" & sArr(i, 3) & "]"
arr(0) = arr(0) + 1
arr(1) = arr(1) & sArr(i, 4) & ","
Else
ik = dic.Item(iKey)
sArr(ik, 3) = sArr(i, 3) + sArr(ik, 3)
tmp = sArr(i, 1) & "[" & sArr(ik, 3) & "]"
arr(1) = Replace(arr(1), "," & sArr(ik, 4) & ",", "," & tmp & ",")
sArr(ik, 4) = tmp
End If
dic.Item(iKey2) = arr
Next i
sRow = UBound(aCV)
ReDim Res(1 To sRow, 1 To 2)
For i = 1 To sRow
iKey2 = aCV(i, 1)
If dic.exists(iKey2) Then
arr = dic.Item(iKey2)
Res(i, 1) = arr(0)
Res(i, 2) = Mid(arr(1), 2, Len(arr(1)) - 2)
End If
Next i
Sheets("TK").Range("H2").Resize(sRow, 2) = Res
End Sub
Xin cảm ơn bạn đã giúp đỡ, mình chạy code này thấy khớp với kết quả code của bài 16 rồi.Xóa bớt vài lệnh
Mã:Sub XYZ() Dim dic As Object, sArr(), aCV(), arr As Variant, Res() Dim sRow&, i&, k&, ik&, iKey$, iKey2$, tmp$ Set dic = CreateObject("scripting.dictionary") With Sheets("TK") sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value aCV = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value End With sRow = UBound(sArr) ReDim Preserve sArr(1 To sRow, 1 To 4) For i = 1 To sRow iKey2 = sArr(i, 2) If Not dic.exists(iKey2) Then dic.Add iKey2, Array(0, ",") arr = dic.Item(iKey2) iKey = sArr(i, 2) & "#" & sArr(i, 1) If Not dic.exists(iKey) Then dic.Add iKey, i sArr(i, 4) = sArr(i, 1) & "[" & sArr(i, 3) & "]" arr(0) = arr(0) + 1 arr(1) = arr(1) & sArr(i, 4) & "," Else ik = dic.Item(iKey) sArr(ik, 3) = sArr(i, 3) + sArr(ik, 3) tmp = sArr(i, 1) & "[" & sArr(ik, 3) & "]" arr(1) = Replace(arr(1), "," & sArr(ik, 4) & ",", "," & tmp & ",") sArr(ik, 4) = tmp End If dic.Item(iKey2) = arr Next i sRow = UBound(aCV) ReDim Res(1 To sRow, 1 To 2) For i = 1 To sRow iKey2 = aCV(i, 1) If dic.exists(iKey2) Then arr = dic.Item(iKey2) Res(i, 1) = arr(0) Res(i, 2) = Mid(arr(1), 2, Len(arr(1)) - 2) End If Next i Sheets("TK").Range("H2").Resize(sRow, 2) = Res End Sub