Word VBA 宏 Bookmarks 报错5828 错误的书签名称 解决办法

在使用Word VBA编写宏添加书签时,遇到因选中行末换行符导致的错误。通过调试发现,选中的整行文本包含了换行符。为解决此问题,博主在添加书签前移除了选区末尾的换行符,成功避免了错误。这一解决方案对于处理类似问题具有参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

在用 Word VBA 编写自动添加书签的宏时,出现以下错误:

代码:

Sub AddBookmark(prefix As String)
    Selection.HomeKey Unit:=wdLine, Extend:=wdExtend '这两行代码选中整一行
    Selection.MoveEnd Unit:=wdLine, Count:=1
    Set bookmarkName = Selection.Range
    With ActiveDocument.Bookmarks
        .Add Range:=Selection.Range, Name:=prefix & "_" & bookmarkName
        .DefaultSorting = wdSortByName
        .ShowHidden = False
    End With
End Sub

 查阅国内外的相关资料无果,只能自己 debug

由于前面使用 Selection 选中了整一行文本,而通过观察发现选中的整行文本实际上是包含换行符的,如下图:

 于是猜测可能是该换行符引起的报错,于是在添加书签前多加入一行代码:

bookmarkName.End = bookmarkName.End - 1

用于取消选中最后的换行符,成功解决问题

### 运行时错误5828及其解决方案 运行时错误 `5828` 表示无效的书签名称(Invalid Bookmark Name),通常发生在数据库操作过程中尝试访问不存在或不合法的书签名称时。这种错误常见于 Microsoft Access 或其他基于 VBA 的应用程序中,尤其是在处理记录集导航和定位特定记录的操作时。 #### 错误原因分析 此错误可能由以下几个方面引起: - 提供给 `.Bookmark` 属性的值不是有效的书签对象[^1]。 - 数据库中的某些字段被意外修改或者删除,导致无法匹配现有的书签名。 - 记录集中未找到指定的书签位置,可能是由于数据更新或其他外部因素引起的同步问题。 #### 解决方案 以下是几种常见的解决方法: 1. **验证书签的有效性** 在使用 `.Bookmark` 前,应先确认该书签确实存在并有效。可以通过捕获异常来实现这一点。例如,在 VBA 中可以这样写: ```vba On Error Resume Next Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("YourTableName") If Not IsNull(rs.Bookmark) Then ' 使用 Bookmarks 定位到某条记录 rs.Bookmark = SomeValidBookmarkValue Else MsgBox "BookMark is not valid." End If On Error GoTo 0 ``` 2. **重新创建书签** 如果发现当前使用的书签已经失效,则需要考虑重新生成新的书签。这一步骤涉及刷新整个记录集或将焦点移动至目标记录后再获取其最新的书签值。 3. **检查 SQL 查询语句** 确保用于打开记录集的查询返回的数据结构与预期一致,并且没有任何缺失列或表连接逻辑上的偏差影响到了最终的结果集合。 4. **调试程序流程** 对代码执行路径进行全面审查,特别是那些负责设置初始条件的部分,比如加载默认参数或是初始化变量的地方是否存在潜在漏洞。 通过上述措施能够有效地排查并修复因 “invalid bookmark name” 导致的应用崩溃现象。 ```vba Sub ExampleOfHandlingError() Dim db As Database, rst As Recordset Set db = OpenDatabase("C:\path\to\db.accdb") ' 打开数据库实例 Set rst = db.OpenRecordset("SELECT * FROM Employees", dbOpenDynaset) On Error Resume Next rst.FindFirst "[EmployeeID] = 7" If Err.Number <> 0 Or IsEmpty(rst!EmployeeName) Then Debug.Print "No matching record found or other issue occurred!" ElseIf Not rst.NoMatch Then Debug.Print "Found employee named "; rst!EmployeeName.Value; "." ' 尝试保存当前位置作为书签 Dim bm As Variant bm = rst.Bookmark ' 移动指针再恢复原状测试有效性 rst.MoveNext rst.Bookmark = bm End If On Error GoTo 0 End Sub ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值