Vba 试图从工作表Sub调用模块Sub:';运行时错误:1004';
我在Excel上用VBA编写了一些代码,遵循这个过程:它搜索E列,直到找到标题“Item Name”,然后搜索F列,直到找到“Sub Total”。基于这两个位置,我可以对它们之间的值的总数(n)求和 这是在一个模块中编写的,代码如下所示: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")
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