babe_nice
Thành viên chính thức


- Tham gia
- 30/8/09
- Bài viết
- 89
- Được thích
- 9
em cám ơn anh..Thêm file cho bạn nhé! Lúc nãy quên chưa đính file
Với 30000 dòng dữ liệu, nếu khoảng 10000 dòng đạt yêu cầu phải tô màu thì đây là cả vấn đề vì màu mè là làm việc trực tiếp trên sheet, nếu có thể thì bạn nên đổi cách nhận kết quảem cám ơn anh..
Nhưng không đơn giản thế ạ
( cái này do em giải thích kém )
em nói rõ hơn:
tức là khi em lọc 1, ra những giá trị trong cột A xuất hiện lớn hơn 1 lần
sau đó mới xét nhưng giá trị đó tương ứng với Ma CH chỉ xuất hiện 1 lần.
Ví dụ, bây giờ em sửa ô C14 = R là kết quả ở cột F13 nhảy sai. Mặc dù F13 là kết quả đúng.
P/S: với lại em nghĩ, nếu dữ liệu hơn 30.000 dòng, excel chạy " từ từ" lắm ạ. Em test rồi ạ, nên giải pháp = code thì hợp lý hơn
Public Sub MauMau()
Dim Vung, Tam, I, Wf, Dic, K, kK, M
Application.ScreenUpdating = False
Set Vung = Range([A3], [A50000].End(xlUp)).Resize(, 3): Set Wf = Application.WorksheetFunction
Set Dic = CreateObject("scripting.dictionary")
ReDim M(1 To Vung.Rows.Count, 1 To 1)
For I = 1 To Vung.Rows.Count
If Wf.CountIf(Vung.Columns(1), Vung(I, 1)) > 1 Then
Tam = Vung(I, 1) & Vung(I, 3)
If Not Dic.exists(Tam) Then
K = K + 1: Dic.Add Tam, K: M(K, 1) = Vung(I, 3).Address
Else
kK = Dic.Item(Tam): M(kK, 1) = ""
End If
End If
Next I
Vung.Columns(3).Interior.ColorIndex = xlNone
For I = 1 To UBound(M)
If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6
Next I
Application.ScreenUpdating = True
End Sub
em cám ơn anh concogia:Với 30000 dòng dữ liệu, nếu khoảng 10000 dòng đạt yêu cầu phải tô màu thì đây là cả vấn đề vì màu mè là làm việc trực tiếp trên sheet, nếu có thể thì bạn nên đổi cách nhận kết quả
Viết thử thôi, có mấy dòng dữ liệu nó chạy xoẹt là xong nhưng 30000 thì....má ơi. Híc
Thân
Mã:Public Sub MauMau() Dim Vung, Tam, I, Wf, Dic, K, kK, M Application.ScreenUpdating = False Set Vung = Range([A3], [A50000].End(xlUp)).Resize(, 3): Set Wf = Application.WorksheetFunction Set Dic = CreateObject("scripting.dictionary") ReDim M(1 To Vung.Rows.Count, 1 To 1) For I = 1 To Vung.Rows.Count If Wf.CountIf(Vung.Columns(1), Vung(I, 1)) > 1 Then Tam = Vung(I, 1) & Vung(I, 3) If Not Dic.exists(Tam) Then K = K + 1: Dic.Add Tam, K: M(K, 1) = Vung(I, 3).Address Else kK = Dic.Item(Tam): M(kK, 1) = "" End If End If Next I Vung.Columns(3).Interior.ColorIndex = xlNone For I = 1 To UBound(M) If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6 Next I Application.ScreenUpdating = True End Sub
em chào anh.Tôi thật sự không hiểu ý bạn. Tôi thay C14 = R, kết quả đúng mà. Cột Ma CH chữ R xuất hiện 2 lần (theo của bạn là 1 lần mới lọc) nên loại luôn. Đâu đưa vào kết quả đâu?
Đúng như anh concogia dự, hơn 30 ngàn dòng, code tô màu chậm rồi...Với 30000 dòng dữ liệu, nếu khoảng 10000 dòng đạt yêu cầu phải tô màu thì đây là cả vấn đề vì màu mè là làm việc trực tiếp trên sheet, nếu có thể thì bạn nên đổi cách nhận kết quả
Viết thử thôi, có mấy dòng dữ liệu nó chạy xoẹt là xong nhưng 30000 thì....má ơi. Híc
Thân
Mã:Public Sub MauMau() Dim Vung, Tam, I, Wf, Dic, K, kK, M Application.ScreenUpdating = False Set Vung = Range([A3], [A50000].End(xlUp)).Resize(, 3): Set Wf = Application.WorksheetFunction Set Dic = CreateObject("scripting.dictionary") ReDim M(1 To Vung.Rows.Count, 1 To 1) For I = 1 To Vung.Rows.Count If Wf.CountIf(Vung.Columns(1), Vung(I, 1)) > 1 Then Tam = Vung(I, 1) & Vung(I, 3) If Not Dic.exists(Tam) Then K = K + 1: Dic.Add Tam, K: M(K, 1) = Vung(I, 3).Address Else kK = Dic.Item(Tam): M(kK, 1) = "" End If End If Next I Vung.Columns(3).Interior.ColorIndex = xlNone For I = 1 To UBound(M) If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6 Next I Application.ScreenUpdating = True End Sub
If M(I, 1) <> "" Then Range(M(I, 1)).Interior.ColorIndex = 6
Tôi hiểu ý bạn rồi. Nếu 1 cửa hàng mà có nhiều hơn 1 hóa đơn trùng nhau thì là sai phải không?em chào anh.
Những mã ở Cột A xuất hiện lớn hơn 1. Sau đó chỉ xét những mã đó thôi.
Thôi, em nói luôn công việc thực tế: tìm xem Hóa đơn nào xuất hiện hơn 1 lần, với điều kiện chỉ xuất hiện ở 1 Cửa hàng thì được, nếu xuất hiện ở 2 Cửa hàng khác nhau thi có cách phát hiện vì đây là sai. ( màu )
trong file có giải thích không vẩy ? hay phải tự đoán ?(em gửi File đính kèm, có bổ sung thêm 1 dấu hiệu nữa )
Nhưng sửa thì báo lỗi...
ẹc,...em đang trên " mây ", em xin lỗi.
Trong file bổ sung rồi ạ, ngắn gọn, không dài dòng ạ )
Public Sub hello()
Dim arr, r As Long, Dic As Object
arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value
Set Dic = CreateObject("scripting.dictionary")
For r = 1 To UBound(arr) Step 1
Dic(arr(r, 1)) = Dic(arr(r, 1)) + 1
Dic(arr(r, 1) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 3)) + 1
Next
Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone
For r = 1 To UBound(arr) Step 1
If Dic(arr(r, 1)) > 1 Then
If Dic(arr(r, 1) & ";" & arr(r, 3)) = 1 Then
If arr(r, 4) = "x" Then
Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6
End If
End If
End If
Next
End Sub
teng..teng..code gọn gàng..không dùng countif...Mã:Public Sub hello() Dim arr, r As Long, Dic As Object arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value Set Dic = CreateObject("scripting.dictionary") For r = 1 To UBound(arr) Step 1 Dic(arr(r, 1)) = Dic(arr(r, 1)) + 1 Dic(arr(r, 1) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 3)) + 1 Next Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone For r = 1 To UBound(arr) Step 1 If Dic(arr(r, 1)) > 1 Then If Dic(arr(r, 1) & ";" & arr(r, 3)) = 1 Then If arr(r, 4) = "x" Then Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6 End If End If End If Next End Sub
Em nhờ anh giúp đỡ thêm yêu cầu:Mã:Public Sub hello() Dim arr, r As Long, Dic As Object arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value Set Dic = CreateObject("scripting.dictionary") For r = 1 To UBound(arr) Step 1 Dic(arr(r, 1)) = Dic(arr(r, 1)) + 1 Dic(arr(r, 1) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 3)) + 1 Next Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone For r = 1 To UBound(arr) Step 1 If Dic(arr(r, 1)) > 1 Then If Dic(arr(r, 1) & ";" & arr(r, 3)) = 1 Then If arr(r, 4) = "x" Then Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6 End If End If End If Next End Sub
Em nhờ anh giúp đỡ thêm yêu cầu:
- em muốn tìm số Hóa đơn ( cột A), kết hợp cả ký hiệu ( cột B) xuất hiện lớn hơn 1, với điều kiện phải thuộc Ma ST/CH chỉ xuất hiện 1 lần. ( code cũ ,em đang chỉnh lại nhưng chưa ra...++)
- Vùng F:H hiện ra những số hóa đon tìm thấy( NHƯ VÍ DỤ )
Public Sub hello()
Dim arr, r As Long, Dic As Object, k As Long, dArr
arr = Sheet1.Range("A3:D" & Sheet1.[A1000000].End(xlUp).Row).Value
ReDim dArr(1 To UBound(arr), 1 To 3)
Set Dic = CreateObject("scripting.dictionary")
For r = 1 To UBound(arr) Step 1
Dic(arr(r, 1) & ";" & arr(r, 2)) = Dic(arr(r, 1) & ";" & arr(r, 2)) + 1
Dic(arr(r, 1) & ";" & arr(r, 2) & ";" & arr(r, 3)) = Dic(arr(r, 1) & ";" & arr(r, 2) & ";" & arr(r, 3)) + 1
Next
Sheet1.Range("C3:C" & UBound(arr) + 2).Interior.ColorIndex = xlNone
Sheet1.Range("F3:H" & UBound(arr) + 2).ClearContents
Sheet1.Range("D3:D" & UBound(arr) + 2).ClearContents
For r = 1 To UBound(arr) Step 1
If Dic(arr(r, 1) & ";" & arr(r, 2)) > 1 Then
If Dic(arr(r, 1) & ";" & arr(r, 2) & ";" & arr(r, 3)) = 1 Then
Sheet1.Range("C" & r + 2).Interior.ColorIndex = 6
Sheet1.Range("D" & r + 2) = "x"
k = k + 1
dArr(k, 1) = "'" & arr(r, 1)
dArr(k, 2) = arr(r, 2)
dArr(k, 3) = arr(r, 3)
End If
End If
Next
If k > 0 Then Sheet1.Range("F3").Resize(k, 3).Value = dArr
End Sub