- 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
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
Sub dadad()
Dim a As Variant, aNum As Long
Dim i As Long
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 di?u ki?n này. Tru?c dó không có. File m?u cung 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:E1000").ClearContents
Range("D3").Resize(aNum, 2).Value = a
End Sub
Thử chi. Từ o-ka dến 100% xa lắm. Phải tét 1000 lần trong phòng thí nghiệm.
Sub Codelocdem()
Dim a As Variant, aNum As Long
Dim i As Long
a = Range("B3:C5000").Value
With CreateObject("Scripting.dictionary")
.CompareMode = vbTextCompare ' BO DONG NAY de phan biet chu hoa chu thuong
For i = 1 To UBound(a)
If a(i, 1) <> "" Then
If Not .Exists(a(i, 1)) Then
aNum = aNum + 1
.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:E1000").ClearContents
Range("D3").Resize(aNum, 2).Value = a
End Sub
Bạn nhập tên như vậy nhưng excel nó tự động chuyển thành sang dạng lỗi.Bạn nhập vào với định dạng text là được.Mà đây là code viết cho bạn không việc gì phải thông báo tin buồn.Nếu muốn sửa thì thêm câu lệnh kiểm tra là được.Đã test rất Kỷ và Thông báo 1 tin buồn. Code vẫn bị lổi khi tôi cố tinh nhập 1 text có tên là #NAME?
( Đó là 1 tên tôi tự gõ từ bàn phím chứ không phải là 1 công thức sai cú pháp trả về )
View attachment 239263
Mã:Sub Codelocdem() Dim a As Variant, aNum As Long Dim i As Long a = Range("B3:C5000").Value With CreateObject("Scripting.dictionary") .CompareMode = vbTextCompare ' BO DONG NAY de phan biet chu hoa chu thuong For i = 1 To UBound(a) If a(i, 1) <> "" Then If Not .Exists(a(i, 1)) Then aNum = aNum + 1 .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:E1000").ClearContents Range("D3").Resize(aNum, 2).Value = a End Sub
tÔI muốn nó đúng với bất cứ Text nào . Ví dụ như hình bên dưới
View attachment 239266
Nó thực sự đúng với bất cứ "Text" nào....
tÔI muốn nó đúng với bất cứ Text nào . ...
Mình có đọc bài của bạn. Mình thấy cái cách bạn hỏi, phản hồi với các anh chị thật chán bạn ạ. Mình ở tư thế đi nhờ sự trợ giúp mà bạn ăn nói chả có đầu có đũa gì cả.Đã test rất Kỷ và Thông báo 1 tin buồn. Code vẫn bị lổi khi tôi cố tinh nhập 1 text có tên là #NAME?
( Đó là 1 tên tôi tự gõ từ bàn phím chứ không phải là 1 công thức sai cú pháp trả về )
View attachment 239263
Mã:Sub Codelocdem() Dim a As Variant, aNum As Long Dim i As Long a = Range("B3:C5000").Value With CreateObject("Scripting.dictionary") .CompareMode = vbTextCompare ' BO DONG NAY de phan biet chu hoa chu thuong For i = 1 To UBound(a) If a(i, 1) <> "" Then If Not .Exists(a(i, 1)) Then aNum = aNum + 1 .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:E1000").ClearContents Range("D3").Resize(aNum, 2).Value = a End Sub
tÔI muốn nó đúng với bất cứ Text nào . Ví dụ như hình bên dưới
View attachment 239266
Ủa bạn chưa biết hả.Mình có đọc bài của bạn. Mình thấy cái cách bạn hỏi, phản hồi với các anh chị thật chán bạn ạ. Mình ở tư thế đi nhờ sự trợ giúp mà bạn ăn nói chả có đầu có đũa gì cả.
Trong C++ bất cứ ký tự nào nhập được trong từ Inphut bàn phím được tạm gọi là Text. bác nên đi học lại đi. Phát biểu trật lất mà đòi dạy đời người taNó thực sự đúng với bất cứ "Text" nào.
Báo "tin buồn" cho bạn là bạn làm việc với Excel bao lâu nay mà không biết cách phân biệt thế nào là một "Text".
Về học lại Excel, cách gõ text, và mặc định trước khi đua đòi cốt kiếc VBA.
Mình có đọc bài của bạn. Mình thấy cái cách bạn hỏi, phản hồi với các anh chị thật chán bạn ạ. Mình ở tư thế đi nhờ sự trợ giúp mà bạn ăn nói chả có đầu có đũa gì cả.
[/QUOTE
Không liên quan đến bạn. Bạn lượn đi cho khác cho nước trong cái
Next đi chổ khác dùm cái. Không biết đầu đuôi mà phán như đúng rồiMình có đọc bài của bạn. Mình thấy cái cách bạn hỏi, phản hồi với các anh chị thật chán bạn ạ. Mình ở tư thế đi nhờ sự trợ giúp mà bạn ăn nói chả có đầu có đũa gì cả.
hi. Cách bạn ăn nói biết bạn là người thế nào rồi, ra xã hội mà có thái độ này chả ai chơi với đâu bạn ạ. Học là người khó lắm, có nhiều người gần hết nửa đời vẫn phải học lại từ đầu bài học làm người.Trong C++ bất cứ ký tự nào nhập được trong từ Inphut bàn phím được tạm gọi là Text. bác nên đi học lại đi. Phát biểu trật lất mà đòi dạy đời người ta
Bài đã được tự động gộp:
Bài đã được tự động gộp:
Next đi chổ khác dùm cái. Không biết đầu đuôi mà phán như đúng rồi
Báo "tin buồn" cho bạn là bạn làm việc với Excel bao lâu nay mà không biết cách phân biệt thế nào là một "Text".Ủa bạn chưa biết hả.
Người ta không có "nhờ". Thực sự ra là người ta tạo cơ hội cho các thành viên khác trên GPE "tích đức". Và vì vậy, người ta có quyền trịch thượng và các người khác muốn tu công tích đức (tôi không có nói lái nhé) có bổn phận phải chìu chuộng.
Ở đây ai cũng biết danh thớt này.
Rừng nào cọp nấy. Ở với Excel thì nói theo ngữ cảnh Excel. Dốt Excel còn bày đặt đem cái khác ra loè thiên hạ.Trong C++ bất cứ ký tự nào nhập được trong từ Inphut bàn phím được tạm gọi là Text. bác nên đi học lại đi. Phát biểu trật lất mà đòi dạy đời người ta
Cao thủ C++ này làm việc dự án tỷ đồng. Nhưng lại đi nhặt các code miễn phí trên mạng để sử dụng.hi. Cách bạn ăn nói biết bạn là người thế nào rồi, ra xã hội mà có thái độ này chả ai chơi với đâu bạn ạ. Học là người khó lắm, có nhiều người gần hết nửa đời vẫn phải học lại từ đầu bài học làm người.
Không tốn tiền bạc và cũng không tốn công, tốn sức mà lụm lúa thì quá thơm đi chứ.Cao thủ C++ này làm việc dự án tỷ đồng. Nhưng lại đi nhặt các code miễn phí trên mạng để sử dụng.
Diễn đàn giờ hiếm người như này lắm. Cần bảo tồn bạn à
Tôi mách code cho tác giả bài #8. Thớt thực ra chỉ mót lúa.Không tốn tiền bạc và cũng không tốn công, tốn sức mà lụm lúa thì quá thơm đi chứ.