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
2. Code trên Module
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.
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.