尝试从工作表子中调用模块子:“运行时错误:1004”

时间:2018-09-27 19:48:45

标签: excel vba excel-vba

我正在按照以下步骤在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")

我尝试研究此错误,并尝试多次解决此问题,但无济于事。我觉得调用过程一定有问题,因为如果未在Worksheet子菜单中调用子Sum(),它将很好地工作。

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

2 个答案:

答案 0 :(得分:0)

我将修改您的代码以将变量更改为Long并添加.Row 它应该可以正常工作。我还摆脱了Offset,因为您知道要在哪个列中回答。您始终可以将这两个变量声明为Public,并在两个宏中都使用它们。

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)))

如果您将变量公开,您的Worksheet_Change可能会这样写...

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

答案 1 :(得分:0)

由于Excel的行为太奇怪了,所以这个人一直在蚕食我。现在,此代码对我有用(您不需要其他子代码)。

关闭事件不是必需的,但是确实有所作为(在这种情况下通常还是建议)。

您也有Public Sub Worksheet_Change,我想您应该以手写方式输入Private(不过我不知道这有什么区别)。

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