Viết hàm tự tạo theo kiểu Excel 365

Liên hệ QC

Ngô Hải Đăng

Thành viên hoạt động
Tham gia
31/8/17
Bài viết
183
Được thích
247
Giới tính
Nam
Nghiên cứu trên diễn đàn thì phát hiện được cái Application.Caller và sau đây là ý tưởng của mình:
1. Code trên ThisWorkbook
Mã:
Option Explicit

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    If IsUDF Then
        SetResult
        rCaller.Formula = sFormula
    End If
End Sub

Private Sub SetResult()
    Dim r0&, c0&
    On Error Resume Next
    r0 = UBound(aResult, 1) - LBound(aResult, 1)
    c0 = UBound(aResult, 2) - LBound(aResult, 2)
    On Error GoTo 0
    If c0 = 0 Then
        rCaller.Resize(1, r0 + 1) = aResult
    Else
        rCaller.Resize(r0 + 1, c0 + 1) = aResult
    End If
End Sub

2. Code trên Module
Mã:
Option Explicit

Public IsUDF As Boolean
Public rCaller As Range
Public aResult As Variant
Public sFormula As String

Function MyUDF()
    If IsUDF Then
        MyUDF = aResult
        IsUDF = False
        Set rCaller = Nothing
        If IsArray(aResult) Then Erase aResult Else aResult = Empty
    Else
        IsUDF = True
        Set rCaller = Application.Caller
        sFormula = rCaller.Formula
        
        'Dim tmp As String: tmp = "1 GIA TRI"
        'Dim tmp: tmp = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
        Dim tmp(10, 15) As Long
        aResult = tmp
    End If
End Function

3. Gõ =MyUDF() trên Sheet để test.

Có thể thử với kết quả là 1 giá trị, mảng 1 chiều và mảng 2 chiều. Mong được học hỏi thêm kinh nghiệm từ mọi người.
 
Em mà được nhiều người dùng Excel biết đến A-Tools là em đã giàu lắm rồi đấy. Excel là môi trường phục vụ đa dạng nhu cầu, A-Tools là phục vụ cho một nhóm nhu cầu báo cáo và chia sẻ mạng vậy thôi anh. Nói vui chút về chuyện không có cái A ta vẫn sông ổn là trước đây công việc đâu có máy tính thì người ta vẫn làm việc được đó thôi.

Với anh Mỹ thì anh có cách nhìn khác, cái anh nói em có thể tự hào về A-Tools là em đã làm cố gắng hết sức để đáp ứng một nhóm nhu cầu và khá triệt để chứ không đơn giản chỉ như game. Em chia sẻ lại một phần nội dung mà em chinh phục một nhóm nhu cầu làm báo cáo để ai đó biết vì sao có người lại cần động đậy. Video tại đây.
Tôi không nói là cái bạn làm là tầm thường. Tôi chỉ cho rằng có nhiều cái người ta không làm không hẳn là người ta nghĩ ngắn, không phải người ta không biết làm, hay cố gắng làm cũng không bằng mình. Vì thế đừng nên nói những lời như tôi đã trích.
 
Upvote 0
xem thường mạnh ròi đấy ... mạnh ko cần dò mà nhìn là biết ngay à .... ngày xưa rất xưa mạnh đi theo mấy tay A21 và B40 nó chỉ cho đấy
còn A21 và B40 là gì thì dò đi he ... thì biết mạnh là ai
Thấy B40 thì chắc bạn là người Mặt Trận Giải Phóng Miền Nam. :D
Thêm cái Beretta 21A Bobcat thì chắc chuyên làm mật thám.
Ủa mà không phải, khoảng năm 70-71 thì Mẽo nó dùng thiết giáp cao cấp hơn, B40 hạ không nổi. Bộ đội chuyển qua B41. B40 chỉ dùng để bắn tàu nhỏ lượn trên sông (thiệt ra chỉ dùng để doạ thôi chứ cũng chả hiệu quả, 10 quả trật hết 8-9).
Riêng 21A Bobcat thì khoảng giữa thập niên 80 mới có. Lúc ấy Mặt Trận đã hết rồi.
 
