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
Excel集合变量_Excel_Vba_Collections_Module_Scope - Fatal编程技术网

Excel集合变量

Excel集合变量,excel,vba,collections,module,scope,Excel,Vba,Collections,Module,Scope,假设我们有两本关于VBA功能相同的工作簿;但是,数据集将有所不同。VBA代码将一些数据存储在采集变量上,以便于计算。此变量通过同一工作簿中的不同模块调用。由于该变量也存在于另一个工作簿上,且这两个工作簿不应共享相同的集合值,我们如何确保对集合的调用将仅从其自己的工作簿中提取该变量 声明集合变量时,“Option Private Module”声明是否足够?例如: Option Private Module Public DataCol As New Collection 谢谢。是的 将模块声明

假设我们有两本关于VBA功能相同的工作簿;但是,数据集将有所不同。VBA代码将一些数据存储在采集变量上,以便于计算。此变量通过同一工作簿中的不同模块调用。由于该变量也存在于另一个工作簿上,且这两个工作簿不应共享相同的集合值,我们如何确保对集合的调用将仅从其自己的工作簿中提取该变量

声明集合变量时,“Option Private Module”声明是否足够?例如:

Option Private Module
Public DataCol As New Collection
谢谢。

是的

将模块声明为
选项Private module
会将该模块中声明的“公共”变量的范围限制为该特定项目。这类似于类中的
Friend
作用域,也类似于.NET中的
内部静态

将模块声明为
选项Private module
会将该模块中声明的“公共”变量的范围限制为该特定项目。这类似于类中的
Friend
作用域,也类似于.NET中的
内部static

不太可能成为问题。。。 假设您有两本相同的工作簿:

  • Book1.xlsm
    ,以及
  • Book2.xlsm
…并且两者都有一个相同的公共变量设置,名为
X

除非明确地将
Book1
中的引用设置为
Book2
,否则
Book1
无法“查看”
X
Book2
中存在的其他变量/常量/etc

例如,如果在
Book1
中选择工具参考浏览和所选工作簿
Book2.xlsm
,则可以设置参考

即使您确实在工作簿之间设置了一个引用,并且两个工作簿都有一个名为
X
的变量,
Book1
将始终在查找其他工作簿之前在其内部查找
X
。您必须对变量进行如下限定:

Applications.Workbooks("Books2.xlsm").X
这适用于所有参考文件;如果工作簿中有与“已连接”引用同名的内容,则工作簿中运行的代码首先“查看”过程中的内容,然后是模块中的内容,然后是工作簿中的内容,然后再从外部查看已连接的引用

VBA不太可能引用错误工作簿中的变量

如果您经常打开两个相同的工作簿,很可能会意外地在错误的工作簿中编写或执行代码(我已经这样做了,这很烦人-特别是当您关闭并删除“垃圾工作簿”时,实际上您只是意外地在其中编写了一堆代码!)

不应该有很多情况下,你有两个相同的工作簿打开;如果这是一种常规做法,则可能有一种更好的方法来组织数据存储过程


范围 请注意,在引用不合格引用的工作表范围时,同样的情况不适用

例如,
Range(“A1”)
指的是“在顶部”的任何工作表(即,单击、选择或以其他方式激活的最后一个工作簿)

这就是为什么限定范围引用很重要的原因。完全限定范围引用的一个示例是:

ThisWorkbook.Sheets("Sheet1").Range("A1")

范围 此讨论属于范围的范畴

在以下链接中阅读更多关于什么是范围以及如何利用范围为您带来好处(并防止问题):

  • 奇普·皮尔森:
  • MS Office支持:
  • analysistabs.com:

真正全局变量 顺便说一句,还有一种方法可以创建真正的全局变量,其他(非Office)应用程序甚至在应用程序关闭和/或重新打开后都可以引用

它需要一些相当高级的编码,因为它涉及到Windows API,但Chip Pearson有可用的步骤和示例代码。

不太可能是个问题。。。 假设您有两本相同的工作簿:

  • Book1.xlsm
    ,以及
  • Book2.xlsm
…并且两者都有一个相同的公共变量设置,名为
X

除非明确地将
Book1
中的引用设置为
Book2
,否则
Book1
无法“查看”
X
Book2
中存在的其他变量/常量/etc

例如,如果在
Book1
中选择工具参考浏览和所选工作簿
Book2.xlsm
,则可以设置参考

即使您在工作簿之间设置了一个引用,并且两者都有一个名为
X
的变量,
Book1
将始终在查找其他变量之前在其内部查找
X
。您必须对变量进行限定,如:

Applications.Workbooks("Books2.xlsm").X
这适用于所有引用;如果工作簿中有与“已连接”引用同名的引用,则工作簿中运行的代码首先在过程中“查找”,然后在模块中,然后在工作簿中,然后再从外部查找已连接的引用

VBA不太可能引用错误工作簿中的变量

如果您经常打开两个相同的工作簿,很可能会意外地在错误的工作簿中编写或执行代码(我已经这样做了,这很烦人-特别是当您关闭并删除“垃圾工作簿”时,实际上您只是意外地在其中编写了一堆代码!)

应该不会有很多情况下,你有两个id