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 Sub2. 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 Function3. 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.
 
	 
	  
 
 
		 
 
		 
					
				 
						
					 
 
		 
						
					 
 
		 
 
		

 
 
		

 
 
		


 
 
		


 . Trên đây tớ thấy dân nghề code két cũng nhiều, bớt bùng lại đi
. Trên đây tớ thấy dân nghề code két cũng nhiều, bớt bùng lại đi 
 
		









 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		