MSAccess 2010 + VBA:值不是记录集Field对象的默认属性

时间:2014-03-14 22:33:21

标签: vba ms-access access-vba recordset

我需要使用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

它也有效......

1 个答案:

答案 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

的情况下你没有得到你想要的任何其他情境