如何在VBA中处理工作表(Unicode VBA显示和处理)中由西里尔字母引起的错误(#REF)

如何在VBA中处理工作表(Unicode VBA显示和处理)中由西里尔字母引起的错误(#REF),vba,excel,Vba,Excel,这个问题相当复杂。您可以在下面找到代码的精髓。我想从一个特定的工作簿中获取数据(有几十个工作簿,循环部分工作正常),但下面的代码不工作,因为工作表是西里尔文的,它们将值“???????”作为字符串参数提供给工作表。我想问一下,如何在根本不打开工作簿的情况下强制重命名工作簿(不打开workbook.Open(WorkbookNum1),因为在这种情况下,这会花费很多时间)。或者如何修改此代码以应用图纸索引,例如:sheets(3)。我非常感谢你的帮助 Private Function GetVal

这个问题相当复杂。您可以在下面找到代码的精髓。我想从一个特定的工作簿中获取数据(有几十个工作簿,循环部分工作正常),但下面的代码不工作,因为工作表是西里尔文的,它们将值“???????”作为字符串参数提供给
工作表。我想问一下,如何在根本不打开工作簿的情况下强制重命名工作簿(不打开
workbook.Open(WorkbookNum1)
,因为在这种情况下,这会花费很多时间)。或者如何修改此代码以应用图纸索引,例如:
sheets(3)
。我非常感谢你的帮助

Private Function GetValue(path, file, sheet, ref)

     Dim arg As String

     'Make sure the file exists
     If Right(path, 1) <> "\" Then path = path & "\"

     If Dir(path & file) = "" Then
     GetValue = "File Not Found"
    Exit Function

   End If

  'Create the argument
    arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
    Range(ref).Range("A1").Address(, , xlR1C1)
    'Execute an XLM macro
   GetValue = ExecuteExcel4Macro(arg)

End Function


Sub TestGetValue()

p = "c:\XLFiles\Budget"
f = "Budget.xls"
s = "Sheet1"
a = "A1"

MsgBox GetValue(p, f, s, a)

End Sub
私有函数GetValue(路径、文件、工作表、参考)
作为字符串的Dim arg
'确保该文件存在
如果正确(路径,1)“\”则路径=路径&“\”
如果Dir(路径和文件)=“”,则
GetValue=“未找到文件”
退出功能
如果结束
'创建参数
arg=“”&path&“[”&file&“]”&sheet&“!”&_
范围(参考)。范围(“A1”)。地址(,xlR1C1)
'执行XLM宏
GetValue=ExecuteExcel4Macro(arg)
端函数
子TestGetValue()
p=“c:\XLFiles\Budget”
f=“Budget.xls”
s=“表1”
a=“A1”
MsgBox GetValue(p、f、s、a)
端接头

VBA可以很好地处理unicode,但VBA编辑器不会显示它。如果您不习惯使用unicode,则在VBA中很难使用它

当我第一次面对使用unicode的需要时(大多数人使用随机波形来产生可爱的文本效果,但也有一个完整的俄罗斯网站),我通过将unicode字符串放在工作表中(工作表显示unicode很好),然后通过从工作表中提取变量的值来设置变量

因此,设置一个名为“UniSrc”的工作表(名称可以是任何名称),路径、文件、工作表和地址在a到D列中。复制并粘贴unicode工作表名称在C列中

这是您的测试程序,经过修改后可以这样工作:

Sub TestGetValue()
    dim rowNow as long, wks as excel.worksheet
    dim p as string, f as string, s as string, a as string

    rowNow = 2 ' assuming row 1 is a header
    set wks = thisworkbook.sheets("UniSrc")
    with wks
        p = .cells(rowNow, 1) ' path
        f = .cells(rowNow, 2) ' file name
        s = .cells(rowNow, 3) ' unicode name of sheet sought
        a = .cells(rowNow, 4) ' cell address sought
    end with

    MsgBox GetValue(p, f, s, a)
End Sub
现在我们需要更新GetValue函数:

Function GetValue(sPath as string, sFile as string, sSheet as string, sAddress as string) as variant
    Dim arg As String, vTmp as variant

    If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
    If Dir(sPath & sFile) = "" Then ' Make sure the file exists
        vTmp = "File Not Found"
    else ' Create the argument
        arg = "'" & sPath & "[" & sFile & "]" & sSheet & "'!" & _
        Range(sAddress).Range("A1").Address(, , xlR1C1)
        'Execute an XLM macro
        vTmp = ExecuteExcel4Macro(arg)
    End If
    GetValue = vTmp
End Function
函数GetValue(sPath作为字符串,sFile作为字符串,sSheet作为字符串,sAddress作为字符串)作为变量
Dim arg作为字符串,vTmp作为变量
如果正确(sPath,1)“\”则sPath=sPath&“\”
如果Dir(sPath&sFile)=“那么”请确保该文件存在
vTmp=“未找到文件”
else’创建参数
arg=“”&sPath&“[”&sFile&“]”&sSheet&“!”&_
范围(鞍座)。范围(“A1”)。地址(,xlR1C1)
'执行XLM宏
vTmp=ExecuteExcel4Macro(arg)
如果结束
GetValue=vTmp
端函数

看看你怎么样。我在我的平板电脑上,所以我已经记下了这一点,无法对其进行测试,但基本要素就在那里。

VBA中的Unicode字符可以硬编码为一系列
ChrW
函数串联

MsgBox ChrW(1044) & ChrW(1040) ' "ДА"
例如,您可以将图纸名称放入
A1
中,然后尝试以下操作:

Dim b() As Byte, i As Long, a As Long
b = [A1].Text ' converts the string to byte array (2 or 4 bytes per character)

For i = 1 To UBound(b) Step 2            ' 2 bytes per Unicode codepoint
    a = b(i)
    a = a * 256 + b(i - 1) 
    Debug.Print " & AscW(" & a & ")";
Next

您是否尝试过打开工作簿并使用Sheet1、Sheet2、Sheet3代码名而不是西里尔文工作表名称?与VBA有关的任何内容都是以英语为中心的,因此工作表的代码名应该是标准默认值。即使使用VBA打开和关闭工作表循环,也需要10-15分钟。。。只需要两个数据。。。在2张工作表/工作簿上:/2张工作表/工作簿的组织结构相同,但工作簿的数量很大…:/六羟甲基三聚氰胺六甲醚。。。我认为,随着现代计算机的发展,10-15分钟所需的时间非常少。必须是计算密集型的。VBA可以很好地处理unicode,但VBA编辑器不显示unicode。我的问题是,每本书中的纸张名称是相同的,还是只有有限的纸张名称范围?如果是的话,我可以帮忙。表名是一样的,但都是西里尔文。。。这导致了错误…温特内尔,你是天才。。。我花了一整天的时间想办法,怎么解决这个问题,但基本上什么都没有。是的,它起作用了!非常感谢;)!!!很高兴听到这个消息。不客气,谢谢你的提示。你好,斯莱,老实说,我想我只是部分理解了你:S。我不太清楚为什么你要将
b()定义为Byte
,并为其分配一个数组,这会导致类型不匹配错误。但据我所知,你建议将俄语单词解码为Unicode,然后按原样运行代码?!啊,很抱歉@svi,我本周无法测试代码。很可能是我误解了,但据我所知,例如,当您在VBA编辑器中粘贴Unicode字符时,它们显示为??。解决这个问题的一种方法是使用ChrW(我假设第一个代码示例可以工作?)。字节数组是一种从字符串中获取字节的技巧。代码部分对我来说还不是很清楚,但是
ChrW(…)
的思想通常非常有用,在其他一些情况下非常有用,谢谢;)(每天我们都能学到一些我们认为不可能的东西;)