Function cho kết quả như chạy Sub

Liên hệ QC
Upvote 0
Mình tò mò vụ nhập hàm (UDF) vào một ô rồi điền toàn bộ kết quả ra bảng tính như chạy sub. Thử làm thì được như này. :)

Hình như có ai gọi là hàm co với giãn gì gì đó...

https://drive.google.com/file/d/118jy3rNUB_UF_0vNwwWCVUvLiOoRj1-t/view
Trước kia em cũng thử viết một hàm giống vậy, nhưng thấy củ chuối quá nên không chia sẻ. Em đang dùng điện thoại nên không xem được file của anh để chiều về thử anh làm cách nào. Riêng cách của em là viết class, sau đó bắt sự kiện thay đổi giá trị của ô, nếu ô thay đổi là công thức có chưa cái hàm của mình thì gán mảng giá trị (kết quả của hàm) xuống ngay ô đang thay đổi đó (dĩ nhiên là có mở rộng vùng kết quả sang các ô khác).
 
Upvote 0
Upvote 0
Trước kia em cũng thử viết một hàm giống vậy, nhưng thấy củ chuối quá nên không chia sẻ. Em đang dùng điện thoại nên không xem được file của anh để chiều về thử anh làm cách nào. Riêng cách của em là viết class, sau đó bắt sự kiện thay đổi giá trị của ô, nếu ô thay đổi là công thức có chưa cái hàm của mình thì gán mảng giá trị (kết quả của hàm) xuống ngay ô đang thay đổi đó (dĩ nhiên là có mở rộng vùng kết quả sang các ô khác).
Module sử dụng biến public để lưu địa chỉ ô gọi hàm bằng lệnh application.caller.address và có thể biến public array để lưu kết quả. Có thể viết class hoặc thêm code vào thủ tục sự kiện worksheet_calculate để điền kết quả từ mảng vào địa chỉ ở các biến public đó.
 
Upvote 0
Module sử dụng biến public để lưu địa chỉ ô gọi hàm bằng lệnh application.caller.address và có thể biến public array để lưu kết quả. Có thể viết class hoặc thêm code vào thủ tục sự kiện worksheet_calculate để điền kết quả từ mảng vào địa chỉ ở các biến public đó.
Anh có thể cho một file mẫu để nghiên cứu thêm.
 
Upvote 0
Upvote 0
Ba cái này dùng để viết cốt vi rút, dụ ngừoi ta dùng hàm của mình.
 
Upvote 0
Trước kia em cũng thử viết một hàm giống vậy, nhưng thấy củ chuối quá nên không chia sẻ. Em đang dùng điện thoại nên không xem được file của anh để chiều về thử anh làm cách nào. Riêng cách của em là viết class, sau đó bắt sự kiện thay đổi giá trị của ô, nếu ô thay đổi là công thức có chưa cái hàm của mình thì gán mảng giá trị (kết quả của hàm) xuống ngay ô đang thay đổi đó (dĩ nhiên là có mở rộng vùng kết quả sang các ô khác).
.
Em đang làm vụ SmartHome có động tới chút Python, tiện thể thấy có cái liên quan tới Excel nên nghịch thử thôi.

Cái này có thư viện sẵn, code trong Python rồi có công cụ Import Function sang Excel là xong.
Ví dụ ở bài #1 là "dynamic array", không phải dạng công thức mảng (Ctrl-Shift-Enter). Cụ thể sâu xa thì em cũng chịu, mới ngó qua một chút.
 
Upvote 0
Anh có thể cho một file mẫu để nghiên cứu thêm.
Mình ví dụ hàm MoveRange, khi dùng công thức =moverange(A1) thì cả vùng Range("A1").currentregion sẽ bị chuyển sang vị trí mới tại ô gọi hàm.
Trong module
Mã:
Public cls
Public SourceRange As Range
Function MoveRange(x As Range)
    cls = Application.Caller.Address
    Set SourceRange = x
End Function
Trong sheet
Mã:
Private Sub Worksheet_Calculate()
    If Not SourceRange Is Nothing Then
        Application.EnableEvents = False
        SourceRange.CurrentRegion.Cut Range(cls)
        Set SourceRange = Nothing
        Application.EnableEvents = True
    End If
End Sub
 

File đính kèm

  • move range.xlsm
    16.2 KB · Đọc: 26
Upvote 0
.
Em đang làm vụ SmartHome có động tới chút Python, tiện thể thấy có cái liên quan tới Excel nên nghịch thử thôi.

