Làm sao để Excel biết là có một cột nào đó trong Database được AutoFilter ?

Liên hệ QC

BNTT

Bùi Nguyễn Triệu Tường
Thành viên danh dự
Tham gia
3/7/07
Bài viết
4,946
Được thích
23,206
Nghề nghiệp
Dạy đàn piano
Tôi có 1 Database (trong Sheet1) gồm có 5 cột. Yêu cầu là: Khi tôi Autofilter bất kỳ cột nào trong Database này, thì copy cái phần đã được lọc trong cột thứ 1 của Database dán vào ô A1 của Sheet2. Dĩ nhiên là trước khi dán, xóa hết những gì đang có trong cột A của Sheet2.

Viết cái code để copy cái phần đã được lọc trong cột thứ 1 của Database dán vào ô A1 của Sheet2 và trước khi dán thì xóa hết những đang có trong cột A của Sheet2... tôi làm được.

Nhưng làm thế nào để Excel biết được là tôi vừa AutoFilter một cột nào đó trong cái Database này? (Chỉ khi nào AutoFilter một cột nào đó trong Database này thì mới chạy code trên, còn làm gì đó mà không phải là AutoFilter thì không chạy).

Nhờ các bạn giúp dùm.
 
Tôi có 1 Database (trong Sheet1) gồm có 5 cột. Yêu cầu là: Khi tôi Autofilter bất kỳ cột nào trong Database này, thì copy cái phần đã được lọc trong cột thứ 1 của Database dán vào ô A1 của Sheet2. Dĩ nhiên là trước khi dán, xóa hết những gì đang có trong cột A của Sheet2.

Viết cái code để copy cái phần đã được lọc trong cột thứ 1 của Database dán vào ô A1 của Sheet2 và trước khi dán thì xóa hết những đang có trong cột A của Sheet2... tôi làm được.

Nhưng làm thế nào để Excel biết được là tôi vừa AutoFilter một cột nào đó trong cái Database này? (Chỉ khi nào AutoFilter một cột nào đó trong Database này thì mới chạy code trên, còn làm gì đó mà không phải là AutoFilter thì không chạy).

Nhờ các bạn giúp dùm.
Cái này có đề cập đến trong bài này:
http://www.giaiphapexcel.com/forum/showthread.php?t=16961
Mấu chốt nằm ở chổ:
PHP:
With ActiveSheet.AutoFilter
    For i = 1 To .Filters.Count
       If .Filters(i).On then
          Làm việc gì đó
       End If
    Next
 End With
Trong trường hợp của bạn thì cái "việc gì đó" chính là COPY CỘT 1 TRONG VÙNG AUTOFILER
Làm thử xem!
 
Lần chỉnh sửa cuối:
Vậy... có phải nhét cái code đó vào đây không?
PHP:
Private Sub Worksheet_Calculate()
    With ActiveSheet.AutoFilter
        For i = 1 To .Filters.Count
           If .Filters(i).On Then
              (Làm gì đó)
           End If
        Next
    End With
End Sub
 
Ôi.... không được! Nếu như bỏ đoạn code của anh ndu96081631 vào trong cái sự kiện Worksheet_Calculate(), thì không phải mỗi khi AutoFilter thì code chạy, mà là mỗi khi làm cái gì đó trong file, Excel nó tính toán >>> code chạy ngay!

Em muốn rằng chỉ những khi em AutoFilter cột nào đó trong Database thì code mới chạy, còn nếu như em làm gì đó mà không phải là AutoFilter thì đừng có chạy cái code... Không chơi được cái Worksheet_Calculate()
 
Bạn có thể cụ thể yêu cầu bằng vd được không ?

Nguyên văn bởi BNTT
Tôi có 1 Database (trong Sheet1) gồm có 5 cột. Yêu cầu là: Khi tôi Autofilter bất kỳ cột nào trong Database này, thì copy cái phần đã được lọc trong cột thứ 1 của Database dán vào ô A1 của Sheet2. Dĩ nhiên là trước khi dán, xóa hết những gì đang có trong cột A của Sheet2.

Viết cái code để copy cái phần đã được lọc trong cột thứ 1 của Database dán vào ô A1 của Sheet2 và trước khi dán thì xóa hết những đang có trong cột A của Sheet2... tôi làm được.
Có thể cho tôi xem code bạn viết được không ? ( Để học thêm thôi) Cám ơn nhiều.

 
Chỉnh sửa lần cuối bởi điều hành viên:
Ôi.... không được! Nếu như bỏ đoạn code của anh ndu96081631 vào trong cái sự kiện Worksheet_Calculate(), thì không phải mỗi khi AutoFilter thì code chạy, mà là mỗi khi làm cái gì đó trong file, Excel nó tính toán >>> code chạy ngay!

