Lỗi copy sau khi autofilter

Liên hệ QC

spacemanforever

Thành viên hoạt động
Tham gia
8/10/08
Bài viết
113
Được thích
71
Chào các anh!
em có 1 file excel gồm 2 sheet :
---Sheet chart là sheet cần lấy số liệu sau khi autofilter.
---Sheet data là sheet chứa số liệu tổng hợp.
)*&^)
Em đã viết được code lọc:
PHP:
Private Sub OK_Click()
Dim ch As ChartObject
Dim dt1, dt2 As Date
 Set data = Sheets("data")
      dt1 = DTPicker1.Value
      dt2 = DTPicker2.Value
 Application.ScreenUpdating = False
 Sheets("chart").Range("A1:IV65536").Clear
 If dt1 > dt2 Then
                  MsgBox "Start date always less than End date"
   Else
       With data
                .Select
                .AutoFilterMode = False
                .Range("A4").AutoFilter Field:=1, Criteria1:=">=" & dt1, _
                          Operator:=xlAnd, Criteria2:="<=" & dt2
                .Range("A4").Offset(1).SpecialCells(12).Copy Sheets("chart").[a65535].End(xlUp).Offset(1)
        '.Range("A4").AutoFilter
      End With
   Unload Me
 End If
 Sheets("chart").Select
 Application.ScreenUpdating = True
End Sub
khi chọn số liệu từ dtpicker1 và 2 lần lượt 17-17/10/2010, 16-16/10/2010, 16-17/10/2010, 17-18/10/2010 thì ok.
Nhưng khi chọn là 16-18/10/2010 lại không chạy như mong muốn.
Mong mọi người hỗ trợ.
 

File đính kèm

Chào các anh!
em có 1 file excel gồm 2 sheet :
---Sheet chart là sheet cần lấy số liệu sau khi autofilter.
---Sheet data là sheet chứa số liệu tổng hợp.

khi chọn số liệu từ dtpicker1 và 2 lần lượt 17-17/10/2010, 16-16/10/2010, 16-17/10/2010, 17-18/10/2010 thì ok.
Nhưng khi chọn là 16-18/10/2010 lại không chạy như mong muốn.
Mong mọi người hỗ trợ.
Lưu ý rằng tại sheet Data, cột Date của bạn chỉ là TEXT, chẳng có cell nào là 1 Date thật sự ---> AutoFilter nó sai cũng là chuyện đương nhiên
Muốn gì thì muốn, dữ liệu phải CHUẨN trước rồi hẳn bàn tiếp
 
Upvote 0
Lưu ý rằng tại sheet Data, cột Date của bạn chỉ là TEXT, chẳng có cell nào là 1 Date thật sự ---> AutoFilter nó sai cũng là chuyện đương nhiên
Muốn gì thì muốn, dữ liệu phải CHUẨN trước rồi hẳn bàn tiếp
Em đã format lại cột Date rồi nhưng vẫn bị như vậy.
MOng Anh hỗ trợ.
 

File đính kèm

Upvote 0
Em đã format lại cột Date rồi nhưng vẫn bị như vậy.
MOng Anh hỗ trợ.
Bạn muốn biết dữ liệu Date của bạn có chuẩn hay không, hay dùng hàm ISNUMBER để kiểm tra... Ví dụ, để kiểm tra xem cell A5 có phải là Date chuẩn hay không, ta dùng hàm =ISNUMBER(A5) ---> Nếu nó trả về kết quả = TRUE là tốt, ngược lại nếu nó trả về kết quả = FALSE thì.. phải xem lại ---> Đó chỉ là TEXT bình thường thôi
(Hổng hiểu bạn đã sửa thế nào mà MÈO VẪN HOÀN MÈO)
 
Upvote 0
Em đã format lại cột Date rồi nhưng vẫn bị như vậy.
MOng Anh hỗ trợ.

Ngày tháng của bạn đang ở đạng Text
1. Gõ số 1 vào cell bất kỳ ngoài bảng, Copy Cell đó
2. Đánh dấu vùng dữ liệu ngày tháng -> Paste Special -> Mục Operation bạn chọn Multiply -> OK
3. Định dạng lại ngày tháng
 
Upvote 0
Ngày tháng của bạn đang ở đạng Text
1. Gõ số 1 vào cell bất kỳ ngoài bảng, Copy Cell đó
2. Đánh dấu vùng dữ liệu ngày tháng -> Paste Special -> Mục Operation bạn chọn Multiply -> OK
3. Định dạng lại ngày tháng
Không chắc được đâu (có thể trên máy bạn dùng thao tác ấy OK vì Control Panel của máy bạn đang mặc định dd/mm/yyyy)
Tôi đoán máy tính của tác giả đang mặc định mm/dd/yyyy đấy ---> Vì thế đành để cho tác giả tự sửa vậy (cho nhớ lâu)
 
