2017-03-11 48 views
2

問題非常複雜。您可以在下面找到代碼的精髓。我想從一個特定的工作簿中獲取數據(其中有幾十個,循環部分工作正常),但下面的代碼不起作用,因爲工作表是在西里爾文,他們給的價值'? ?????」到sheet As String參數。我想問問如何強制重命名工作簿而不打開它(沒有Workbook.Open(WorkbookNum1),因爲在這種情況下需要相當長的時間)。或者如何修改此代碼以應用表索引例如:sheets(3)。我將衷心感謝您的幫助!如何處理工作表(Unicode VBA顯示和處理)中出現錯誤(#REF)的西裏爾字母,VBA

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 
+0

您是否嘗試過打開的工作簿和使用* Sheet1中,Sheet2中,工作表Sheet 3 * * codenames **而不是西里爾文工作表名稱?任何與VBA有關的事情都非常以EN-US爲中心,所以工作表代號應該是標準的默認值。 – Jeeped

+0

即使VBA循環打開並關閉它也需要10-15分鐘......並且只需要兩個數據...在2張/工作簿上:/它們具有相同的組織,但工作簿的數量是大......:/ – svi

+0

嗯......我認爲現代電腦的速度很慢,可能需要10-15分鐘。必須是相當計算密集的。 – Jeeped

回答

4

VBA很好地處理unicode,但VBA編輯器不顯示它。這可以使unicode很難在VBA中工作,如果你不習慣。

當第一次面對需要使用unicode(大多數人使用隨機的小波爲可愛的文字效果,但也是一個整體的俄羅斯網站),我解決了這個問題,將unicode字符串放在工作表中(工作表顯示unicode就好了),然後通過從工作表中提取它們的值來設置我的變量。

因此,建立一個名爲「UniSrc」(名稱可以是任何內容)的工作表,並在列A到D中包含路徑,文件,工作表和地址。在列C中複製並粘貼unicode工作表名稱。

這是你的測試程序,修改,以這種方式工作:

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 

看你怎麼走。我在我的平板電腦上,所以我把它寫在了我的頭頂,不能測試它,但必需品在那裏。

+0

Winterknell,你是天才..我花了一整天的時間來想清楚,如何解決這個問題,基本上什麼都沒有。是的,它的工作!非常感謝你 ;) !!! – svi

+0

很高興聽到這個消息。不客氣,謝謝你的打勾。 – Winterknell

2

VBA中的Unicode字符可以硬編碼爲ChrW函數級聯的序列。

MsgBox ChrW(1044) & ChrW(1040) ' "ДА" 

要獲得unicode code points,例如,您可以把表名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 
+0

Hello Slai, 老實說,我想我只是部分地理解了你:S。我不清楚爲什麼你要定義'b()As Byte'並且給它分配一個數組,這導致**類型不匹配錯誤**。但據我所知你建議將俄文單詞解碼爲Unicode,然後運行代碼? – svi

+0

對@svi抱歉啊,本週我無法測試代碼。這很可能是我誤解了,但從我的理解,例如,當你將Unicode字符粘貼到VBA編輯器中時,它們顯示爲??。解決方法是使用ChrW(我假設第一個代碼示例有效?)。字節數組是從字符串中獲取字節的一種手段。 – Slai

+0

代碼部分對我來說還是不太清楚Slai,但是'ChrW(....)'的想法在一般情況下非常有用,在其他一些情況下非常有用謝謝;)(每天我們都可以學到一些東西我們認爲是不可能的;)) – svi