- Tham gia
- 31/3/20
- Bài viết
- 180
- Được thích
- 43
Bạn quên mất phần nội quy là không được viết chữ in cả câu rồi: "GIÚP CODE LỌC TÊN HÀNG KHÔNG TRÙNG". Nên sửa lại nhé.Chào cả nhà GPE !
em cần 1 đoạn code lọc ra các tên hàng không trùng và đếm số lần xuất hiện. Xin chân thành cảm ơn
View attachment 239211
Thường đâu có kể gì nội quy hay người khác. Cách làm việc nào giờ là nói khích cho người ta làm giùm thôi.Bạn quên mất phần nội quy là không được viết chữ in cả câu rồi: "GIÚP CODE LỌC TÊN HÀNG KHÔNG TRÙNG". Nên sửa lại nhé.
Dùng công thức được không bạn?Chào cả nhà GPE !
em cần 1 đoạn code lọc ra các tên hàng không trùng và đếm số lần xuất hiện. Xin chân thành cảm ơn
View attachment 239211
Bài này có thể dùng Mảng, dùng Dic, Dùng advance uniqueDùng công thức được không bạn?
Hơi khó một chút vì cột B có 6 chữ A mà bảng tổng kết lại thành 5.
Cảm ơn bạn, nhưng về phần này thì mình đang ở giai đoạn: Dựa cột mà nghe.Bài này có thể dùng Mảng, dùng Dic, Dùng advance unique
Sub DemTong()
Dim i As Long, aDuLieu(), aKetQua(), Dic As Object, k As Long, J As Long, DieuKien As Variant
Set Dic = CreateObject("Scripting.Dictionary")
aDuLieu = Sheet1.Range("B3:B" & Sheet1.Cells(Sheet1.Rows.Count, "B").End(xlUp).Row).Value
ReDimaKetQua(1 To UBound(aDuLieu, 1), 1 To 2)
For i = 1 To UBound(aDuLieu, 1)
DieuKien = aDuLieu(i, 1)
If Dic.Exists(DieuKien) = False Then
k = k + 1
Dic.Add DieuKien, k
aKetQua(k, 1) = aDuLieu(i, 1)
aKetQua(k, 2) = 1
Else
J = Dic.Item(DieuKien)
aKetQua(J, 2) = aKetQua(J, 2) + 1
End If
Next
Sheet1.Range("D3:E10000").ClearContents
If k <> 0 Then Sheet1.Range("D3").Resize(k, 2).Value = aKetQua
End Sub
COde báo lỗi rồi SẾp ơiBạn thử Sub sau nhưng kết quả của A là 6 nên không hiểu cách thống kê của bạn
Mã:Sub DemTong() Dim i As Long, aDuLieu(), aKetQua(), Dic As Object, k As Long, J As Long, DieuKien As Variant Set Dic = CreateObject("Scripting.Dictionary") aDuLieu = Sheet1.Range("B3:B" & Sheet1.Cells(Sheet1.Rows.Count, "B").End(xlUp).Row).Value ReDimaKetQua(1 To UBound(aDuLieu, 1), 1 To 2) For i = 1 To UBound(aDuLieu, 1) DieuKien = aDuLieu(i, 1) If Dic.Exists(DieuKien) = False Then k = k + 1 Dic.Add DieuKien, k aKetQua(k, 1) = aDuLieu(i, 1) aKetQua(k, 2) = 1 Else J = Dic.Item(DieuKien) aKetQua(J, 2) = aKetQua(J, 2) + 1 End If Next Sheet1.Range("D3:E10000").ClearContents If k <> 0 Then Sheet1.Range("D3").Resize(k, 2).Value = aKetQua End Sub
Dòng này
Sửa thànhMã:ReDimaKetQua(1 To UBound(aDuLieu, 1), 1 To 2)
Xem còn lỗi nữa khôngMã:ReDim aKetQua(1 To UBound(aDuLieu, 1), 1 To 2)
Sub DemTong()
Dim i As Long, aDuLieu(), aKetQua(), Dic As Object, k As Long, J As Long, DieuKien As Variant
Set Dic = CreateObject("Scripting.Dictionary")
aDuLieu = Sheet1.Range("B3:B5000").Value
ReDim aKetQua(1 To UBound(aDuLieu, 1), 1 To 2)
For i = 1 To UBound(aDuLieu, 1)
DieuKien = aDuLieu(i, 1)
If Dic.exists(DieuKien) = False Then
k = k + 1
Dic.Add DieuKien, k
aKetQua(k, 1) = aDuLieu(i, 1)
aKetQua(k, 2) = 1
Else
J = Dic.Item(DieuKien)
aKetQua(J, 2) = aKetQua(J, 2) + 1
End If
Next
Range("D3:E10000").ClearContents
If k <> 0 Then Sheet1.Range("D3").Resize(k, 2).Value = aKetQua
End Sub
Vùng dữ liệu nếu bạn đặt thế kia thì thì thêm 1 điều kiện khác rỗng vàosao nó dư 1 dòng cuối
View attachment 239217
Mã:Sub DemTong() Dim i As Long, aDuLieu(), aKetQua(), Dic As Object, k As Long, J As Long, DieuKien As Variant Set Dic = CreateObject("Scripting.Dictionary") aDuLieu = Sheet1.Range("B3:B5000").Value ReDim aKetQua(1 To UBound(aDuLieu, 1), 1 To 2) For i = 1 To UBound(aDuLieu, 1) DieuKien = aDuLieu(i, 1) If Dic.exists(DieuKien) = False Then k = k + 1 Dic.Add DieuKien, k aKetQua(k, 1) = aDuLieu(i, 1) aKetQua(k, 2) = 1 Else J = Dic.Item(DieuKien) aKetQua(J, 2) = aKetQua(J, 2) + 1 End If Next Range("D3:E10000").ClearContents If k <> 0 Then Sheet1.Range("D3").Resize(k, 2).Value = aKetQua End Sub
Thử thay:sao nó dư 1 dòng cuối
View attachment 239217
Mã:Sub DemTong() Dim i As Long, aDuLieu(), aKetQua(), Dic As Object, k As Long, J As Long, DieuKien As Variant Set Dic = CreateObject("Scripting.Dictionary") aDuLieu = Sheet1.Range("B3:B5000").Value ReDim aKetQua(1 To UBound(aDuLieu, 1), 1 To 2) For i = 1 To UBound(aDuLieu, 1) DieuKien = aDuLieu(i, 1) If Dic.exists(DieuKien) = False Then k = k + 1 Dic.Add DieuKien, k aKetQua(k, 1) = aDuLieu(i, 1) aKetQua(k, 2) = 1 Else J = Dic.Item(DieuKien) aKetQua(J, 2) = aKetQua(J, 2) + 1 End If Next Range("D3:E10000").ClearContents If k <> 0 Then Sheet1.Range("D3").Resize(k, 2).Value = aKetQua End Sub
If k <> 0 Then Sheet1.Range("D3").Resize(k, 2).Value = aKetQua
If k <> 0 Then Sheet1.Range("D3").Resize(k - 1, 2).Value = aKetQua
Thử thay:
PHP:If k <> 0 Then Sheet1.Range("D3").Resize(k, 2).Value = aKetQua
bằng;
PHP:If k <> 0 Then Sheet1.Range("D3").Resize(k - 1, 2).Value = aKetQua
Sub LocTrungdem()
On Error Resume Next
Range("D3:E10000").ClearContents
Dim i As Long, k As Long, t As Long
Dim sArr(), dArr()
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = Range("B3:C200").Value 'input
ReDim dArr(1 To UBound(sArr), 1 To 2)
For i = 1 To UBound(sArr)
If Not Dic.exists(sArr(i, 1)) Then
k = k + 1
Dic(sArr(i, 1)) = k
dArr(k, 1) = sArr(i, 1): dArr(k, 2) = 1
Else
t = Dic.Item(sArr(i, 1))
dArr(t, 2) = dArr(t, 2) + 1
End If
Next
Range("d3").Resize(k - 1, 2) = dArr ' Ouput
Set Dic = Nothing
End Sub
đã xongCode bài #8 có mang một dấu ấn "GPE" tổ bố:
- Code dùng mảng đầu vào riêng biệt với mảng đầu ra chỉnh chu. Chỉ có dân code của GPE mới làm kiểu đó thôi.
Trong đề bài này, đầu ra không thể lớn hơn đầu vào. Vì vậy, một mảng đầu vào có thể dùng lại thành đầu ra.
Sub LocTrungdem()
On Error Resume Next
Range("D3:E10000").ClearContents
Dim i As Long, k As Long, t As Long
Dim sArr(), dArr()
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = Range("B3:C200").Value 'input
ReDim dArr(1 To UBound(sArr), 1 To 2)
For i = 1 To UBound(sArr)
If Not Dic.exists(sArr(i, 1)) Then
k = k + 1
Dic(sArr(i, 1)) = k
dArr(k, 1) = sArr(i, 1): dArr(k, 2) = 1
Else
t = Dic.Item(sArr(i, 1))
dArr(t, 2) = dArr(t, 2) + 1
End If
Next
Range("d3").Resize(k - 1, 2) = dArr ' Ouput
Set Dic = Nothing
End Sub
Em Vân chưa đủ tầm làm dân code đó được anh ạ !Code bài #8 có mang một dấu ấn "GPE" tổ bố:
- Code dùng mảng đầu vào riêng biệt với mảng đầu ra chỉnh chu. Chỉ có dân code của GPE mới làm kiểu đó thôi.
Trong đề bài này, đầu ra không thể lớn hơn đầu vào. Vì vậy, một mảng đầu vào có thể dùng lại thành đầu ra.
Code chạy vẫn bị đếm các ô là rỗng anh ạ.cảm ơn bạn
Mã:Sub LocTrungdem() On Error Resume Next Range("D3:E10000").ClearContents Dim i As Long, k As Long, t As Long Dim sArr(), dArr() Dim Dic As Object Set Dic = CreateObject("Scripting.dictionary") sArr = Range("B3:C200").Value 'input ReDim dArr(1 To UBound(sArr), 1 To 2) For i = 1 To UBound(sArr) If Not Dic.exists(sArr(i, 1)) Then k = k + 1 Dic(sArr(i, 1)) = k dArr(k, 1) = sArr(i, 1): dArr(k, 2) = 1 Else t = Dic.Item(sArr(i, 1)) dArr(t, 2) = dArr(t, 2) + 1 End If Next Range("d3").Resize(k - 1, 2) = dArr ' Ouput Set Dic = Nothing End Sub
Bài đã được tự động gộp:
đã xong
Mã:Sub LocTrungdem() On Error Resume Next Range("D3:E10000").ClearContents Dim i As Long, k As Long, t As Long Dim sArr(), dArr() Dim Dic As Object Set Dic = CreateObject("Scripting.dictionary") sArr = Range("B3:C200").Value 'input ReDim dArr(1 To UBound(sArr), 1 To 2) For i = 1 To UBound(sArr) If Not Dic.exists(sArr(i, 1)) Then k = k + 1 Dic(sArr(i, 1)) = k dArr(k, 1) = sArr(i, 1): dArr(k, 2) = 1 Else t = Dic.Item(sArr(i, 1)) dArr(t, 2) = dArr(t, 2) + 1 End If Next Range("d3").Resize(k - 1, 2) = dArr ' Ouput Set Dic = Nothing End Sub
Vân viết code thế là giỏi lắm rồi, bao người chưa học được tới mức của Vân !!!Em Vân chưa đủ tầm làm dân code đó được anh ạ !
Em Vân chưa đủ tầm làm dân code đó được anh ạ !
Tiết kiệm được 1 dòng Redim.Dùng 1 mảng:
Dim a As Variant, aNum As Long
Dim i As Long
' lưu ý: 2 cột
a = Range("B3:C" & Cells(Rows.Count, "B").End(xlUp).Row).Value
With CreateObject("Scripting.dictionary")
For i = 1 To UBound(a)
If a(i, 1) <> "" Then ' thớt mới thêm điều kiện này. Trước đó không có. File mẫu cũng không có
If Not .Exists(a(i, 1)) Then
aNum = aNum + 1 ' tổng số dòng kết quả
.Add (a(i, 1)), aNum
a(aNum, 1) = a(i, 1)
a(aNum, 2) = 1
Else
a(.Item(a(i, 1)), 2) = a(.Item(a(i, 1)), 2) + 1
End If
End If
Next i
End With
Range("D3").Resize(aNum, 2).Value = a
Dùng đít sần chỉ để đếm:
(lưu ý: Application.Transpose có giới hạn của nó. Khi dùng nên cẩn thận. Code chỉ có tính chất minh họa)
a = Range("B3:C" & Cells(Rows.Count, "B").End(xlUp).Row).Value
With CreateObject("Scripting.dictionary")
For i = 1 To UBound(a)
If a(i, 1) <> "" Then .Item(a(i, 1)) = .Item(a(i, 1)) + 1
Next i
Range("D3").Resize(.Count).Value = Application.Transpose(.Keys())
Range("E3").Resize(.Count).Value = Application.Transpose(.Items())
End With