您需要分两步执行此操作:
将您的模块更改为:
Dim lastCall As Variant
Dim lastOutput() As Variant
Function FillHere()
Dim outputArray() As Variant
ReDim outputArray(1 To 1, 1 To 2)
outputArray(1, 1) = "HELLO"
outputArray(1, 2) = "WORLD"
lastOutput = outputArray
Set lastCall = Application.Caller
FillHere = outputArray(1, 1)
End Function
Public Sub WriteBack()
If IsEmpty(lastCall) Then Exit Sub
If lastCall Is Nothing Then Exit Sub
For i = 1 To UBound(lastOutput, 1)
For j = 1 To UBound(lastOutput, 2)
If (i <> 1 Or j <> 1) Then
lastCall.Cells(i, j).Value = lastOutput(i, j)
End If
Next
Next
Set lastCall = Nothing
End Sub
然后为了调用 Sub,请进入 VBA 中的 ThisWorkbook 区域并添加如下内容:
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Call WriteBack
End Sub
其作用是返回左上角单元格的值,然后在计算完成后填充其余单元格。我编写此代码的方式假设一次只会调用一个 FillHere 函数。如果您想要同时重新计算多个变量,那么您将需要一组更复杂的全局变量。
需要警告的是,当它填充其他单元格时,它不会关心它会覆盖什么。
编辑:
如果您想在 XLA 中的应用程序范围内执行此操作。 ThisWorkbook 区域的代码应类似于:
Private WithEvents App As Application
Private Sub App_SheetCalculate(ByVal Sh As Object)
Call WriteBack
End Sub
Private Sub Workbook_Open()
Set App = Application
End Sub
这将连接应用程序级别计算。