littlecat1987
Thành viên mới

- Tham gia
- 12/12/10
- Bài viết
- 48
- Được thích
- 0


. . . , bây giờ mình muốn lọc dữ liệu báo cáo theo sale thì nên sửa code như thế nào? bạn giúp mình thêm nha!


Thanks bạn nhưng ý mình muốn là trong sheet báo cáo chỉ cần đánh mã sale là có thể lọc ra được những khách hàng của sale đó.
Với đề tài tương tự. mình đang sử dụng code sau để lọc theo ngày nhưng tốc độ chậm quá .nhờ các bạn xem có cách nào khác lọc cho tốc độ nhanh hơn không trợ giúp mình với và nếu lọc được từ ngày đến ngày càng tốt (file kèm)
Xin cảm ơn
Tham khảo theo link trên em đọc một ngày rồi cả một rừng Code em hiểu được chắc khoãng 5 năm nữa quá.code Dic hay Collection...em cũng mê lắm đọc riết trên GPE và tải File về vọc chơi những vẫn thấy nó còn đang nằm trên chín tầng mây ấy Anh ạBạn đến đây tham khảo đi:
http://www.giaiphapexcel.com/forum/...NXT-với-tốc-độ-nhanh-nhất-dữ-liệu-65-532-dòng
Theo mình bạn có chí ít 2 lưa chọn:
AdvancedFilter
Làm theo cách của VODOI2X
Chúc thành công!
Sheet1, cột I, từ I5:I184 là Text chứ không phải Date, bạn phải sửa lại cho thống nhất kiểu dữ liệu.với đề tài tương tự. mình đang sử dụng code sau để lọc theo ngày nhưng tốc độ chậm quá .nhờ các bạn xem có cách nào khác lọc cho tốc độ nhanh hơn không trợ giúp mình với và nếu lọc được từ ngày đến ngày càng tốt (file kèm)
Xin cảm ơn
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("I2").Address Then
lOC_NGAY
End If
End Sub
'*************
Sub lOC_NGAY()
Application.ScreenUpdating = False
startTime = Time
Dim cell
For Each cell In Range("I5:I5000") 'neu sua thanh("I5:I1048570")thi loc cham qua cham
cell.EntireRow.Hidden = True
If cell Like Range("I2") Then
cell.EntireRow.Hidden = False
End If
Next cell
Application.ScreenUpdating = True
MsgBox "Total Time: " & Format((Time - startTime), "hh:mm:ss"), , "Test Toc Do"
End Sub
text là do minh dùng ADO ghi vào đó đấy khi mình lấy dữ liệu lên lọc mới chuyển sang date...Sheet1, cột I, từ I5:I184 là Text chứ không phải Date, bạn phải sửa lại cho thống nhất kiểu dữ liệu.
Tôi đã xoá bớt dòng trong sheet DATA cho nhẹ file, bạn copy lại dữ liệu thật đến khoảng 1 triệu dòng thử xem.
Lọc sang 1 sheet khác, thay đổi ô I2 hoặc I3 để lọc.