Upvote 0
Không chắc được đâu (có thể trên máy bạn dùng thao tác ấy OK vì Control Panel của máy bạn đang mặc định dd/mm/yyyy)
Tôi đoán máy tính của tác giả đang mặc định mm/dd/yyyy đấy ---> Vì thế đành để cho tác giả tự sửa vậy (cho nhớ lâu)
--Em đã định dạng được dd/mm/yyyy.
---Cho em hỏi cách định dạng của anh dat_butmut dựa trên nguyên tắc nào tại sao lại copy 1 rồi ....định dạng--->em định dạng được theo cách này (nhưng chưa hiểu). Ban đầu từ số liệu của range (A5:A33), em right click->format cell-> Date->chọn dd/mm/yyyy nhưng không được.
Em đã sữa được như ý (format), nhưng kết quả chạy autofilte lại không có kết quả.
Mong các anh hỗ trợ.
 

File đính kèm

Upvote 0
--Em đã định dạng được dd/mm/yyyy.
---Cho em hỏi cách định dạng của anh dat_butmut dựa trên nguyên tắc nào tại sao lại copy 1 rồi ....định dạng--->em định dạng được theo cách này (nhưng chưa hiểu). Ban đầu từ số liệu của range (A5:A33), em right click->format cell-> Date->chọn dd/mm/yyyy nhưng không được.
Em đã sữa được như ý (format), nhưng kết quả chạy autofilte lại không có kết quả.
Mong các anh hỗ trợ.
Để AutoFilter hoạt động chính xác, bạn phải khai báo dt1dt2 thuộc biến Long chứ không nên là Date. Cụ thế như sau:
PHP:
Private Sub OK_Click()
  Dim Data As Range, dt1 As Long, dt2 As Long
  Set Data = Sheets("Data").Range("A4").CurrentRegion
  dt1 = DTPicker1.Value: dt2 = DTPicker2.Value
  Application.ScreenUpdating = False
  Sheets("Chart").Range("A6:G60000").Clear
  If dt1 > dt2 Then
    MsgBox "Start date always less than End date"
  Else
    With Data
      .AutoFilter 1, ">=" & dt1, xlAnd, "<=" & dt2
      .Offset(1).SpecialCells(12).Copy Sheets("Chart").[A6]
      .AutoFilter
    End With
    Unload Me
   End If
   Sheets("Chart").Select
 Application.ScreenUpdating = True
End Sub
Còn nếu cố tình khai báo dt1dt2 as Date thì phải sửa đoạn:
.AutoFilter 1, ">=" & dt1, xlAnd, "<=" & dt2
thành:
.AutoFilter 1, ">=" & CLng(dt1), xlAnd, "<=" & CLng(dt2)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
---Cho em hỏi cách định dạng của anh dat_butmut dựa trên nguyên tắc nào tại sao lại copy 1 rồi ....định dạng--->em định dạng được theo cách này (nhưng chưa hiểu).
Cách định dạng của dat_butmut dựa trên nguyên tắc này:
Giả sử ở khối ô nào đó, A1:A10 chẳng hạn, có các loại dữ liệu:
1) Số (number)
2) Text "thực sự" (có chứa các kí tự như a, b,... ,(hay khoảng trắng ở giữa))
3) "hơi giống số" như: '2435, 23427 (đằng trước có khoảng trắng) hoặc khi gõ là số nhưng lại định dạng là text
4) Rỗng
Khi bạn copy ô chứa số 1 rồi dán đặc biệt (Paste Special) với lựa chọn Operation - Multiply (tạm hiểu: Phép toán - Nhân) vào khối ô A1:A10 thì Excel sẽ làm như sau:
- Những ô chứa Text "thực sự" vẫn giữ nguyên
- Các ô chứa số vẫn như cũ (vì nhân với 1 mà!)
- Các ô chứa dữ liệu "hơi giống số" sẽ được tự động chuyển thành số và nhân với 1
- Các ô rỗng sẽ được hiểu là chứa số 0 và nhân với 1
Tóm lại, khi copy một ô chứa dữ liệu số rồi dán Paste Special vào một khối ô nào đó với lựa chọn Operation - Multiply vào một khối ô nào đó thì Excel sẽ lấy dữ liệu số, "hơi giống số", rỗng của các ô trong khối, tự chuyển đổi theo cách của nó (như đã nói ở trên) rồi nhân với 1. Riêng các ô chứa dữ liệu Text "thực sự" thì ... không làm gì cả.
 