Upvote 0
xem thường mạnh ròi đấy ... mạnh ko cần dò mà nhìn là biết ngay à .... ngày xưa rất xưa mạnh đi theo mấy tay A21 và B40 nó chỉ cho đấy
còn A21 và B40 là gì thì dò đi he ... thì biết mạnh là ai
Bạn có thể chia sẻ cái mà mấy tay A21 và B40 đã chỉ cho bạn được không? Nếu không thể chia sẻ cho nhiều người thì bạn có thể chia sẻ riêng cho tôi được không?
 
Upvote 0
Tôi không nói là cái bạn làm là tầm thường. Tôi chỉ cho rằng có nhiều cái người ta không làm không hẳn là người ta nghĩ ngắn, không phải người ta không biết làm, hay cố gắng làm cũng không bằng mình. Vì thế đừng nên nói những lời như tôi đã trích.

Có gì sai lắm hay nghiêm trọng bác nhỉ? Đoạn bác trích câu của em có gì mà nên hay không nên đâu? Vài câu bác nói cũng chỉ là bác đang tự suy luận mà em hay ai đó cho là chủ quan, có thể đúng hoặc sai vậy bác nên hay không nên nói thế? Ai cũng có thể đoán rằng một hãng công nghệ khổng lồ thì cái gì chả làm được? Không làm được thì đi mua. Nhưng có những ý tưởng lại là đi sau là bình thường. Không nhẽ cứ làm theo cái người ta làm trước rồi tự nhủ chỉ là trước đây ta không quan tâm, ta không coi trọng cái ý tưởng đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể chia sẻ cái mà mấy tay A21 và B40 đã chỉ cho bạn được không? Nếu không thể chia sẻ cho nhiều người thì bạn có thể chia sẻ riêng cho tôi được không?
có thể ta dừng ở đây được không anh vì cái đó liên quan tới 20 năm trước Em làm việc ở Hà Nội đó anh mà
 
Upvote 0
Upvote 0
Đã sử dụng được cái số 1 và 2, còn cái số 3 chắc là để tính toán điền kết quả lên sheet cho chuẩn 365.
Ngoài bộ hàm của Anh Tuân làm trên DelPhi ra thì như bài 46 Anh Mạnh có nói cái này mình có làm cho vui thôi. Mình làm sao qua được mấy cái hàm cảu Anh Bil đâu
 
Upvote 0
Ngoài bộ hàm của Anh Tuân làm trên DelPhi ra thì như bài 46 Anh Mạnh có nói cái này mình có làm cho vui thôi. Mình làm sao qua được mấy cái hàm cảu Anh Bil đâu
hình như khoản máy năm trước có 1 anh dấu tên cho mình cái hàm co giản cũng dễ mà không Pro nên không dám Share
 
Upvote 0
Có gì sai lắm hay nghiêm trọng bác nhỉ? Đoạn bác trích câu của em có gì mà nên hay không nên đâu? Vài câu bác nói cũng chỉ là bác đang tự suy luận mà em hay ai đó cho là chủ quan, có thể đúng hoặc sai vậy bác nên hay không nên nói thế? Ai cũng có thể đoán rằng một hãng công nghệ khổng lồ thì cái gì chả làm được? Không làm được thì đi mua. Nhưng có những ý tưởng lại là đi sau là bình thường. Không nhẽ cứ làm theo cái người ta làm trước rồi tự nhủ chỉ là trước đây ta không quan tâm, ta không coi trọng cái ý tưởng đó.
Tôi không chỉ nói về 2 ông lớn công nghệ. Tôi nói về toàn thế giới trừ công ty của bạn. Không có sản phẩm của bạn người ta vẫn phát triển tốt. Nhưng bạn nói cũng có lý. Rất có thể toàn thế giới kia không nghĩ ra được cái mà bạn đã nghĩ ra. Nhưng có điều rõ ràng là ngoài 2 ông lớn đã kể thì có rất rất rất nhiều công ty tầm cỡ thế giới, được phần lớn (không phải tất cả) biết tới. Còn công ty của bạn nổi tiếng đến cỡ nào thì tự bạn hiểu.

