Xin code tạo hàm mảng giống hàm Filter trong Office 365

Liên hệ QC

thukhon2014

Thành viên hoạt động
Tham gia
6/2/17
Bài viết
169
Được thích
96
Chào Anh/Em,
Hiện tại mình đang cần một hàm tự tạo giống hàm Filter trong Office 365, do hiện tại máy mình sài là máy Công ty nên không được phép cài file ngoài xin AE giúp đỡ !
 
Chào Anh/Em,
Hiện tại mình đang cần một hàm tự tạo giống hàm Filter trong Office 365, do hiện tại máy mình sài là máy Công ty nên không được phép cài file ngoài xin AE giúp đỡ !
Mình chưa dùng hàm Filte bao giờ à.Mục đích của bạn dùng để làm gì.
 
Upvote 0
Mình chưa dùng hàm Filte bao giờ à.Mục đích của bạn dùng để làm gì.
Mình sử dụng hàm Filter để trích lọc dữ liệu từ 1 bảng gốc ra 1 vùng khác theo 1 điều kiện nào đó, khi dữ liệu trong bảng gốc thay đổi thì bảng kia cũng sẽ thay đổi theo. Thay vì phải dùng Advanced liên tục hoặc VBA thay đổi vùng, Mình muốn có 1 hàm giống Filter để áp dụng được cho nhiều trường hợp
 
Upvote 0
Nếu dữ liệu lấy ra <=200 dòng thì bạn dùng BS_VLOOKUP của A-Tools free (tìm trên mạng bạn biết rõ về nó) chạy trên các phiên bản Excel từ Excel XP->Excel 2019, 365. Nhiều hơn thì cần pro. Tôi chia sẻ vậy vì kỹ thuật hàm trả về mảng viết rất khó, nó không phải viết hàm thông thường đâu, người ta phải tự xây dựng một cơ chế tính toán mà cách Excel không có sẵn.
 
Upvote 0
Chào Anh/Em,
Hiện tại mình đang cần một hàm tự tạo giống hàm Filter trong Office 365, do hiện tại máy mình sài là máy Công ty nên không được phép cài file ngoài xin AE giúp đỡ !
Sao không dùng luôn trong office 365

còn code cho excel offline thì làm được nhưng tự mở rộng thì sẽ khó (nhưng cái đó cũng chỉ là về trình bày, còn trong tính toán thì quan trọng là giá trị)
 
Upvote 0
Sao không dùng luôn trong office 365

còn code cho excel offline thì làm được nhưng tự mở rộng thì sẽ khó (nhưng cái đó cũng chỉ là về trình bày, còn trong tính toán thì quan trọng là giá trị)

Không đơn giản đâu. Bạn thử share code lên cho bạn ấy và mọi người xem nhé.
 
Upvote 0
Cũng rất đơn giản, ta dùng Hàm WinAPI để thực hiện trong VBA:

Tạo một callback Function gửi function này vào một vùng nhớ.
Function này sẽ được gọi lại và sẽ thực hiện Filter từ hàm được gọi và dữ liệu sẽ trả vào bảng tính, sau đó phải kết thúc hàm gọi để Excel không bị "chết" do tràn bộ nhớ.

Lý do vì sao phải dùng WinApi: không có cách nào bình thường để một hàm UDF thực hiện trong bảng tính gọi trở lại một thủ tục khác trong VBA.

Nếu một lập viên hiểu sâu về WinApi và VBA sẽ hiểu được những gì mình nói ở đây.

Mình chỉ hướng dẫn thôi, có chút "lười" trong người.


Như anh @Nguyễn Duy Tuân đọc những gì mình nói chắc chắn là anh ấy hiểu.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình là người viết hàm loại này thành công từ những năm 2007 và chưa bao giờ thấy dễ cả (theo tiêu chuẩn chạy được, ổn định, co giãn,...) nên rất muốn xem cụ thể ai đó làm thử có thể có cách khác dễ hơn mình làm :) .
 
