VBA 代码中的字符变化

Posted

技术标签:

【中文标题】VBA 代码中的字符变化【英文标题】:Characters changing in VBA code 【发布时间】:2014-04-14 05:37:18 【问题描述】:

我在 VBA 中打开一个记录集,其中包含特殊字符,如复选标记、项目符号和其他从 Word 中提取的内容。该过程会将这些字段重新添加到单词书签中,但我遇到了格式化问题。我从富文本备注字段中提取,即使字符出现在表格中,当我将鼠标悬停在代码中的值上时它们也不会出现。我在代码的一个框中得到了问号,当它被导出到我的 word 文档中时。项目符号出现在代码中的鼠标悬停值和导出到 word 中,但是当我在代码中打开记录集时,其他字符会发生变化。

我认为这是某种 UTF 转换问题,但我不知道为什么它在表中会很好,但是当我使用 DAO.Database.OpenRecordset 时会搞砸。这些是 Word 固有的符号,并出现在访问表中。将其放入 DAO.recordset 后,我​​似乎失去了一切。

我尝试创建一个querydef并打开它,在OpenRecordset中查询表,直接在OpenRecordset中打开表,它们都不起作用。

【问题讨论】:

你试过用 ADODB 代替 DAO 吗? 【参考方案1】:

不要被 VBA 编辑器中的鼠标悬停行为误导。它根本无法显示多字节字符(即,基本上是 Windows“ANSI”字符集之外的任何内容)。 DAO 确实可以操作多字节(例如,Unicode)字符,但是 VBA 编辑器不能在工具提示文本、即时窗口或监视窗口中显示它们.

为了说明,对于名为 [vocabulary] 的 Access 表中的以下测试数据

ID  word    language  english_equiv
--  ------  --------  -------------
3   γιορτή  Greek     feast 

以下代码

Option Compare Database
Option Explicit

Sub rsTest()
    Dim cdb As DAO.Database, rst As DAO.Recordset
    Dim strm As ADODB.Stream
    Set cdb = CurrentDb
    Set rst = cdb.OpenRecordset("SELECT word FROM vocabulary WHERE ID=3", dbOpenSnapshot)
    Debug.Print rst(0).Value
    Set strm = New ADODB.Stream
    strm.Type = adTypeText
    strm.Charset = "utf-8"
    strm.Open
    strm.WriteText rst(0).Value
    strm.SaveToFile "C:\Users\Gord\Desktop\foo.txt"
End Sub

在 VBA 编辑器的即时窗口中显示以下内容

????t?

但生成的文本文件确实包含正确的(希腊)字符

因此,不要为 VBA 编辑器显示中的 ? 字符而烦恼,而应专注于 Word 文档中的实际结果。

【讨论】:

感谢这对大多数字符都有效,谁知道其他字符集是什么字符集。现在我必须检查并将 html 标签 memo 字段添加到可用的东西,以便我可以将它们添加到书签。感谢您的帮助!

以上是关于VBA 代码中的字符变化的主要内容,如果未能解决你的问题,请参考以下文章

Excel Vba 如何将单元格的值,同步显示在窗体中的LABEL或TEXTBOX中?

vba 判断一个单元格中是不是包含某个字符串 有则执行后面的语句

MS Access 中的拼写检查 VBA 子程序已停止工作

如何在vba中的字符串中添加双引号?

从excel vba的列中的所有单元格中删除不需要的字符

当参考范围内的值发生变化时,VBA 更新公式