Tôi dừng tại đây.
 
Upvote 0
Ngoài bộ hàm của Anh Tuân làm trên DelPhi ra thì như bài 46 Anh Mạnh có nói cái này mình có làm cho vui thôi. Mình làm sao qua được mấy cái hàm cảu Anh Bil đâu
Mình không có ý định qua mặt đâu. Lúc đầu chỉ là tính bắt chước theo mấy cái hàm của anh Bill thôi, chỉ làm phần nổi thôi, còn phần chìm thì chắc không đủ sức.
 
Upvote 0
Mình không có ý định qua mặt đâu. Lúc đầu chỉ là tính bắt chước theo mấy cái hàm của anh Bill thôi, chỉ làm phần nổi thôi, còn phần chìm thì chắc không đủ sức.
Cái này năm ngoái trên diễn đàn nhà mình cũng bàn rôm rả cả một thời gian rồi mà
 
Upvote 0
Cái này năm ngoái trên diễn đàn nhà mình cũng bàn rôm rả cả một thời gian rồi mà
Mình mới tham gia GPE nên không biết. Chắc cái này đang hot nên mỗi năm đều có người nhắc lại, hoặc là ai đang học VBA đến thời điểm nào đó đều nghĩ đến vấn đề này hay sao đó.
 
Upvote 0
Tôi không chỉ nói về 2 ông lớn công nghệ. Tôi nói về toàn thế giới trừ công ty của bạn. Không có sản phẩm của bạn người ta vẫn phát triển tốt. Nhưng bạn nói cũng có lý. Rất có thể toàn thế giới kia không nghĩ ra được cái mà bạn đã nghĩ ra. Nhưng có điều rõ ràng là ngoài 2 ông lớn đã kể thì có rất rất rất nhiều công ty tầm cỡ thế giới, được phần lớn (không phải tất cả) biết tới. Còn công ty của bạn nổi tiếng đến cỡ nào thì tự bạn hiểu.

Tôi dừng tại đây.
Đúng là cái ta nghĩ mà tây chưa nghĩ ra (có thể)
Nhưng có 1 điều là thường đa số Họ nghĩ cái to và cái hệ thống hơn, còn ta - dân ta thường nghĩ cái tiểu tiết và phát triển cái đó ... lại dựa trên cái hệ thống kia,... và trong khi đó họ lại tiếp tục ... phát triển cái hệ thống hơn khác khắc phục các nhược điểm của cái hệ thống cũ.
Nên trên hết là cái nhìn, góc nhìn khác nhau khó so sánh
 
Upvote 0
Đúng là cái ta nghĩ mà tây chưa nghĩ ra (có thể)
Nhưng có 1 điều là thường đa số Họ nghĩ cái to và cái hệ thống hơn, còn ta - dân ta thường nghĩ cái tiểu tiết và phát triển cái đó ... lại dựa trên cái hệ thống kia,... và trong khi đó họ lại tiếp tục ... phát triển cái hệ thống hơn khác khắc phục các nhược điểm của cái hệ thống cũ.
Nên trên hết là cái nhìn, góc nhìn khác nhau khó so sánh
Xuất sắc ... chính xác ... 9,5 điểm lần thứ 2 cho Bạn -0-0-0-
 
