Ms access VBA中的索引(Access 2003)-字段关联

Ms access VBA中的索引(Access 2003)-字段关联,ms-access,indexing,vba,field,Ms Access,Indexing,Vba,Field,基于,Microsoft Access如何知道为索引字段集合创建的字段与TableDef字段集合中的等效字段关联 即使在中,也会为索引创建字段,然后将其附加到索引的“字段”集合中: 。。。 '复制索引 对于SourceTableDef.Indexes.Count-1的I1=0 Set SI=SourceTableDef.index(I1) 如果不是SI.Foreign,则通过关系添加“外部索引” Set I=T.CreateIndex() '复制Jet属性 出错时继续下一步 对于P1=0到I.P

基于,Microsoft Access如何知道为索引字段集合创建的字段与TableDef字段集合中的等效字段关联

即使在中,也会为索引创建字段,然后将其附加到索引的“字段”集合中:

。。。
'复制索引
对于SourceTableDef.Indexes.Count-1的I1=0
Set SI=SourceTableDef.index(I1)
如果不是SI.Foreign,则通过关系添加“外部索引”
Set I=T.CreateIndex()
'复制Jet属性
出错时继续下一步
对于P1=0到I.Properties.Count-1
I.Properties(P1).Value=SI.Properties(P1).Value
下一个P1
错误转到0
'复制字段
对于f1=0到SI.Fields.Count-1
Set F=T.CreateField(SI.Fields(f1).Name,T.Fields(SI.Fields(f1).Name).Type)
I.Fields.F
下一个f1
附加索引
如果结束
下一个I1
...
我不能简单地从TableDef的fields集合中添加现有字段吗?这没有什么意义,似乎对凝聚力的影响也很小

更新 我实际上测试了代码,这基本上就是我想要做的。。。但是它失败了,在这一行出现了一个未定义的对象错误:

Set F=T.CreateField(SI.Fields(f1).Name,T.Fields(SI.Fields(f1).Name).Type)
…当我们改变这一点时,我们有各种各样的乐趣

(23/05/2016)此外,这个脚本似乎是错误的-第二个参数实际上不应该存在,它是不必要的。省略它会导致进一步的错误!哈我的尾巴在哪里?我觉得我应该去追它

我问题的解决办法 我决定遵循HansUp的指导,使用DDL——这比试图彻底解决与对象操作相关的问题要容易得多(尽管在最终的代码设计中有一定程度的问题)

选项比较数据库
Public Const cFname As String=“drm\drmData2016.accdb”
Public Const cPropNotFound为整数=3270
公共常量cNotSupported为整数=3251
Public Const cInvalidOp作为整数=3219
公共子发电商()
OpenLog
“开始。。。
dimdb作为数据库
Dim tdb As数据库
将ts调暗为TableDef,tt调暗为TableDef
dimpas属性
尺寸f为字段,英尺为字段
作为索引的Dim i
调暗s为字符串,t为字符串
将x作为布尔值
Set db=CurrentDb
如果Dir$(cFname)“,则杀死cFname
设置tdb=Application.DBEngine.CreateDatabase(cFname、dbLangGeneral、dbVersion140)
写入日志“已创建数据库”&cFname&“
'创建表。。。
编写日志“创建TableDefs…”,1
对于每个ts,以db.TableDefs为单位
如果不是以(ts.Name,“msys”、“~”、“$”、“Name AutoCorrect”)开始,而不是以(ts.Name,“xrep”)结束,则
s=“选择”
对于ts字段中的每个f
如果不是以(f.Name,“s_”,“s_”)开始,则s=s&“[”&f.Name&“],”
下一个f
s=左$(s,Len(s)-2和“进入[”&ts.Name&“]在“&cFname&”中从[”&ts.Name&“];”
出错时继续下一步
db.executes
如果Err.Number=0,则
WriteLog“创建[”&ts.Name&“]使用“&s,2
其他的
WriteLog“未能创建[”&ts.Name&“]。”,2
写日志“错误”&错误编号&“:”&错误描述,3
写日志“SQL:&s,3
呃,明白了
如果结束
tdb.TableDefs.Refresh
错误转到0
如果结束
下一个ts
'复制属性。。。
写下“表格…”,1
对于每个ts,以db.TableDefs为单位
如果不是以(ts.Name,“msys”、“~”、“$”、“Name Autocorrect”)开始,而不是以(ts.Name,“xrep”)结束,则
Set tt=tdb.TableDefs(ts.Name)
书写日志ts.名称,2
写下“表属性…”,3
'表属性。。。
对于ts属性中的每个p
出错时继续下一步
tt.属性(p.Name)=p.value
如果Err.Number=0,则
写入日志p.Name&“=”&p.value,3
其他的
写入日志“错误设置”和p.名称,3
WriteLog错误编号&“:”&错误描述,4
呃,明白了
如果结束
错误转到0
下一个p
'字段属性。。。
写下“字段…”,3
对于ts字段中的每个f
如果不是以(f.Name,“s_”)开始,则
设置ft=tt.字段(f.名称)
书面记录f.姓名,3
写下“属性…”,3
对于f.属性中的每个p
出错时继续下一步
ft.Properties(p.Name).value=p.value
选择案例错误编号
案例0
“正常。。。
写入日志p.Name&“=”&p.value,4
未发现病例
'创建属性。。。
作为属性的Dim-np
Set np=ft.CreateProperty(p.Name、p.Type、p.value)
ft.Properties.Append-np
ft.Properties.Refresh
写入日志“已创建属性”&p.Name&“,值为”&p.value,4
案例cNotSupported,cInvalidOp
“我们不担心这些价值观——只是跳过它们。。。
其他情况
WriteLog“未能创建或更改属性”&p.Name&“。