Upvote 0
Để AutoFilter hoạt động chính xác, bạn phải khai báo dt1dt2 thuộc biến Long chứ không nên là Date. Cụ thế như sau:
PHP:
Private Sub OK_Click()
  Dim Data As Range, dt1 As Long, dt2 As Long
  Set Data = Sheets("Data").Range("A4").CurrentRegion
  dt1 = DTPicker1.Value: dt2 = DTPicker2.Value
  Application.ScreenUpdating = False
  Sheets("Chart").Range("A6:G60000").Clear
  If dt1 > dt2 Then
    MsgBox "Start date always less than End date"
  Else
    With Data
      .AutoFilter 1, ">=" & dt1, xlAnd, "<=" & dt2
      .Offset(1).SpecialCells(12).Copy Sheets("Chart").[A6]
      .AutoFilter
    End With
    Unload Me
   End If
   Sheets("Chart").Select
 Application.ScreenUpdating = True
End Sub
Còn nếu cố tình khai báo dt1dt2 as Date thì phải sửa đoạn:
.AutoFilter 1, ">=" & dt1, xlAnd, "<=" & dt2
thành:
.AutoFilter 1, ">=" & CLng(dt1), xlAnd, "<=" & CLng(dt2)

anh xem lại dùm file anh gởi em down về chạy cũng không được.
 
Upvote 0
Dùng DTPicker mình cũng chưa rành lắm. Thêm 1 dòng code thử
Nó luôn báo là 1899 dù khai dt1 là long hay date.
Hay trong thuộc tính DTPicker có thông số gì.
Dùng DTPicker cũng hay ghê. NDU hd giúp nhé. Cám ơn!
 
Upvote 0
anh xem lại dùm file anh gởi em down về chạy cũng không được.
Ẹc... Ẹc... Code ở bài trên thì đúng, còn code trong file lại sai 1 tí (tôi quên chưa sửa)
Tải lại file ở bài trên nhé
------------------------------
Dùng DTPicker mình cũng chưa rành lắm. Thêm 1 dòng code thử

Nó luôn báo là 1899 dù khai dt1 là long hay date.
Hay trong thuộc tính DTPicker có thông số gì.
Dùng DTPicker cũng hay ghê. NDU hd giúp nhé. Cám ơn!
Lỗi do tôi!
Lý ra thì
dt1 = DTPicker1.Value: dt2 = DTPicker2.Value
Mà tôi lại ghi:
dt1 = Val(DTPicker1.Value): dt2 = Val(DTPicker2.Value)
Đã sửa lại, ThuNghi thử lại lần nữa xem!
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh!
Từ đây em muốn tạo massage box báo autofilter (nghĩa là lúc này trong sheet data chưa có ngày đó) không có giá trị thì làm thế nào?
Cụ thể là:
Trong sheet data giả sử có dữ liệu ngày 16,17,18/10/2010, lúc này sẽ xảy ra các trường hợp như sau:
***ngày chọn autofilter nằm trong khỏang 16-18/10 ---> vấn đề này không bàn
***ngày chọn từ autofilter nằm ngoài hoàn toàn vd: ta chọn 19-25/10 ----> msgbox báo số liệu không có (em chưa code được).
***ngày chọn từ autofilter nằm có 1 đoạn trong và ngoài. vd: +ta chọn 18-19/10 (có ngày 18---> báo dữ liệu ngày 19/10 không tồn tại)
+14-18/10 (có ngày 16-18/10---> báo dữ liệu 14,15/10 không tồn tại)

Cảm ơncác anh.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào anh!
Từ đây em muốn tạo massage box báo autofilter (nghĩa là lúc này trong sheet data chưa có ngày đó) không có giá trị thì làm thế nào?
Cụ thể là:
Trong sheet data giả sử có dữ liệu ngày 16,17,18/10/2010, lúc này sẽ xảy ra các trường hợp như sau:
***ngày chọn autofilter nằm trong khỏang 16-18/10 ---> vấn đề này không bàn
***ngày chọn từ autofilter nằm ngoài hoàn toàn vd: ta chọn 19-25/10 ----> msgbox báo số liệu không có (em chưa code được).
***ngày chọn từ autofilter nằm có 1 đoạn trong và ngoài. vd: +ta chọn 18-19/10 (có ngày 18---> báo dữ liệu ngày 19/10 không tồn tại)
+14-18/10 (có ngày 16-18/10---> báo dữ liệu 14,15/10 không tồn tại)

Cảm ơncác anh.
ai biết hỗ trợ em với
thanks
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom