【问题标题】:Getting question marks when reading range from Excel in VBA (Encoding problem)从 VBA 中的 Excel 读取范围时获取问号(编码问题)
【发布时间】:2020-07-15 11:03:54
【问题描述】:

我正在尝试从 Excel 电子表格中读取一个范围,并使用 VBA 将其存储在一个二维数组中。

Dim myRange As Range
Dim myArray() As Variant

myArray = myRange.Value2

不幸的是,一些单元格包含 VBA 无法识别的字符,例如希腊大写 beta (Unicode 914)。 这些字符作为问号 (ASCII 63) 存储在我的数组中。

我想根据数组的值对数组进行一些计算,并将修改后的数组写入另一个范围,保留原始字母。

我想知道是否有一种简单的方法可以导入这些字符,而不必遍历单个单元格并逐个编码字符串(主要是因为我的范围很大,而且我担心这种方法可能会花费时间) .

【问题讨论】:

    标签: excel vba encoding


    【解决方案1】:

    VBA 实际上可以识别这些字符。但是,VBA 编辑器不知道如何显示它们并用问号替换它们。您的 myArray 变量实际上具有正确的字符。要测试特定的 unicode 字符,请使用AscWChrW VBA 函数(我猜W 是宽的)。例如(假设myRange 中的每个单元格仅包含一个您可以使用的字符:

    ' Test by the unicode character
    If myArray(1, 1) = ChrW(914) Then
    

    ' Test by the character unicode number
    If AscW(myArray(1, 1)) = 914 Then
    

    此外,在 excel 公式中,您可以使用 UNICODE() 和 UNICHAR() 工作表函数来获得类似的结果。

    【讨论】:

    • 谢谢超级对称,正如你所说的编辑是罪魁祸首。我在本地窗口和消息框中看到问号,但是当我在单元格中写信时,我会返回我的测试版。
    • 我认为如果您没有设置要使用的语言,这将不起作用。这对您在即时窗口中输入:? ChrW(914) 有用吗?
    • @A-Sus 要在消息框中显示它,您必须按照我的回答中提供的步骤进行操作;)
    • @Dorian 你说得对,我一直认为消息框是 vba 编辑器的一部分
    【解决方案2】:

    我认为您必须执行这些步骤才能在 VBA 中使用希腊字符:

    1. 要在 VBA 中使用希腊语:打开控制面板
    2. 点击区域
    3. 单击“管理”选项卡
    4. 单击更改系统区域设置按钮
    5. 选择在程序中显示文本时使用的语言,例如 作为 VBE,不支持 Unicode。该设置将影响所有 您计算机上的用户帐户。

    来源和信用here,这是您纠正问题所需要的。

    编辑

    ChrW(914)
    

    也会返回?

    如果您没有按照前面的步骤操作..

    【讨论】:

    • 感谢分享。很高兴知道这个选项存在。
    • 谢谢你,多里安。希腊字母不是编辑器无法显示的唯一字母,所以这只能部分解决我的问题。
    • @Dorian 与参考。对于您的编辑,ChrW(914) 实际上 returns right unicode 914 字符。但是,它会在即时窗口中将其显示为问号。试试Range("A1").Value = ChrW(914),你应该在单元格A1中得到正确的字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多