如何获取查询的Description属性?Access VBA函数异常排查
问题原因与解决方案
你遇到的问题核心是:代码错误地创建了自定义的Description属性,而非访问或修改查询的内置Description属性,导致函数返回值与设计视图显示不一致。
具体原因
- 当你调用
CreateProperty("Description", dbText, ...)且未指定内置属性ID时,创建的是一个自定义属性,而非Access查询设计视图中显示的内置描述属性。 - DAO访问
Properties("Description")时会优先返回自定义属性的值,所以函数返回"new description!",但设计视图只读取内置的Description属性,因此仍显示原有的"my description"。 - 首次调用触发3270错误(属性不存在),大概率是Access的DAO对象加载机制导致:即使你在设计视图设置了描述,首次访问QueryDef的Properties集合时,内置Description属性可能未被加载,被错误判定为不存在。
修复后的代码
以下代码会优先获取内置Description属性,仅在属性确实不存在时创建内置属性(而非自定义属性),并确保修改持久化到数据库:
Public Function qryDescrip(qryName As String) As String ' 获取查询的内置描述属性 Dim db As DAO.Database, qdf As DAO.QueryDef Dim prp As DAO.Property Dim hasDescription As Boolean Set db = CurrentDb Set qdf = db.QueryDefs(qryName) hasDescription = False ' 遍历属性集合,确保找到内置的Description属性 For Each prp In qdf.Properties If prp.Name = "Description" Then qryDescrip = prp.Value hasDescription = True Exit For End If Next prp If Not hasDescription Then qryDescrip = "" ' 创建内置的Description属性(指定属性ID为dbPropDescription) Set prp = qdf.CreateProperty("Description", dbText, "new description!", dbPropDescription) qdf.Properties.Append prp qdf.Save ' 保存修改到数据库 qryDescrip = prp.Value End If ' 释放对象 Set prp = Nothing Set qdf = Nothing Set db = Nothing End Function
关键改进点
- 遍历Properties集合查找内置属性,避免依赖
On Error Resume Next的误判。 - 创建属性时指定
dbPropDescription作为第四个参数,确保创建的是内置属性,而非自定义属性。 - 添加
qdf.Save,确保修改持久化到数据库,同时让设计视图能同步看到更新后的描述。
补充说明
表的函数运行正常,是因为表的内置Description属性在DAO中更容易被加载,不会触发误判的3270错误,因此不会创建自定义属性。
内容的提问来源于stack exchange,提问作者MaybeOn8
相关产品推荐
相关产品推荐