Upvote 0
Mình là người viết hàm loại này thành công từ những năm 2007 và chưa bao giờ thấy dễ cả (theo tiêu chuẩn chạy được, ổn định, co giãn,...) nên rất muốn xem cụ thể ai đó làm thử có thể có cách khác dễ hơn mình làm :) .
Thực ra bài này cũng liên quan chút ít đến cái bài hôm trước anh em mình nói về C++, C# và delphi.

Các Hàm Mảng Động Excel sau khi gõ xong sẽ do một tiến trình đứng chờ để xử lý được viết bằng C++.
Sau khi xử lý dữ liệu xong nó sẽ trả ngược vào bảng tính.

Thì bây giờ mình không thể Viết Addin hay ứng dụng ngoài thì chỉ có thể dựa vào VBA.

Tuy nhiên VBA quá chậm để làm nên điều kì diệu là mảng động trong Excel.
Hoặc nếu viết được Hàm Filter với C++ hoặc C# build thành thư viện liên kết động, và khai báo động bằng Declare Lib thì có lẽ sẽ tuyệt vời hơn một xíu.

Ở đây em sẽ ví dụ cho anh Tuân về xlwings và Python, Excel gọi hàm Python thông qua xlwings, xlwings là "kẻ chờ đợi và làm thuê", xlwings gọi các hàm trong thư viện của nó được build từ C++, các hàm trong thư viện này sẽ thực thi "giao tiếp" với Excel để gửi và nhận dữ liệu sau khi được tính toán bởi Python.

Ở đây VBA là Python, WinAPI là "nhịp cầu để bắt nhịp" cho lần gọi lại bởi VBA, VBA thông qua thư viện Excel Application để giao tiếp với Excel.

Cũng chỉ có một cơ chế 1.
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra bài này cũng liên quan chút ít đến cái bài hôm trước anh em mình nói về C++, C# và delphi.

Các Hàm Mảng Động Excel sau khi gõ xong sẽ do một tiến trình đứng chờ để xử lý được viết bằng C++.
Sau khi xử lý dữ liệu xong nó sẽ trả ngược vào bảng tính.

Thì bây giờ mình không thể Viết Addin hay ứng dụng ngoài thì chỉ có thể dựa vào VBA.

Tuy nhiên VBA quá chậm để làm nên điều kì diệu là mảng động trong Excel.
Hoặc nếu viết được Hàm Filter với C++ hoặc C# build thành thư viện liên kết động, và khai báo động bằng Declare Lib thì có lẽ sẽ tuyệt vời hơn một xíu.

Ở đây em sẽ ví dụ cho anh Tuân về xlwings và Python, Excel gọi hàm Python thông qua xlwings, xlwings là "kẻ chờ đợi và làm thuê", xlwings gọi các hàm trong thư viện của nó được build từ C++, các hàm trong thư viện này sẽ thực thi "giao tiếp" với Excel để gửi và nhận dữ liệu sau khi được tính toán bởi Python.

Ở đây VBA là Python, WinAPI là xlwings, VBA thông qua thư viện Excel Application để giao tiếp với Excel.

Chỉ cũng có một cơ chế 1.