Cả 2 Sub đều đâu có ra kết quả đúng đâu. Vì cột ngày tháng loạn 12 sứ quân rồitrước đây một thời gian mình cũng đã úp bài tại đây với đề tài lọc Dữ Liệu theo ngày đã được Anh Bate trợ giúp viết code cho lọc bằng mảng.
sau một thời gian mình tập làm quen với Dictionary hôm nay mình viết code lọc theo ngày bằng dic không hiểu code sai hay thiếu gì mà không lọc ra được ngày mong muốn. suy nghĩ riết hai hôm nay mà không ra được kết quả . vì vậy mình xin úp lên đây nhờ các bạn kiểm tra và trợ giúp cho mình hoàn thiện code lọc theo ngày Bằng Dic
xin cảm ơn
em đang hoc mà anh.ngay loan la do em copy tu file ADO ghi vào đó nên nó loạn đấy. vậy phải bỏ dic thiệt sao anhCả 2 Sub đều đâu có ra kết quả đúng đâu. Vì cột ngày tháng loạn 12 sứ quân rồi
Còn riêng cái Dic thì sai từ căn bản luôn. Biến i, j loạn cào cào rồi. Vả lại lọc theo ngày thì không sử dụng Dic, không phù hợp đâu
em đang hoc mà anh.ngay loan la do em copy tu file ADO ghi vào đó nên nó loạn đấy. vậy phải bỏ dic thiệt sao anh
Sub Loc_Ngay_Dic()
Dim nguon(), KQ(1 To 65536, 1 To 10), i As Long, j As Long, fDate, eDate, NGAY As String
.............................
For[COLOR=#ff0000] j = 1 [/COLOR]To 10
If nguon(i, 9) <> "" Then
If nguon(i, 9) >= fDate And nguon(i, 9) <= eDate Then
NGAY = (nguon(i, 9))
If .Exists(NGAY) Then
[COLOR=#ff0000] j = j + 1[/COLOR]
....................................
End Sub
1) Ngày tháng trong file của bạn có một ít ở trái đất, một ít ở.......hành tinh khác nên ông Bill hông nhận biết đượcem đang hoc mà anh.ngay loan la do em copy tu file ADO ghi vào đó nên nó loạn đấy. vậy phải bỏ dic thiệt sao anh




Thật ra để xử lý thì cũng chẳng khó khăn gì, thêm 1 dòng lệnh vào nữa thôi là bình định được 12 sứ quân đó thôi.em đang hoc mà anh.ngay loan la do em copy tu file ADO ghi vào đó nên nó loạn đấy. vậy phải bỏ dic thiệt sao anh
Đã dùng ADO để ghi dữ liệu sao không dùng luôn ADO để trích xuất dữ liệu? Mà ghi dữ liệu bằng ADO có thể bạn có dữ liệu nguồn là file Access hay CSDL tại sao không xử lý trên đó mà quay ra Excel làm gì?text là do minh dùng ADO ghi vào đó đấy khi mình lấy dữ liệu lên lọc mới chuyển sang date...
1) Ngày tháng trong file của bạn có một ít ở trái đất, một ít ở.......hành tinh khác nên ông Bill hông nhận biết được
2) Dạng bài này dùng Dic hình như không hợp, mình đề nghị bạn sử dụng bộ lọc cho nó nhẹ nhàng ( nếu chưa biết làm thì réo Ba Tê hoặc Quang Hải nhé)
Thân
mình sử dung hai file . file a ghi vào file b khi cần dữ liệu thì lấy lên sau đó lọc theo ngày. ngày loạn la do mình copy lại từ file b do ADO ghi vào đó nên ngày nó sai đi.Đã dùng ADO để ghi dữ liệu sao không dùng luôn ADO để trích xuất dữ liệu? Mà ghi dữ liệu bằng ADO có thể bạn có dữ liệu nguồn là file Access hay CSDL tại sao không xử lý trên đó mà quay ra Excel làm gì?
Mặt khác bạn nói vô lý quá: Dùng ADO để ghi dữ liệu mà kiểu định dạng Text, Date có thể cùng ghi vào một trường được hay sao?
Nếu bạn đã biết về ADO thì bạn chỉ cần dùng truy vấn dạngmình sử dung hai file . file a ghi vào file b khi cần dữ liệu thì lấy lên sau đó lọc theo ngày. ngày loạn la do mình copy lại từ file b do ADO ghhi vào đó nên ngày nó sai đi.
mình cũng định lấy ngày bằng ADO nhưng kiến thức Ado cửa mình còn kém quá không làm được
Select * From [Table] Where [Field1]>= Fromdate and [Field2]<= Todate
Loc kiểu này, không cần lọc duy nhất cho một "cái gì đó" thì Dictionary làm gì nhỉ?anh Bate thi làm cho em lọc bằng mảng rồi còn anh cò va anh hải làm dùm em mỗi người một kiểu đi để em học với. năm tới nếu đi sinh nhật GPE nữa em chúc anh tự quay số rồi chúng thưởng như anh bate nhé hôm đó em sẽ mời anh nhậu vài tăng nữa .không xỉn ko về... mà xỉn rồi thì về sao anh
em ngồi cạnh anh hải đó. em đoán anh khoãng U40 thôi đó
Loc kiểu này, không cần lọc duy nhất cho một "cái gì đó" thì Dictionary làm gì nhỉ?
Thằng nào đúng điều kiện thì lấy, hổng đúng thì bỏ qua, như code dùng mảng là được rồi.
Chỉ khi lọc duy nhất theo "ẻm" nào đó, tính tổng (hay gì đó) cho cái "ẻm" này thì mới nhờ đến "Dic".
Túm lại, bài này không cần "Dic".
-------------------------------------
Ủa? SN GPE TPHCM vừa rồi có bạn tham dự sao? Cho xin một ảnh nào đó có bạn xem, đáng tiếc là tôi không làm quen hết được tất cả các bạn có mặt trong buổi SN.




