如何从VBA函数填充Excel工作表中的单元格?

我只想从VBA函数填充电子表格中的单元格。 举个例子,我想在单元格中input= FillHere(),结果我将有一些单元格填满了一些数据。

我尝试了这样一个function:

Function FillHere() Dim rngCaller As Range Set rngCaller = Application.Caller rngCaller.Cells(1, 1) = "HELLO" rngCaller.Cells(1, 2) = "WORLD" End Function 

只要我尝试修改范围,它就会中断。 然后我试了一下(即使这不是我正在寻找的行为):

 Function FillHere() Dim rngCaller As Range Cells(1, 1) = "HELLO" Cells(1, 2) = "WORLD" End Function 

这也不工作。 但是,如果我使用F5从VBA启动这个function,它就会起作用! 在调用函数的时候,似乎不可能修改电子表格中的任何内容…尽pipe

我也试过(实际上这是我的第一个想法)从函数返回一个数组。 问题是,我只得到数组中的第一个元素(有一个技巧,这意味着select一个整个区域的公式在左上angular+ F2 + CTRL-SHIFT-ENTER,但这意味着用户需要知道通过提前数组的大小)。

我真的坚持这个问题。 我不是最终的最终用户,所以我需要一些非常容易使用的东西,最好没有任何争论。

PS:对不起,我已经问过这个问题了,但是当时我还没有注册,看来我不能再去参加其他线程。

您需要分两步进行:

改变你的模块是这样的:

 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函数。 如果你想有多个同时重新计算,那么你将需要一个更复杂的全局variables。

警告的一个字是,它不会在意它填充其他单元格时覆盖什么。

编辑:如果你想在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 

这将连接应用程序级别计算。

你想做的事情在Excel中不起作用 – 这是devise。

不过你可以这样做:

 Function FillHere() Redim outputArray(1 To 1, 1 To 2) outputArray(1, 1) = "HELLO" outputArray(1, 2) = "WORLD" FillHere = outputArray End Function 

如果您在工作表中select两个相邻的单元格,请input=FillHere() ,然后按Ctrl + Shift + Enter(作为数组公式应用),那么您应该可以看到所需的输出。

基本上,一个函数只能影响它所调用的单元格。 这听起来像你可能需要看看使用Worksheet_ChangeWorksheet_SelectionChange事件来触发修改在预期的范围内的单元格。

您可以使用2阶段过程间接完成此操作:编写UDF,以便以足够持久的方式存储数据(例如全局范围)。 然后有一个Addin,它包含在每个计算事件之后触发的应用程序事件,查看由UDF存储的任何数据,然后重写必要的单元格(有关覆盖的警告消息(如果适用))并重置存储的数据。

这样用户不需要在他们的工作簿中有任何代码。

我想(但不知道),这是彭博等使用的技术