Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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中的其他模块是否识别了我的全局变量?_Vba_Excel - Fatal编程技术网

为什么不是';Excel VBA中的其他模块是否识别了我的全局变量?

为什么不是';Excel VBA中的其他模块是否识别了我的全局变量?,vba,excel,Vba,Excel,这是我在“ThisWorkbook”模块中的内容: 我在与cetain工作表对应的模块中有以下宏,我希望在某些单元格的值更改时激活它: Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Set KeyCells = wbReport.Range("inspection_number") etc. . . . End Sub 但是,当激活此

这是我在“ThisWorkbook”模块中的内容:

我在与cetain工作表对应的模块中有以下宏,我希望在某些单元格的值更改时激活它:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

    Set KeyCells = wbReport.Range("inspection_number")

    etc.    
    .
    .
    .
End Sub
但是,当激活此宏时,会出现运行时错误“424”,就好像从未建立wbReport全局变量一样


任何建议?

wbReport
必须作为对象提供。运行
工作表\u Change()
时,是否事先运行了
设置wbReport=ActiveWorkbook
?错误消息表明没有。“局部变量”窗口也可用于查找:设置断点并查看
wbReport
是否为对象。如果没有,找到一种方法使之成为现实。您可以使用
Workbook\u Open()
来执行此操作,但必须将其设置为
public
而不是
private

Private Sub Worksheet_Change(ByVal Target As Range)

    Call Workbook_Open()
    '' the Call keyword is optional, I find it adds clarity.

    Dim KeyCells As Range

    Set KeyCells = wbReport.Range("inspection_number")

    etc. 
与其调用该函数,不如简单地使用它的一行代码:

Set wbReport = ActiveWorkbook

我认为您来自一个面向对象的背景,其中模块将包含其方法,有些方法将被隐式调用。(我不知道,所以我的描述可能不正确。)这使得你的方法有点形式主义。一般来说,这将很好地为您服务;在这种情况下,可能是一个不必要的层。

我已尝试将“工作簿_Open()”更改为“Public”,但仍然遇到相同的错误。正如您所看到的,在“工作簿_Open”中,我已经设置了“Set wbReport=ActiveWorkbook”,因此我希望这足以将其建立为一个对象,您必须调用
Workbook_Open()
。请参阅编辑后的答案。
wbReport
不仅仅是一个简单的变量,它还是
这个工作簿的成员。因此需要使用类的名称引用此变量,如
ThisWorkbook.wbReport
。由于
wbReport
是工作簿,因此有必要说明范围位于哪个工作表上,例如
ThisWorkbook.wbReport.ActiveSheet.range(“检查编号”)
。还要记住,
工作簿
对象没有属于
工作表
应用程序的
范围
属性。别忘了使用
选项Explicit
,它有助于捕获大量错误。另一个问题与你的几乎相同。嗯
Set wbReport = ActiveWorkbook