Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA UDF在添加或删除不相关的工作表时返回#值错误_Excel_Vba_User Defined Functions - Fatal编程技术网

Excel VBA UDF在添加或删除不相关的工作表时返回#值错误

Excel VBA UDF在添加或删除不相关的工作表时返回#值错误,excel,vba,user-defined-functions,Excel,Vba,User Defined Functions,第一次发布,如果我犯了任何错误,请道歉 所以,我的UDF有一个非常奇怪的问题。在我的工作簿中,我有一个名为“标准阶段工作表”的不可见“模板”工作表,以及一个用户可以激活的子程序,该子程序将该模板工作表复制到一个新的、可见的工作表中,然后用户可以使用该工作表。整个工作簿中都会有许多该模板表的副本,但它们都有唯一的名称 我的自定义项在模板表的几个点上,因此在用户制作的每个模板表副本上。在其中一个工作表中工作时,UDF工作正常,并返回我期望的值 但是,当用户添加模板工作表的新副本时,有时UDF会失控,

第一次发布,如果我犯了任何错误,请道歉

所以,我的UDF有一个非常奇怪的问题。在我的工作簿中,我有一个名为“标准阶段工作表”的不可见“模板”工作表,以及一个用户可以激活的子程序,该子程序将该模板工作表复制到一个新的、可见的工作表中,然后用户可以使用该工作表。整个工作簿中都会有许多该模板表的副本,但它们都有唯一的名称

我的自定义项在模板表的几个点上,因此在用户制作的每个模板表副本上。在其中一个工作表中工作时,UDF工作正常,并返回我期望的值

但是,当用户添加模板工作表的新副本时,有时UDF会失控,并在使用UDF的每个位置返回#值错误

此外,当用户删除模板工作表的一个副本时,UDF总是失控,并在使用UDF的每个位置返回#值错误

我没有使用ActiveSheet或类似的东西,我相信我正确地给出了我在UDF中使用的范围的完整引用。任何帮助都将不胜感激,我在这里束手无策!UDF的代码如下所示

另外,因为我确信会有人问我这个问题,我代码中的neColumn变量是一个公共变量,我在几个子程序和UDF中使用它。它是在我的模块开始时定义的。此外,我还在模块的开头使用OptionExplicit

谢谢大家!

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
你可以让它对你更可见