【问题标题】:How to Call Another Module in VBA Excel如何在 VBA Excel 中调用另一个模块
【发布时间】:2021-02-02 03:29:22
【问题描述】:

我在调用另一个模块时遇到问题(运行时错误“424”:需要对象)。我有 2 个模块,模块 1 和模块 2。下面是模块 1 中的代码:

Private Sub test()

 Dim Work As Worksheet: Set work= Sheets("S_BDN")

 For i = 1 To 2

 Set f = work.Range("A5", work.Range("A5").End(xlDown))
 Set a = f.Find(i, LookIn:=xlValues)
        

    If a.Offset(0, 10).Value = "January" Then
        Call Module3.Proceed_B
    End If

 Next i
End Sub

下面是模块 2 中的代码:

sub Module3.Proceed_B()

 If a.Offset(0, 6).Value = "A" Then
      Debug.Print a.Offset(0, 4).Value
 else
      Debug.Print a.Offset(0, 5).Value
 end if

end sub

非常感谢所有帮助。谢谢。

【问题讨论】:

  • 首先在每个模块的顶部添加Option Explicit,声明所有变量,然后从过程名称和调用中删除Module3
  • 然后阅读 VBA 中的变量范围 - 例如参见 excel-easy.com/vba/examples/variable-scope.html
  • 非常感谢@TimWilliams,错误已解决,但还有另一个问题,模块 2 中的结果 "Debug.Print a.Offset(0, 4).Value" 出现2 个数据但相同的数据不是不同的数据,我尝试在同一模块(模块 1)中将“调用 Module3.Proceed_B”替换为“Debug.Print a.Offset(0, 4).Value”,它有效,我的意思是,结果是 2 个数据并且不同。还是我的循环出错了?

标签: excel vba


【解决方案1】:

我看不到您的“固定”代码或工作表,因此这里有一些通用的改进建议:

Private Sub test()

   Dim Work As Worksheet, f As Range, a As Range
   Set work= Sheets("S_BDN")
   
   Set f = work.Range("A5", work.Range("A5").End(xlDown)) 'take out of loop

   For i = 1 To 2
 
     Set a = Nothing
     Set a = f.Find(i, LookIn:=xlValues, lookat:=xlWhole) 'provide *all* relevant parameters
     If Not a Is Nothing Then                      'make sure you got a match   
         If a.Offset(0, 10).Value = "January" Then
             Proceed_B a   'pass a to the other sub
         End If
     End If

 Next i
End Sub

sub Proceed_B(a As Range)
   If a.Offset(0, 6).Value = "A" Then
      Debug.Print a.Offset(0, 4).Value
   else
      Debug.Print a.Offset(0, 5).Value
   end if
end sub

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多