使用评估写入其他单元格的UDF是不可预知的

我不愿意问UDF的devise写入其他单元格的问题,因为在devise上,这种行为应该被禁用。 但是…我会通过所有潜在的批评权力,然后问。 我真的没有期望完全回答这个问题,所以我只是想了解我遇到的奇怪行为。

我有一个UDF,旨在计算一个简单的轴承允许。 它需要10个参数。 如果任何参数超出范围,UDF将在调用单元中返回“错误”。 我想通过列出所有有问题的input来反馈这种相当无用的反馈,以便用户不必一个接一个地进行单一的修正。 这样,所有不良的input都会被列出来,用户可以立刻纠正所有的input。 仅供参考,由于一些input相互作用,input有10多个潜在问题。 否则用户可能会尝试几次没有成功的按摩input。 这就是为什么我想要立即列出所有的反馈。

UDF:简写 – 它将数据发送到类模​​块以执行所有检查和计算。

public Function LBA(ByVal layup_string As String, ByVal diaBolt As Double, ByVal boltHead As String, _ ByVal eD As Double, ByVal tMetallicFitting As Double, ByVal tempF As Double, ByVal depth As Double, _ ByVal allowable_type As String, ByVal basis As String, ByVal cond As String) As Variant ' ' declare variables Dim s As String Dim val As Variant Dim clba As New cFunc_LBA ' ' send to class constructor clba.init layup_string, diaBolt, boltHead, eD, tMetallicFitting, tempF, depth, allowable_type, basis, cond ' ' get errors If clba.contains_errs Then ' ............................... check for design space violattions: errors s = clba.get_errs ' .................................... get concat string of all errors Evaluate ("post_error_messages(""" & s & """)") ' ...... run the subroutine to post err msgs val = "Error" ' ........................................ return value to calling cell ' Else ' ' return a valid bearing allowable val = clba.LBA ' ....................................... expose bearing allowable property ' End If ' LBA = val End Function 

类模块按预期工作。 所有的计算和错误日志工作。 在UDF中,当我检查是否有错误时,它返回错误。 然后,我将错误(在一个长连接的string)发送到另一个子程序,应该将错误输出到其他工作表单元格。

Sub:

 Private Sub post_error_messages(ByVal s As String) ' declare variables Dim arr As Variant ' ' initialize variables arr = Split(s, ",") ' ' post error messages For i = 0 To UBound(arr) ' .................. loop thru error messages m.Cells(17 + i, 2) = CStr(arr(i)) ' ..... write msg in cell, increment by ROW# Next i End Sub 

我注意到一个怪癖…我只能得到子程序(由Evaluate调用)接受一个参数。 另外我只能让它接受一个简单的数据types的string 。 我试过arraysvariantsscripting.dictionary都没有工作。 因此,我所有的错误信息连接成一个长string,然后拆分和循环在子。

我现在的问题是,这个设置只是工作。

问题1:无论返回多less错误,Sub发布错误消息只会返回三个项目。 事实上,它总是返回三个项目,即使只有两个(最后一个显示重复)。 如果有10条错误消息,则显示3条错误消息。 我把debug.print语句放在我的错误消息子里面,所以我可以看到发生了什么事情,它显示当只有2个错误消息被返回时,它应该只打印到2个单元格,但是它仍然打印到第三个单元格。 超过3个错误只会被丢弃。

问题2:如果我删除工作表中显示错误消息的单元格,并再次执行UDF,则消息将不会返回。 只有closures工作簿并再次打开时,错误消息子例程才会再次(从UDF)打印到单元格。

此外,这不是一个真正的问题,评估运行两次。 我已经看了这个,这似乎是一个已知的问题。 我只是把它放在那里,但我不确定这会导致任何问题。

再一次,因为我在Excel UDF的预期function之外工作,所以我不期待解决scheme。 这就是说,有人可以提供任何见解吗?

不是你的问题的答案,但这个简洁的版本适合我:

 Public Function LBA() As Variant Dim val, s s = "A,B,C,D,E" Evaluate "post_error_messages(""" & s & """)" val = "Error" ' LBA = val End Function Private Sub post_error_messages(s As String) Dim arr As Variant, i With Sheet1.Cells(17, 2) .Resize(10, 1).Value = "" '<<< clear any previous errors! arr = Split(s, ",") .Resize(UBound(arr) + 1, 1).Value = Application.Transpose(arr) End With End Sub