Với dữ liệu này phải dùng code này đinh dạnh lại ngày tháng, nếu không thì cái code mảng cũng đi hoang luônLoc kiểu này, không cần lọc duy nhất cho một "cái gì đó" thì Dictionary làm gì nhỉ?
Thằng nào đúng điều kiện thì lấy, hổng đúng thì bỏ qua, như code dùng mảng là được rồi.
Chỉ khi lọc duy nhất theo "ẻm" nào đó, tính tổng (hay gì đó) cho cái "ẻm" này thì mới nhờ đến "Dic".
Túm lại, bài này không cần "Dic".
Nếu muốn kiểu khác thì nhờ anh Hải làm kiểu Advanced Filter chắc "trúng".
Anh Cò thì "mần" kiểu "đốc lon". Ẹc...
-------------------------------------
Ủa? SN GPE TPHCM vừa rồi có bạn tham dự sao? Cho xin một ảnh nào đó có bạn xem, đáng tiếc là tôi không làm quen hết được tất cả các bạn có mặt trong buổi SN.
Sub ChangeDateFormat()
Dim data(), i As Long
data = Range([I5], [I65536].End(3)).Value
For i = 1 To UBound(data)
data(i, 1) = DateValue(data(i, 1))
Next
[I5].Resize(i - 1) = data
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [P1:P2]) Is Nothing Then
[A4:J10000].AdvancedFilter 2, [W4:W5], [L4:U4]
End If
End Sub
Sub LOC_MANG()
Dim sArr(), dArr(), i As Long, j As Long, k As Long
Dim fDate As Long, eDate As Long, chk As Variant
With Sheet1
sArr = .Range(.[A5], .[B65536].End(3)).Resize(, 10).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 10)
fDate = .[P1].Value: eDate = .[P2].Value
For i = 1 To UBound(sArr, 1)
chk = sArr(i, 9)
If Not IsNumeric(chk) Then sArr(i, 9) = DateValue(chk)
If DateValue(chk) >= fDate Then
If DateValue(chk) <= eDate Then
k = k + 1
For j = 1 To 10
dArr(k, j) = sArr(i, j)
Next j
End If
End If
Next i
If k Then .[L5].Resize(k, 10) = dArr
End With
End Sub
mình ghi vào bằng code này do HLMT viết choNếu bạn đã biết về ADO thì bạn chỉ cần dùng truy vấn dạng
Mã:Select * From [Table] Where [Field1]>= Fromdate and [Field2]<= Todate
Mà bạn cũng nên xem xét lại cách ghi dữ liệu bằng ADO sao lại để tồn tại những trường hợp ngày tháng, Text lẫn lộn trên 1 trường được. Đó không phải kiểu cơ sở dữ liệu chuẩn. Sẽ khó khăn cho việc quản lý.
cái vụ ChangeDateFormat này em tự làm được mà.còn vụ lọc AdvancedFilter thì anh chỉ em hôm rồi . em cũng sử được luôn mà. và vụ mãng thì Anh bate làm cho rồi hiện đang sử dụng rất tốt. vấn đề là em đang muốn hoc dic hay dung ADO lọc ngày trực tiếp lên thôi anh...Với dữ liệu này phải dùng code này đinh dạnh lại ngày tháng, nếu không thì cái code mảng cũng đi hoang luôn
Sau khi định dạng ngày tháng rồi thì mọi chuyện đã đơn giảnPHP:Sub ChangeDateFormat() Dim data(), i As Long data = Range([I5], [I65536].End(3)).Value For i = 1 To UBound(data) data(i, 1) = DateValue(data(i, 1)) Next [I5].Resize(i - 1) = data End Sub
Dùng AD filter là nhẹ nhàng. Tại W5 nhập công thức này =AND($I5>=$P$1,$I5<=$P$2)
Sau đó xài code này để lọc >>> Xong
Xíu nữa quên, phải tạo dòng tiêu đề cho 10 cột đó nhaPHP:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, [P1:P2]) Is Nothing Then [A4:J10000].AdvancedFilter 2, [W4:W5], [L4:U4] End If End Sub
****
Còn nếu nhất định phải xài mảng vì lý do abc nào đó thì xử lý bằng code này, dữ liệu gốc không thay đổi gì cả
PHP:Sub LOC_MANG() Dim sArr(), dArr(), i As Long, j As Long, k As Long Dim fDate As Long, eDate As Long, chk As Variant With Sheet1 sArr = .Range(.[A5], .[B65536].End(3)).Resize(, 10).Value ReDim dArr(1 To UBound(sArr, 1), 1 To 10) fDate = .[P1].Value: eDate = .[P2].Value For i = 1 To UBound(sArr, 1) chk = sArr(i, 9) If Not IsNumeric(chk) Then sArr(i, 9) = DateValue(chk) If DateValue(chk) >= fDate Then If DateValue(chk) <= eDate Then k = k + 1 For j = 1 To 10 dArr(k, j) = sArr(i, j) Next j End If End If Next i If k Then .[L5].Resize(k, 10) = dArr End With End Sub
Nếu muốn nghiên cứu, học hỏi về Dictionary trên GPE thì cứ gõ "Dictionary" vào ô tìm kiếm, ít nhất cũng tìm được cái này, và còn nhiều nhiều nữa.cái vụ ChangeDateFormat này em tự làm được mà.còn vụ lọc AdvancedFilter thì anh chỉ em hôm rồi . em cũng sử được luôn mà. và vụ mãng thì Anh bate làm cho rồi hiện đang sử dụng rất tốt. vấn đề là em đang muốn hoc dic hay dung ADO lọc ngày trực tiếp lên thôi anh...
Sub LocDuLieu()
Dim Cnn As Object, Rs As Object, Fdate As Date, Tdate As Date
Fdate = Sheet1.[I2].Value2
Tdate = Sheet1.[I3].Value2
Set Cnn = CreateObject("ADODB.Connection")
With Cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No;"""
.Open
Set Rs = .Execute("Select F1,F2,F3,F4,F5,F6,F7,F8 From [Sheet1$B5:I65536] Where F8 Between #" & Format(DateSerial(Year(Fdate), Month(Fdate), Day(Fdate)), "mm/dd/yyyy") _
& "# And #" & Format(DateSerial(Year(Tdate), Month(Tdate), Day(Tdate)), "mm/dd/yyyy") & "#")
Sheet2.Range("B2:B65536").ClearContents
Sheet2.Range("B2").CopyFromRecordset Rs
Cnn.Close: Set Cnn = Nothing
End With
End Sub
Nếu bạn dành về ADO thì bạn giúp mình lọc ngày bằng ADO lấy từ file data lên nhé.còn code trên chạy rất tốt nhưng chỉ trên cùng một file thôi thì phảiNếu bạn thích ADO thì xài tạm cái này
Mã:Sub LocDuLieu() Dim Cnn As Object, Rs As Object, Fdate As Date, Tdate As Date Fdate = Sheet1.[I2].Value2 Tdate = Sheet1.[I3].Value2 Set Cnn = CreateObject("ADODB.Connection") With Cnn .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No;""" .Open Set Rs = .Execute("Select F1,F2,F3,F4,F5,F6,F7,F8 From [Sheet1$B5:I65536] Where F8 Between #" & Format(DateSerial(Year(Fdate), Month(Fdate), Day(Fdate)), "mm/dd/yyyy") _ & "# And #" & Format(DateSerial(Year(Tdate), Month(Tdate), Day(Tdate)), "mm/dd/yyyy") & "#") Sheet2.Range("B2:B65536").ClearContents Sheet2.Range("B2").CopyFromRecordset Rs Cnn.Close: Set Cnn = Nothing End With End Sub
Sub LocDuLieu()
Dim Cnn As Object, Rs As Object, Fdate As Date, Tdate As Date
Fdate = Sheet2.[I2].Value2
Tdate = Sheet2.[I3].Value2
Set Cnn = CreateObject("ADODB.Connection")
With Cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & "\data.xlsb" & ";Extended Properties=""Excel 12.0;HDR=No;"""
.Open
Set Rs = .Execute("Select F1,F2,F3,F4,F5,F6,F7,F8,F9,F10 From [DataBan$A2:J65536] Where F9 Between #" & Format(DateSerial(Year(Fdate), Month(Fdate), Day(Fdate)), "mm/dd/yyyy") _
& "# And #" & Format(DateSerial(Year(Tdate), Month(Tdate), Day(Tdate)), "mm/dd/yyyy") & "#")
Sheet1.Range("A3:B65536").ClearContents
Sheet1.Range("A3").CopyFromRecordset Rs
Cnn.Close: Set Cnn = Nothing
End With
End Sub