使用变量代替表名

时间:2018-07-07 17:38:37

标签: access-vba ms-access-2010

首先,谢谢您的评论。如果表名称类似Name1,Name2,Name3等,则Names数组,但是我们使用不同的名称。

但是,我是否需要以其他方式解释才能理解。

我想做的是将旧数据库与新数据库(两者均在MS Access中)进行比较。每个表都有很多表(> 20),每个表都有很多字段,例如“ Number”,“ Name”等,并将差异放在“ Output”表中。

然后为了使代码尽可能简短,我想使用Loop并使用Variable引用表名称。我将所有表名称放在下表中:

enter image description here

表名称
Old_DB_Tables_Names | New_DB_Tables_Names

Items_List | Items_List

Items_Price |商品价格 商品_规格| Items_Specs Items_Size | Items_Size Items_Warehouse |物品_仓库 Items_Spare | Items_Spare Items_Quantity | Items_数量 : :: :

Dim TablesNames As ADODB.Recordset
Dim Items_List As ADODB.Recordset
Dim Items_Price As ADODB.Recordset
Dim Items_Specs  As ADODB.Recordset
Dim Items_Size As ADODB.Recordset
Dim Items_Wearhouse As ADODB.Recordset
Dim Items_Spare As ADODB.Recordset
Dim Items_Quantity  As ADODB.Recordset
:
:
Dim I as Integer 
I=0

Table1=TablesNames.item("Old_DB_Tables_Names").value
Table2=TablesNames.item("New_DB_Tables_Names").value

While TablesNames .EOF=False 
   if Table1.fields(I) <> Table2.fields(I) then

Output.Fields.Item("Number").Value Table2.Fields.Item("Number ").Value
Output.Fields.Item("Name").Value Table2.Fields.Item("Name ").Value
:
:
End If
I=I+1

Wend

问题VBA不接受语句[Table1.fields(I) <> Table2.fields(I)]

是吗?我们不能通过表的名称,表的任何字段引用表,也不能从该字段的记录中获取值? 如果您还有其他方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

好吧,让我们从第一部分开始:

Dim TablesNames As ADODB.Recordset
Dim Items_List As ADODB.Recordset
Dim Items_Price As ADODB.Recordset
Dim Items_Specs  As ADODB.Recordset
Dim Items_Size As ADODB.Recordset
Dim Items_Wearhouse As ADODB.Recordset
Dim Items_Spare As ADODB.Recordset
Dim Items_Quantity  As ADODB.Recordset

您在其余代码中尝试执行的操作:

将每个表中的所有信息都放入代码中。

您实际上在做什么:

创建空的记录集变量,以存储表数据,然后再从不存储任何表数据。即TableNames,Items_List等都是变量,它们目前与任何事物都没有关系,它们完全是空的,在当前状态下对其余代码没有任何意义。

接下来我们有:

Table1=TablesNames.item("Old_DB_Tables_Names").value
Table2=TablesNames.item("New_DB_Tables_Names").value

您在其余代码中尝试执行的操作:

使用表名存储表的实例。

您实际上在做什么:

访问记录集TableNames中的字段的值,并将该值存储在名为Table1的变量中。从名称来看,我假设您期望它是一个TableDef,但是您将它用作字符串或值类型,但我无法确定,因为我看不到声明它的位置。如果未声明,则需要在模块的每个模块的顶部键入“ Option Explicit”(不带引号),现在,认真地,请停止阅读并继续执行操作。

While TablesNames .EOF=False 

如果您在代码中设置了TableNames的记录集,那么只要您在.EOF之前没有空格,这将起作用

if Table1.fields(I) <> Table2.fields(I) then

您在其余代码中尝试执行的操作:

从存储在变量Table1中的TableDef中访问一个字段。

您实际上在做什么:

什么都没有,因为从您的代码来看,表1是字符串或值类型,并且对于任何字符串或值类型都没有名为“ fields”的方法或属性,因此您什么也没做。

最后我们有

Output.Fields.Item("Number").Value Table2.Field`enter code here`s.Item("Number ").Value
Output.Fields.Item("Name").Value Table2.Fields.Item("Name ").Value

什么?

所有这些使我相信您还没有掌握VBA的语法结构。尽管我们中的许多人希望为您提供帮助,但在大多数情况下,我们将无法仅通过您的某种修改就完全为您提供答案。