1
5
我知道你已经解决了这个问题,但是你似乎没有理解为什么它会这样工作,也没有想出解决问题的最佳方法。 在所有版本的Access中,都有几个集合可以随时使用:
以及其他不经常使用的:
前两个集合只能作为数据库的成员访问,因此您只能通过如下方式使用TableDefs或QueryDefs集合:
这是因为TableDefs和QueryDefs是纯Jet对象,而不是访问对象。 其他集合是访问对象的集合,它们只包括打开的对象,如果这样做,您可以看到:
…在即时窗口中,如果没有打开的表单,无论数据库中实际有多少个表单,都会得到0。 在访问2000之前,您必须使用文档容器来访问未加载的存储访问对象列表。这是相当复杂的,必须以不同的方式处理不同的对象类型。对于模块,代码如下:
而且你还必须知道宏是存储在一个叫做“脚本”的容器中的,非常难看。 在Access 2000中,由于Access项目的存储方式发生了变化(在系统表的单个记录中作为单个BLOB字段,而不是存储在多个记录中,每个对象一个),因此引入了currentproject.all****集合。这些是:
出于您的目的,最好的选择显然是allmodules集合而不是modules集合,因为这样您就不必担心模块是否打开。当然,容器/文档方法是可行的,但是所有模块都需要更少的代码。 编辑: 使用所有模块的代码是:
或:
我总是喜欢在for循环中使用强类型的对象,但是这里只有一个通用对象变量起作用,所以我可能会使用计数器,因为它节省了清理最后一个隐式对象指针的开销。 此外,请记住,模块集合(即开放模块)包括表单模块以及独立模块和类模块,而所有模块仅限于独立模块和类模块。 |
2
0
Set mdl = Modules(obj.Name) 要执行上述操作,必须加载模块对象。此项检查使用 obj.IsLoaded (obj是一个accessobject,mdl是一个模块——参见上文。) 我的问题是只加载了一些模块。加载模块可以通过在VBA IDE中打开它来完成。不再出现错误7961。 我很惊讶要得到这个答案有多困难。我不得不在谷歌上下功夫,自己动手。希望它能帮助别人。 |
3
0
解决方案是传递accessObject(而不是字符串)。因此:
…对此:
大卫的文章帮助我重新检查了代码,并提供了良好的一般知识,我将相应地投票给他的答案。然而,我的错误是关于对象和函数,而不是关于如何使用所有集合。 |
CPS · 当变量值为空时,在另一个变量中赋值 2 年前 |
xris23 · 通过VBA选择命名范围,让用户直接编辑单元格 2 年前 |
Stormer · 从Access格式化Excel单元格无效 2 年前 |
j johns · 通过VBA将ascii art添加到命令提示符 2 年前 |
BinaryCat · Excel-将单元格转换为具有成对数据的行 2 年前 |
Waleed · 以下拆分函数的(0)表示什么? 2 年前 |
smrmodel78 · VBA创建表格未选择正确的范围 2 年前 |