Excel VBA UDF在添加或删除不相关的工作表时返回#值错误
第一次发布,如果我犯了任何错误,请道歉 所以,我的UDF有一个非常奇怪的问题。在我的工作簿中,我有一个名为“标准阶段工作表”的不可见“模板”工作表,以及一个用户可以激活的子程序,该子程序将该模板工作表复制到一个新的、可见的工作表中,然后用户可以使用该工作表。整个工作簿中都会有许多该模板表的副本,但它们都有唯一的名称 我的自定义项在模板表的几个点上,因此在用户制作的每个模板表副本上。在其中一个工作表中工作时,UDF工作正常,并返回我期望的值 但是,当用户添加模板工作表的新副本时,有时UDF会失控,并在使用UDF的每个位置返回#值错误 此外,当用户删除模板工作表的一个副本时,UDF总是失控,并在使用UDF的每个位置返回#值错误 我没有使用ActiveSheet或类似的东西,我相信我正确地给出了我在UDF中使用的范围的完整引用。任何帮助都将不胜感激,我在这里束手无策!UDF的代码如下所示 另外,因为我确信会有人问我这个问题,我代码中的neColumn变量是一个公共变量,我在几个子程序和UDF中使用它。它是在我的模块开始时定义的。此外,我还在模块的开头使用OptionExplicit 谢谢大家!Excel VBA UDF在添加或删除不相关的工作表时返回#值错误,excel,vba,user-defined-functions,Excel,Vba,User Defined Functions,第一次发布,如果我犯了任何错误,请道歉 所以,我的UDF有一个非常奇怪的问题。在我的工作簿中,我有一个名为“标准阶段工作表”的不可见“模板”工作表,以及一个用户可以激活的子程序,该子程序将该模板工作表复制到一个新的、可见的工作表中,然后用户可以使用该工作表。整个工作簿中都会有许多该模板表的副本,但它们都有唯一的名称 我的自定义项在模板表的几个点上,因此在用户制作的每个模板表副本上。在其中一个工作表中工作时,UDF工作正常,并返回我期望的值 但是,当用户添加模板工作表的新副本时,有时UDF会失控,
Public Function fSum(ByVal Target As Range, bExtended As Boolean) As Single
'This function returns a sum, based on a range provided in the cell that holds the function.
'It checks to see if that line item has been marked as Non-Extended, based on the NE column
'that can be check marked. If that line item is marked NE, then only the NE sum columns can
'use that line item as part of their sum, and those values are removed from the E columns.
Dim sSum As Single
Dim i As Integer
Dim n As Integer
'This small section is used to determine complete references to the cell calling the function.
Dim sheetName As String
sheetName = Application.Caller.Parent.Name
'Loop through provided range, and sum up the contents based on whether they have been marked NE or not.
i = 1
n = Target.row
sSum = 0
If Sheets(sheetName).Visible = True Then
While i < Target.Rows.Count
If (bExtended = True) Then
If Sheets(sheetName).Range(neColumn.Address).Cells(n, 1) = vbNullString Then
sSum = sSum + Sheets(sheetName).Range(Target.Address).Cells(i, 1).Value
End If
Else
If Sheets(sheetName).Range(neColumn.Address).Cells(n, 1) <> vbNullString Then
sSum = sSum + Sheets(sheetName).Range(Target.Address).Cells(i, 1).Value
End If
End If
i = i + 1
n = n + 1
Wend
End If
fSum = sSum
End Function
公共函数fSum(ByVal目标作为范围,扩展为布尔值)作为单个
'此函数根据保存函数的单元格中提供的范围返回一个和。
'它根据NE列检查该行项目是否已标记为非扩展
“这是可以勾选的。如果该行项目标记为NE,则只能使用NE sum列
'使用该行项目作为其总和的一部分,这些值将从E列中删除。
将sSum设置为单个
作为整数的Dim i
作为整数的Dim n
'此小部分用于确定调用函数的单元格的完整引用。
将sheetName设置为字符串
sheetName=Application.Caller.Parent.Name
'循环查看提供的范围,并根据是否标记为NE汇总内容。
i=1
n=Target.row
sSum=0
如果图纸(sheetName).Visible=True,则
而我
为子孙后代总结评论线索:
- 我不知道你为什么会看到这种行为
- 有一些方法可以改进此UDF(包括使用
而不是Long
,更喜欢Integer
而不是Do While…Loop
,删除While…Wend
检查.Visible
但是无论如何,它都觉得这只是复制了<代码> SUFIFS 的功能,所以你可以考虑走那个路线。
- 我不知道你为什么会看到这种行为
- 有一些方法可以改进此UDF(包括使用
而不是Long
,更喜欢Integer
而不是Do While…Loop
,删除While…Wend
检查.Visible
但是无论如何,它都觉得这只是复制了<代码> SUFIFS 的功能,所以你可以考虑走那个路线。
neColumn
变量变为Nothing
,因为Excel是易变的
我假设模块的开头如下所示:
Option Explicit
Public neColumn As Range
Sub Auto_Open()
Set neColumn = Sheet1.Range("A1:B2")
End Sub
打开工作簿时,调用Auto_open
Sub以Set
设置neColumn
变量。但是,当发生某些操作时,Excel会重建VBA,从而将公共变量(如neColumn
)重置为默认值(对于对象
,例如范围
,它是无
)。触发此操作的简单方法是故意抛出错误,例如尝试运行此操作:
Sub ThrowErr()
NotDefined = 1
End Sub
通过在fSum
代码中添加以下行,您可以使其更清晰可见:
If neColumn Is Nothing Then Stop
您要么需要一种方法在将neColumn
重置为Nothing
时恢复它,要么找到一种非易失性的方法来存储它
我假设这不适合成为一个
常量
,因为如果不是,它已经是了,但您可以将其转换为一个命名范围,或者将地址
存储在一个隐藏的工作表中/CustomDocumentProperty
。这些选项还允许您在工作时存储neColumn
当您重新打开时会保存ok,原因是您的neColumn
变量已变为Nothing
,因为Excel是易变的
我假设模块的开头如下所示:
Option Explicit
Public neColumn As Range
Sub Auto_Open()
Set neColumn = Sheet1.Range("A1:B2")
End Sub
打开工作簿时,调用Auto_open
Sub以Set
设置neColumn
变量。但是,当发生某些操作时,Excel会重建VBA,从而将公共变量(如neColumn
)重置为默认值(对于对象
,例如范围
,它是无
)。触发此操作的简单方法是故意抛出错误,例如尝试运行此操作:
Sub ThrowErr()
NotDefined = 1
End Sub
你可以让它对你更可见