我需要使用VBA代码将MS Access表中的某些值复制到Excel中。我做了很多次,并认为自己经验丰富。在我的代码中,我使用以下语句导出数据:
sh.range("A" & row).Value = rs("MyField")
其中sh是Excel工作表,行是整数(长整数),rs是记录集(DAO或ADO,对所考虑的问题没有任何影响)。
我的代码在安装了MS Office 2007的计算机上运行良好。但是当我的客户端使用MS Office 2010在他的计算机上运行代码时,它失败并且随机失败。例如。通过按F8逐步调试MS Access模块中的VBA时,它始终有效。但当我按下“跑”F5时,很快就失败了。
经过多次试验和错误(我尝试使用不同的选项和记录集类型打开记录集并缓存记录等),我终于发现如果我写了
sh.range("A" & row).Value = rs("MyField").Value
一切正常。但根据文档(例如http://msdn.microsoft.com/en-us/library/office/ff197799(v=office.15).aspx),Value属性是字段对象的默认属性,而后者又是记录集对象的默认集合。
但似乎我不能依赖默认,我在大多数代码中一直在做。实际上我找到了解决问题的方法,但我仍然不知道原因。有谁知道为什么代码这样做?有什么问题?
PS:我还发现如果我将单行语句扩展为两行(三行声明):
dim v as Variant
v = rs("MyField")
sh.range("A" & row).Value = v
它也有效......
答案 0 :(得分:3)
由于rs("MyField")
是 Field 对象,如果你这样做......
MsgBox TypeName(rs("MyField"))
... Access会告诉你它的类型是 Field 。
所以TypeName()
是直接引用对象本身而不是默认.Value
属性的一个示例。
但Debug.Print
之类的内容始终引用.Value
,因此Debug.Print rs("MyField")
与Debug.Print rs("MyField").Value
相同
如果您确切知道隐式引用.Value
的时间以及何时不会引用,则只能在绝对需要时添加它,并在其余时间省略它。
但是,一些Access开发人员建议始终包含.Value
以避免此类混淆。如果这对你来说似乎太费劲了,至少在你做任务时考虑包括.Value
......
something = rs("MyField").Value
...并注意在没有.Value