Khi viết chỉ để chạy ra mảng thuần không khó lắm với một số người có kiến thức tốt lập trình đặc biệt về hệ thống và API. Cái khó mà mình hay nói ở đây là hàm có tính co giãn với thuộc tính chèn dòng, cột kiểu như INSERT=YES khi đó rất nhiều phát sinh phải xử lý. Và có sự giằng co nhau giữa các công thức có hàm mảng trong sheet, Có thể vì hướng đến sự ổn định cho số đông, và nhẹ nhàng cho support, giảm rủi ro ứng dụng mà cả Google Sheet và Excel 365 đều phải tránh không có thuộc tính INSERT trong các hàm mảng. Nếu để ý các hàm đổ ra mảng, khi có dữ liệu khác phía dưới bảng kết quả, kiểu footer, nếu thay đổi điều kiện để bảng dữ liệu này tràn ra thì Google Sheet sẽ lỗi N/A (có thể không chính xác tên lỗi), Excel 365 sẽ giữ lại ô đầu tiên với "#SPILL.
Mình khuyên các bạn khác mới biết hoặc chỉ biết thuần lập trình VBA lao vào món này sẽ rất vất vả thay vì làm cái nút bấm hay macro gì đó chạy và đổ dữ liệu cho xong.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi viết chỉ để chạy ra mảng thuần không khó lắm với một số người có kiến thức tốt lập trình đặc biệt về hệ thống và API. Cái khó mà mình hay nói ở đây là hàm có tính co giãn với thuộc tính chèn dòng, cột kiểu như INSERT=YES khi đó rất nhiều phát sinh phải xử lý. Và có sự giằng co nhau giữa các công thức có hàm mảng trong sheet, Có thể vì hướng đến sự ổn định cho số đông, và nhẹ nhàng cho support, giảm rủi ro ứng dụng mà cả Google Sheet và Excel 365 đều phải tránh không có thuộc tính INSERT trong các hàm mảng. Nếu để ý các hàm đổ ra mảng, khi có dữ liệu khác phía dưới bảng kết quả, kiểu footer, nếu thay đổi điều kiện để bảng dữ liệu này tràn ra thì Google Sheet sẽ lỗi N/A (có thể không chính xác tên lỗi), Excel 365 sẽ giữ lại ô đầu tiên với "#SPILL.
Mình khuyên các bạn khác mới biết hoặc chỉ biết thuần lập trình VBA lao vào món này sẽ rất vất vả thay vì làm cái nút bấm hay macro gì đó chạy và đổ dữ liệu cho xong.
Nếu bỏ công ra viết ứng dụng, thì trong quá trình phát triển đương nhiên sẽ đúc kết và hoàn thiện được dự án của mình. Và có những thành quả đạt được.
 
Upvote 0
Chủ bài đăng xem thử file này (Hàm mảng UDF)

Bạn có thể nhập thêm tên NV & mã đến khi nào hàm mảng còn cho phép!
 

File đính kèm

  • UDF.rar
    23.5 KB · Đọc: 116
Upvote 0
@SA_DQ Hàm mảng động VBA do Bác viết sẽ gặp trường hợp mà anh Tuân đã nói.
Bước tạo hàm mảng Ctrl+Shift+Enter sẽ khóa mảng không cho thay đổi kích thước , chèn, hoặc xóa dòng cột.


Nếu chủ bài đăng không yêu cầu cao hơn, thì hàm của Bác SA_DQ đủ để áp dụng Filter.
 
Upvote 0
Chủ bài đăng xem thử file này (Hàm mảng UDF)

Bạn có thể nhập thêm tên NV & mã đến khi nào hàm mảng còn cho phép!
Mình cảm ơn sự giúp đỡ của bạn, Code này hiện chạy 1 cột điều kiện và 1 cột lọc, mình có cách nào để mở rộng nó ra thành nhiều cột của toàn vùng DATA mình chọn được không bạn !
Bài đã được tự động gộp:

@SA_DQ Hàm mảng động VBA do Bác viết sẽ gặp trường hợp mà anh Tuân đã nói.
Bước tạo hàm mảng Ctrl+Shift+Enter sẽ khóa mảng không cho thay đổi kích thước , chèn, hoặc xóa dòng cột.


Nếu chủ bài đăng không yêu cầu cao hơn, thì hàm của Bác SA_DQ đủ để áp dụng Filter.
Mình biết tạo ra một hàm co dãn theo mảng không phải dễ, mình mong muốn chỉ cần có 1 hàm gần gần giống vs Code của bạn @SA_DQ nhưng có thể chọn được vùng cần lọc và giá trị trả về là toàn bộ cột trong vùng chọn, Đại khái như này TimKiem(Điều kiện, Vùng điều kiện, cột chứa điều kiện) = giá trị trả về là toàn bộ cột có chứa dòng là các điều kiện thỏa mãn. Có thể lỗi #NA ở những vùng không có giá trị
Bài đã được tự động gộp:

Nếu dữ liệu lấy ra <=200 dòng thì bạn dùng BS_VLOOKUP của A-Tools free (tìm trên mạng bạn biết rõ về nó) chạy trên các phiên bản Excel từ Excel XP->Excel 2019, 365. Nhiều hơn thì cần pro. Tôi chia sẻ vậy vì kỹ thuật hàm trả về mảng viết rất khó, nó không phải viết hàm thông thường đâu, người ta phải tự xây dựng một cơ chế tính toán mà cách Excel không có sẵn.
Mình biết bộ công cụ này, nó rất mạnh và mình cũng rất thích nó. Nhưng khổ là chỉ máy mình cài, máy mấy phòng ban khác không có dùng, nên khi mình sài công thức trong đó cho file thì chuyển qua máy khác không cài nó lại không nhận được công thức, Nên mình mong muốn có Function VBA cho mọi người ai cũng dùng được a !
 
Lần chỉnh sửa cuối:
Upvote 0
Không đơn giản đâu. Bạn thử share code lên cho bạn ấy và mọi người xem nhé.
Đọc lại đi, tôi có nói đơn giản đâu (nguyên văn là "khó")

Bạn là người làm thành công rồi thì nên share, còn tôi mới là ý tưởng nên chắc chắn là không làm vì không liên quan việc của tôi, và quan điểm của tôi đó chỉ là hình thức trình bày ra kết quả không phải bản chất vấn đề - nên không phí năng lượng dành cho nó.
 
Lần chỉnh sửa cuối:
Upvote 0
Đọc lại đi, tôi có nói đơn giản đâu (nguyên văn là "khó")

Bạn là người làm thành công rồi thì nên share, còn tôi mới là ý tưởng nên chắc chắn là không làm vì không liên quan việc của tôi, và quan điểm của tôi đó chỉ là hình thức trình bày ra kết quả không phải bản chất vấn đề - nên không phí năng lượng dành cho nó.
Không phải là hình thức đâu bạn. Trong công việc các phòng ban bên mình sử dụng bộ lọc dạng này rất nhiều nhưng 9/10 là không biết gì về VBA. Mình muốn tạo 1 file trắng giống như file New của Excel có chứa VBA với Function như thế này và gởi cho toàn bộ mọi người, để khi nào họ muốn dùng đến chỉ cần mở file mình ra nhập công thức là dùng. Tùy người tùy việc bạn a !
Bài đã được tự động gộp:

Chủ bài đăng xem thử file này (Hàm mảng UDF)

Bạn có thể nhập thêm tên NV & mã đến khi nào hàm mảng còn cho phép!
Xin cảm ơn Code của bạn rất nhiều, mình đã tinh chỉnh lại Code của bạn cho phù hợp với yêu cầu của mình. Không cần co giãn, như vậy là quá tuyệt vời. Cảm ơn bạn lần nữa !
 
Upvote 0
Không phải là hình thức đâu bạn. Trong công việc các phòng ban bên mình sử dụng bộ lọc dạng này rất nhiều nhưng 9/10 là không biết gì về VBA. Mình muốn tạo 1 file trắng giống như file New của Excel có chứa VBA với Function như thế này và gởi cho toàn bộ mọi người, để khi nào họ muốn dùng đến chỉ cần mở file mình ra nhập công thức là dùng. Tùy người tùy việc bạn a !
Bài đã được tự động gộp:


Xin cảm ơn Code của bạn rất nhiều, mình đã tinh chỉnh lại Code của bạn cho phù hợp với yêu cầu của mình. Không cần co giãn, như vậy là quá tuyệt vời. Cảm ơn bạn lần nữa !
"Có công mài sắt có ngày nên kim"
Quan trọng là đừng nản đừng bỏ cuộc dựa vào mình là chính :<>. bí quá thì tạm ngưng đi trà sữa rồi suy nghĩ tiếp. @>><M?
 
Upvote 0
Web KT
Back
Top Bottom