Em muốn rằng chỉ những khi em AutoFilter cột nào đó trong Database thì code mới chạy, còn nếu như em làm gì đó mà không phải là AutoFilter thì đừng có chạy cái code... Không chơi được cái Worksheet_Calculate()
Đương nhiên nó như thế rồi, vì Excel không "cảm nhận" được bất cứ sự "thay đổi" nào khi bạn Filter ---> Chính vì lẽ đó mà ta phải:
- Muốn code chạy tự động với AutoFilter thì bắt buộc phải cho vào sự kiện Worksheet_Calculate
- Mà đã đưa vào sự kiện Worksheet_Calculate thì bắt buộc phải có 1 cell nào đó chứa công thức
===> Và giải pháp đơn giản nhất mà người ta thường làm là dùng hàm TODAY (tại 1 cell nào đó)
Bạn xem file đính kèm tại bài #5 của topic trên cũng có công thức đấy thôi (công thức nằm tại cell IV1)
--------------
Nói thêm 1 chút về "lổi" mà bạn BNTT vừa nêu:
- Giả sử rằng sau khi ta AutoFilter xong (Filter cột 2 chẳng hạn) thì code chạy... Sau đó ta cứ giử nguyên nội dung đã Filter ---> Vậy chỉ cần có 1 cell nào đó tham gia quá trình tính toán thì code lại chạy lần nữa (đương nhiên)
- Để khắc phục hiện tượng này có lẻ bạn phải kết hợp thêm với sự kiện Worksheet_SelectionChange ---> Tức nếu có tính toán + con trỏ chuột đặt vào vùng tiêu đề thì mới chạy code
vân vân... Đây chỉ là những gợi ý nhỏ, chắc ăn là phải xem tình hình cụ thể trong file đính kèm mới quyết định chính xác được
 
Lần chỉnh sửa cuối:
Ôi.... không được! Nếu như bỏ đoạn code của anh ndu96081631 vào trong cái sự kiện Worksheet_Calculate(), thì không phải mỗi khi AutoFilter thì code chạy, mà là mỗi khi làm cái gì đó trong file, Excel nó tính toán >>> code chạy ngay!

Em muốn rằng chỉ những khi em AutoFilter cột nào đó trong Database thì code mới chạy, còn nếu như em làm gì đó mà không phải là AutoFilter thì đừng có chạy cái code... Không chơi được cái Worksheet_Calculate()

Vậy thì như thế này cho dễ :

- Code sẽ chạy khi có sự kiện Calculate
- Khi chạy sẽ kiểm tra xem cột đó có đang Filter không?? Nếu không thì thì thoát, còn nếu đang Filter thì chạy.
- Chạy xong thì bỏ Filter cột đó.

Thân!
 
Vậy thì như thế này cho dễ :

- Code sẽ chạy khi có sự kiện Calculate
- Khi chạy sẽ kiểm tra xem cột đó có đang Filter không?? Nếu không thì thì thoát, còn nếu đang Filter thì chạy.
- Chạy xong thì bỏ Filter cột đó.

Thân!
Cách này rất gọn nhưng có 2 nhược điểm nhỏ:
- Mình Filter mà chẳng thấy nó filter tí nào (không kịp nhìn)
- Mình không thể filter 2 cột cùng lúc ---> Cái này quan trọng nhất
 
Tôi xin đề xuất 1 cách khác: Dùng AutoFilter (hoặc Advanced Filter) nhưng thông qua 1 vài Object khác để thực hiện (chẳng hạn là ComboBox) ---> Khi các Object này hoạt động thì sẽ AutoFilter theo đúng ý đồ, đồng thời làm những công việc gì đó tùy thích ---> Đàng nào cũng đã sử dụng code, giờ cải biên 1 tí, tôi nghĩ không có vấn đề (quan trọng là tránh chạy nhầm)
Bạn BNTT thấy sao?
 
Tôi xin đề xuất 1 cách khác: Dùng AutoFilter (hoặc Advanced Filter) nhưng thông qua 1 vài Object khác để thực hiện (chẳng hạn là ComboBox) ---> Khi các Object này hoạt động thì sẽ AutoFilter theo đúng ý đồ, đồng thời làm những công việc gì đó tùy thích ---> Đàng nào cũng đã sử dụng code, giờ cải biên 1 tí, tôi nghĩ không có vấn đề (quan trọng là tránh chạy nhầm)
Bạn BNTT thấy sao?
Em cũng đang nghĩ như anh. Sẽ dùng vài ô với Consolidate (chứa những danh sách cần lọc của Database), rồi gán sự kiện Workbook_Change cho các ô này. Khi thay đổi giá trị các ô này, Workbook_Change sẽ chạy cái code gọi Autofilter và làm những việc mình muốn.

Em nói thật, đây chỉ là những ý tưởng cho một dự án, tìm ra những phương án tối ưu, chứ chưa có một dự án cụ thể nào, nên không có file ví dụ. Mục đích của em khi mở topic này chính là làm sao để Excel biết được (hay chụp được) mình vừa AutoFilter một Database. Nhưng có lẽ Excel không có khả năng này, nên chắc phải tìm đường vòng khác...
 
Web KT
Back
Top Bottom