【问题标题】:Special characters (letters čćžšđ) in Excel 2013 VBA codeExcel 2013 VBA 代码中的特殊字符(字母 čćžšđ)
【发布时间】:2022-01-14 19:53:42
【问题描述】:

我在 Excel 2010 VBA 中制作了一个程序,其中包含像 ć č š 之类的字母...

Msgbox("Čiča gliša") 有效。

看起来 Excel 2013 在单元格和公式中支持这些字母,但在 VBA 中不支持。

VBA 将它们替换为一些甚至不在键盘上的符号。

执行代码时出错。

我认为这与语言设置有关。

【问题讨论】:

  • 正如您已经观察到的,Excel 在单元格中支持完整的 Unicode 字符集。因此,解决此问题的一种方法是使用隐藏工作表来存储您的资源。然后在您的 VBA 代码中将此隐藏工作表中的字符串加载到字符串变量中,然后以您喜欢的方式使用它

标签: excel vba excel-2013


【解决方案1】:

正如 BambiLongGone 所说,奇怪的字符串不太可能起作用。 我想说你最好的镜头是看this article。有一个名为 Unicode to VBA 的工具,您可以使用它来转换应用程序中的所有字符串。 例如:

Čiča gliša

将转换为

ChrW$(&H10C) & "i" & ChrW$(&H10D) & "a gli" & ChrW$(&H161) & "a"

【讨论】:

  • 谢谢,但我不会使用这个。程序用于仓库物料核算,有cca 1000张和许多带有代码的模块,因此转换它并不实用,因为它已经在少数装有Office 2010的机器(PC)上工作,唯一的问题是在装有Office的新机器上2013.
  • 所提及的网站目前已关闭。这是a blog post,其中提到了a working counterpart
  • FYI 请注意,ChrW charcode 参数是一个标识字符的 Long 不允许大于 65535 的值(十六进制值 &HFFFF ) - 见MS Help。为了通过仅在大于 FFFF 的十六进制代码块中发现的 Unicode 字符来表达符号,请参阅Get Unicode characters with CharCode values greater than hex FFFF 的五个解决方法:-)
【解决方案2】:

VBA 是 ANSI。 Ps 在它与 Windows 的交互中。它内部是 UTF16,COM 也是 UTF 16。但它的文件格式也是 ANSI,所以输入奇怪的字符串不太可能工作(因为它们不能按原样保存)。

因此,字符转换会自动发生,有一百万条规则控制它(大部分以可访问的方式未记录)。

如果遇到麻烦分配给一个字节数组。也许你需要从 unicode 文件中读取来绕过表单的 ANSI。

你的字符串()=“废话”

如果传递给字符串函数,VB 会将字节数组视为字符串。

【讨论】:

    【解决方案3】:

    问题在于 Windows 区域设置:非 unicode 程序的区域/管理/语言,必须将其设置为可以处理您的特殊字符的语言。

    【讨论】:

    • 这是另一种解决方案。对于那些不能或不想更改 Windows 设置的人来说,处理 VBA 代码(以上答案)是唯一的解决方案。
    【解决方案4】:

    您可以在出现的每段代码中手动编写重音符号,并且可以使用“查找和替换”来更快地完成。如果你有类似的东西:

    MsgBox "Código único"
    

    然后就可以查找替换了:

    [ó] 到 [" & Chr(243) & "]

    [ú] 到 [" & Chr(250) & "]

    等等……

    你会得到:

    MsgBox "C" & Chr(243) & "digo " & Chr(250) & "nico"
    

    如果您不知道每个重音字母的代码,那么您可以使用带有函数“CODE”的excel(函数Char相反)

    另外,您可以使用来自互联网的列表,如下所示:

    ASCII Code - The extended ASCII table

    我只是遇到了同样的问题并做了这个程序。使用 Visual Studio Code 运行良好,速度非常快。

    【讨论】:

    【解决方案5】:
    Function CroatianCharacters(CroatianCharacterOrderNumber As Integer, Optional UpperCase As Boolean = True, Optional DisplayAll As Boolean = False) As String
    
       'ISO Latin1 Extended A decimal code
        Dim AllCharacters
        UpperCaseLetters = "A,B,C," & ChrW(268) & "," & ChrW(262) & "," & "D," & "D" & ChrW(382) & "," & ChrW(272) & "," & _
            "E,F,G,H,I,J,K,L,Lj,M,N,Nj,O,P,R,S," & ChrW(352) & ",T,U,V,Z," & ChrW(381)
        LowerCaseLetters = "a,b,c," & ChrW(269) & "," & ChrW(263) & "," & "d," & "d" & ChrW(382) & "," & ChrW(273) & "," & _
            "e,f,g,h,i,j,k,l,lj,m,n,nj,o,p,r,s," & ChrW(353) & ",t,u,v,z," & ChrW(382)
        CroatianCharacters = LowerCaseLetters
    
        If (UpperCase = True) Then
            If (DisplayAll = False) Then
                AllCharacters = Split(UpperCaseLetters, ",")
                CroatianCharacters = AllCharacters(CroatianCharacterOrderNumber - 1)
            Else
                CroatianCharacters = UpperCaseLetters
            End If
        Else
            If (DisplayAll = False) Then
                AllCharacters = Split(LowerCaseLetters, ",")
                CroatianCharacters = AllCharacters(CroatianCharacterOrderNumber - 1)
            Else
                CroatianCharacters = LowerCaseLetters
            End If
        End If
    
    End Function
    

    【讨论】:

      【解决方案6】:

      说明:

      问题与字符编码有关 - 请参阅 BambiLongGone's answer

      “č,ř,ě”等特殊字符是Unicode Standard 的一部分。但是,VBA 使用Windows-native ("ANSI") code pages,它们可能支持也可能不支持特殊字符。因此,直接在 VBA 字符串中使用的特殊字符可能会也可能不会正常工作。

      最终用户方面的解决方案:

      如果您尝试使用带有 VBA 代码的文件并且显示错误字符,您通常可以通过更改 Windows 区域设置来解决此问题。转到:Control Panel - > Region -> Administrative -> Language for non-unicode programs -> Change system locale... 并将 Current system locale 更改为支持特殊字符的语言。

      开发者方面的解决方案:

      如果您正在使用 VBA 代码制作文件并且您的带有特殊字符的字符串无法正确显示,您需要使用字符代码定义字符。您可以直接使用特殊字符以“正常”方式编写字符串,然后使用 StrConv function 或自定义函数转换字符串 - 见下文。

      使用StrConv function进行转换:

      Sub mySub()
          Dim myText As String
          myText = "Mý něw čář"
          myText = StrConv(myText, vbFromUnicode)
          Range("O17").Value2 = myText 
      End Sub
      

      使用包含所有需要的特殊字符的自定义函数进行转换(对于所有 Unicode 字符,请参阅 Wikipedia):

      Sub mySub()
          Dim myText As String
          Dim myTextConv As String
          myText = "Mý něw čář"
          myTextConv = UNItoANSI(myText)
          Range("A1").Value2 = myTextConv
      End Sub
      
      Private Function UNItoANSI(text As String) As String
          text = Replace(text, "á", "" & ChrW$(225) & "")
          text = Replace(text, "ý", "" & ChrW$(253) & "")
          text = Replace(text, "ě", "" & ChrW$(283) & "")
          text = Replace(text, "č", "" & ChrW$(269) & "")
          text = Replace(text, "ř", "" & ChrW$(345) & "")
          UNItoANSI = text
      End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2017-12-06
        相关资源
        最近更新 更多