Cái này có thư viện sẵn, code trong Python rồi có công cụ Import Function sang Excel là xong.
Ví dụ ở bài #1 là "dynamic array", không phải dạng công thức mảng (Ctrl-Shift-Enter). Cụ thể sâu xa thì em cũng chịu, mới ngó qua một chút.
Chơi với Python mà trên Windows thì buồn chết - như là uống rượu đong từng chung nhỏ vậy.
Qua Linux/Unix nó mới thấy đã.
 
Upvote 0

File đính kèm

  • Lay ngau nhien1.xlsm
    25.8 KB · Đọc: 56
Upvote 0
Em đang làm vụ SmartHome
Cách đây hơn 3 năm, tôi cũng đã từng "máu lửa" với cái này. Ban đầu thì mua board và các thiết bị ở chợ Nhật Tảo, sau đó thấy có những board mình cho là "ngon" ở Mỹ nên gửi mua về bằng hàng xách tay, bởi vì Mỹ và Việt Nam có luật gì đó không cho gửi hàng điện tử bằng đường chính thống??? Làm vì đam mê, cũng áp dụng. Tuy nhiên về giá thành để làm ra sản phẩm của mình thì nó cao hơn rất nhiều lần so với thị trường. Đành phải gát lại đó cách nay không lâu.

1. Điều khiển thiết bị qua sóng RF, Bluetooth, Wifi, Internet (Winform, webform, Mobile), qua giọng nói.
2. Cảm biến: độ ẩm đất, cảm biến mưa, khí gaz, cảm biến chuyển động, đo khoảng cách... để kích hoạt Relay, gửi tin nhắn, gọi điện thoại, chụp hình hiện trường và gửi hình lên Dropbox.

Còn về hàm co giãn thì đây chỉ mới là bước đầu tiên để tiếp tục xây dựng thêm hàm khác.
 
Upvote 0
Để viết một hàm trả về mảng hay chạy như một Sub là rất khó. Không đơn giản như viết một hàm vba thông thường. Dù khi các bạn làm ra được rồi còn phải tính sự vận hành tính toán của Excel. Ví dụ nếu có hai hay nhiều hàm nảng đang tham chiếu tới cùng một địa chỉ vùng, khi dữ liệu nguồn thay đổi thì điều gì xảy ra? Lỗi Excel thoát ra không lời từ biệt là bình thường... Nên viết hàm mảng là phải viết cả một nền tảng phía dưới phục vụ tính toán. Hàm chỉ là phần nổi, còn một cơ chế kiểm soát chặt chẽ mới là kungfu, làm được việc này thì mới đem ứng dụng thực tế cho nhiều người dùng.
Đây là video tôi hướng dẫn cách lập trình hàm mảng dàng cho người viết vba và thừa kế nền tảng (công nghệ khó nhất) tôi viết trong DLL
 
Upvote 0
Cách đây hơn 3 năm, tôi cũng đã từng "máu lửa" với cái này. Ban đầu thì mua board và các thiết bị ở chợ Nhật Tảo, sau đó thấy có những board mình cho là "ngon" ở Mỹ nên gửi mua về bằng hàng xách tay, bởi vì Mỹ và Việt Nam có luật gì đó không cho gửi hàng điện tử bằng đường chính thống??? Làm vì đam mê, cũng áp dụng. Tuy nhiên về giá thành để làm ra sản phẩm của mình thì nó cao hơn rất nhiều lần so với thị trường. Đành phải gát lại đó cách nay không lâu.

1. Điều khiển thiết bị qua sóng RF, Bluetooth, Wifi, Internet (Winform, webform, Mobile), qua giọng nói.
2. Cảm biến: độ ẩm đất, cảm biến mưa, khí gaz, cảm biến chuyển động, đo khoảng cách... để kích hoạt Relay, gửi tin nhắn, gọi điện thoại, chụp hình hiện trường và gửi hình lên Dropbox.

Còn về hàm co giãn thì đây chỉ mới là bước đầu tiên để tiếp tục xây dựng thêm hàm khác.
*
Cách đây 3 năm chắc có phần khác bây giờ đó anh. Bây giờ ở Việt Nam (và trên thế giới) theo xu thế phát triển của IoT, mảng SmartHome đông đảo ghê lắm, các hãng lớn cũng đã nhắm vào mảng này (Hồi đầu có Amazon, rồi Google, Apple).
Có nền tảng mã nguồn mở, có các diễn đàn, các nhóm Facebook, một số lập nhóm riêng (MS Teams, Discord...)
Bây giờ anh gác lại thì có phần hơi tiếc. :)

**
Em để ý thấy hàm của anh trả về là hàm mảng trên một vùng bảng tính (array formulas), có phần khác với ví dụ của em.
 

File đính kèm

  • UI.zip
    149.5 KB · Đọc: 48
Upvote 0
Web KT
Back
Top Bottom