从单元中调用的Excel VBA公式在写入工作表单元格时停止处理VBA或遇到应用程序定义的错误

我在一个单元格中有这个公式:

=GetData("Channel_01","Chicago") 

其中执行此代码:

 Public Function GetData(ChannelCode As String, Key As String) As String Dim sql As String Dim cmd As New ADODB.Command Dim outputTo As Range Set outputTo = Application.Caller sql = "select * from ChannelData WHERE ChannelCode = ? AND Key1 = ?" Set cmd = getCommand(sql, ChannelCode, Key) Dim rs As ADODB.Recordset Set rs = cmd.Execute WritePivotRecordset ChannelCode, rs, outputTo.Offset(1, 0) End Function Public Sub WritePivotRecordset(ChannelCode As String, rs As ADODB.Recordset, destination As Range) Dim i As Integer '*** WHEN THIS LINE OF CODE IS REACHED AND EXECUTES, PROCESSING STOPS Set destination.Value = ChannelCode For i = 1 To rs.Fields.Count - 1 'skip first field destination.Offset(0, i).Value = rs.Fields(i).Name Next destination.Offset(1, 0).CopyFromRecordset rs End Sub 

问题发生在这一行上:

 '*** WHEN THIS LINE OF CODE IS REACHED AND EXECUTES, PROCESSING STOPS Set destination.Value = ChannelCode 

设置这个调用电子表格recalc,终止正在执行的VBA线程或类似的东西? 我以为是这样,所以我在写任何输出之前就试过了:

 Application.Calculation = xlCalculationManual 

但是现在在我得到的同一行代码中: 应用程序定义或对象定义的错误。

从VBA函数写入VBA函数调用的同一个工作表,只是不允许?

这只是Excel的内置行为。 从工作表调用的函数(在Excel术语中通常称为UDF – 用户定义的函数)除了返回值之外,不能对工作表执行任何操作。

在上面的代码中,似乎还有另外一个错误。

 Set destination.Value = ChannelCode 

应该会失败,因为您正在使用将对象variables设置为对象引用的语法。 如果你有一个error handling程序在那里它会捕获错误。 (Excel只是终止任何使错误不能处理的UDF。)该行应该是:

 destination.Value = ChannelCode 

但是,由于UDF对细胞没有副作用的规则,你的例程仍然会失败。 请注意,即使你有一个error handling程序,它也不会捕获这个错误。 当UDF尝试修改单元格时,VBA不会引发错误; 它只是停止UDF并返回一个#VALUE! 错误。

在你的情况下,它看起来像你可以重写你的函数返回一个包含你想要的值的数组,而不是试图修改单元格的权利和调用单元格的下面。 (或者你可以从一些macros而不是一个UDF调用你的函数。)

编辑:

至于返回数组,有一个ADO方法 – GetRows – 将从RecordSet中返回一个方法:

代码批判 – 我创build一个Rube Goldberg机器?