Lần chỉnh sửa cuối:
Upvote 0
Nên trên hết là cái nhìn, góc nhìn khác nhau khó so sánh
Khó so sánh thì đúng rồi vì nhiều khi quan điểm khác nhau.
Việc đẩy dữ liệu đang có xuống dưới có khó không? Không khó, và trên GPE chốc chốc lại có yêu cầu như thế. Không khó, mà chỉ là không được phép. Tức bạn tự làm được nhưng anh Bill chỉ cho phép bạn làm trong SUB. Khi bạn làm trong FUNCTION thì anh Bill tuýt còi. Như vậy việc "đẩy dữ liệu xuống dưới" không khó, chỉ là anh Bill không cho phép làm trong FUNCTION. Chắc chắn việc làm trên đã "xung đột" với cái gì đấy trong việc quản lý, xử lý dữ liệu. Là người tạo ra bảng tính chắc chắn anh Bill biết "xung đột" đó nằm ở đâu, mặt mũi thế nào. Là người viết code của bảng tính anh Bill biết dữ liệu được đọc vào bộ nhớ như thế nào, chúng được tổ chức trong bộ nhớ ra sao, được phát hiện thay đổi và chỉnh sửa thế nào. Anh Bill biết từng đường đi lối lại trong code của mình mà không biết chỉnh sửa code đó để cho phép "đẩy dữ liệu xuống dưới"? Phải chăng ở giai đoạn thời gian đó anh Bill có quan điểm khác? Là không chấp nhận việc "đẩy dữ liệu xuống dưới" vì nó phá vỡ cấu trúc dữ liệu, sự tương quan giữa chúng?

Cứ thấy người khác không làm cái việc mình làm thì nghĩ là người ta không biết làm? Tôi không biết làm, bạn không biết làm, nhưng các ông lớn công nghệ, các đầu óc lập trình siêu đẳng của nhân loại không biết làm? Chắc ai đó định đùa thôi. Thay vào đó nên mừng thầm là người ta không làm hết những việc đó nên mình mới có cơ hội kiếm tiền.

Tôi có thể tiếp tục tham gia tranh luận với các bạn khác, còn tranh luận với Tuân tôi đã dừng rồi. Những cái trên tôi không viết cho Tuân. Nói rõ thế để tránh hiểu lầm.
 
Upvote 0
...Việc đẩy dữ liệu đang có xuống dưới có khó không? Không khó, và trên GPE chốc chốc lại có yêu cầu như thế. Không khó, mà chỉ là không được phép. Tức bạn tự làm được nhưng anh Bill chỉ cho phép bạn làm trong SUB. Khi bạn làm trong FUNCTION thì anh Bill tuýt còi. Như vậy việc "đẩy dữ liệu xuống dưới" không khó, chỉ là anh Bill không cho phép làm trong FUNCTION. Chắc chắn việc làm trên đã "xung đột" với cái gì đấy trong việc quản lý, xử lý dữ liệu. ....
Ở trong môi trường macro, Function muốn làm gì thì làm.
Khi Function được đưa lên bảng tính thì mới phải tuân thủ theo cái giới hạn kia. Theo tôi thì đây là luật có từ đời Excel 4, hoặc cổ lắm thì cũng là Excel 95/97. Hồi ấy kiểm soát bộ nhớ rất khó (điển hình, Windows muốn đưa lên mấy cái cửa sổ debug cũng không dễ) cho nên giới sử dụng Excel cho đó là điều cần thiết.

Đại khái thì khi một Function được dùng ở bảng tính thì nó phải đi qua một lớp bảo vệ. Trước mắt thì lớp bảo vệ này có nhiệm vụ biến Function thành công cụ làm việc in hệt như hàm thông thường của bảng tính. Và vì vậy nó có hai công việc nhiển nhiên:
1. không cho phép sửa đổi bảng tính.
2. không cho phép crash. Nói cách khác, lỗi sẽ bị bẫy hết.

Những tay nghề xịn thì có cách đi vòng qua lớp bảo vệ này. Có lẽ vì vậy mà MS cứ để mặc câu chuyện diễn tiến.
 
Upvote 0
Web KT

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

Back
Top Bottom