Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
Vba 试图从工作表Sub调用模块Sub:';运行时错误:1004';_Vba_Excel - Fatal编程技术网

Vba 试图从工作表Sub调用模块Sub:';运行时错误:1004';

Vba 试图从工作表Sub调用模块Sub:';运行时错误:1004';,vba,excel,Vba,Excel,我在Excel上用VBA编写了一些代码,遵循这个过程:它搜索E列,直到找到标题“Item Name”,然后搜索F列,直到找到“Sub Total”。基于这两个位置,我可以对它们之间的值的总数(n)求和 这是在一个模块中编写的,代码如下所示: Public Sub Sum() Dim Sub_Total As Range Dim Total As Range Set Item_Name = Sheets("Sheet1").Range("E:E").Find("Item Name")

我在Excel上用VBA编写了一些代码,遵循这个过程:它搜索E列,直到找到标题“Item Name”,然后搜索F列,直到找到“Sub Total”。基于这两个位置,我可以对它们之间的值的总数(n)求和

这是在一个模块中编写的,代码如下所示:

Public Sub Sum()

Dim Sub_Total As Range
Dim Total As Range

   Set Item_Name = Sheets("Sheet1").Range("E:E").Find("Item Name")
   Set Sub_Total = Sheets("Sheet1").Range("F:F").Find("Sub Total")

   Range(Sub_Total.Address).Offset(0, 1) = Application.Sum(Range(Cells(Item_Name.Row + 1, 7), Cells(Sub_Total.Row - 1, 7)))

End Sub
然后我想有一个功能,可以检测用户是否在求和区域内更改了值,因此如果值更改,它将再次求和所有值(再次运行此子项)

我在工作表代码中编写了这部分代码,如下所示:

Public Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range(Cells(Range("E:E").Find("Item Name").Row, 7), Cells(Range("F:F").Find("Sub Total").Row, 7))) Is Nothing Then

        Call Sum

    End If

End Sub
我将其设置为,如果用户更改了一个值,那么它将调用我之前生成的模块中的子模块

但是,每当我尝试运行此代码时,都会出现一个错误,状态为“运行时错误“1004”:应用程序定义的错误或对象定义的错误”。单击“调试”时,会突出显示这一行代码作为问题:

Set Item_Name = Sheets("Sheet1").Range("E:E").Find("Item Name")
我尝试过研究这个错误,也尝试过多次解决这个问题,但都没有成功。我觉得调用过程一定有问题,因为如果在工作表sub中没有调用sub Sum(),它就可以正常工作


任何想法或解决方案都将不胜感激。非常感谢

我将修改您的代码,将变量更改为
Long
并添加
.Row
它应该可以正常工作。我还去掉了偏移量,因为你知道你想把答案放在哪一列。您可以始终将这两个变量声明为公共变量,并在两个宏中使用它们

Dim Sub_Total As Long
Dim Item_Name As Long

   Item_Name = Sheets("Sheet1").Range("E:E").Find("Item Name").Row
   Sub_Total = Sheets("Sheet1").Range("F:F").Find("Sub Total").Row

   Cells(Sub_Total, 7).Value = Application.Sum(Range(Cells(Item_Name + 1, 7), Cells(Sub_Total - 1, 7)))
如果您将变量公开,您的
工作表\u Change
可以这样编写

If Not Intersect(Target, Range(Cells(Item_Name, 7), Cells(Sub_Total, 7))) Is Nothing Then

这个人一直在折磨我,因为Excel的行为太奇怪了。这段代码现在适合我(你不需要其他子代码)

关闭事件不应该是必要的,但似乎确实起到了作用(在这些情况下通常是可取的)

您还有
Public子工作表\u Change
,我想您是徒手输入的,而它应该是
Private
(我不知道这有什么区别)


在取消引用之前,您需要测试一下是否找到了任何东西。对不起,共产国际,我不太清楚您的意思。我应该取消引用什么?
.Find(“项目名称”).Row
。如果
Find
没有返回任何内容,您将得到一个错误,因为您无法调用
nothing
上的
.Row
。我并不是说这是您针对这个问题的特定问题(因此是注释而不是答案)。我刚刚指出,您需要进行防御性编码,这样您的下一个问题就不会是另一个运行时错误。您可能需要在某个地方声明
Item\u Name
。谢谢您的帮助。我根据您的建议修改了我的代码,但不幸的是,我仍然得到与以前相同的错误
Private Sub Worksheet_Change(ByVal Target As Range)

Dim Sub_Total As Range
Dim Item_Name As Range

Application.EnableEvents = False

Set Item_Name = Range("E:E").Find("Item Name")
Set Sub_Total = Range("F:F").Find("Sub Total")

If Not Item_Name Is Nothing Then
    If Not Sub_Total Is Nothing Then
        If Not Intersect(Target, Range(Cells(Item_Name.Row, 7), Cells(Sub_Total.Row, 7))) Is Nothing Then
            Sub_Total.Offset(0, 1) = Application.Sum(Range(Cells(Item_Name.Row + 1, 7), Cells(Sub_Total.Row - 1, 7)))
        End If
    End If
End If

Application.EnableEvents = True

End Sub