2011-08-05 64 views
11

我試圖讓VBA來觸發命令Excel不完整的宏打開其他工作簿

sImportFilePath = Application.GetOpenFilename(FileFilter:= _ 
"Excel Files (*.xls), *.xls", Title:="Choose The Source File") 
Application.Workbooks.Open (sImportFilePath) 
sImportFileName = FunctionGetFileName(sImportFilePath) 

後,當我通過函數步他們的工作,但是當我使用熱鍵按Ctrl + Shift + F或任何其他熱鍵,Application.Workbooks.Open命令工作,但它導航新的Excel文檔,然後不執行任何操作。但是,當我在開發人員選項卡中打開「宏」時,選擇我的宏,然後單擊「運行」,一切運行良好。

+0

你說它不「做任何事情」 - 你期望看到什麼?據推測,您發佈的示例後面還有更多代碼。什麼是FunctionGetFileName? –

+0

預期的結果是執行下一行FunctionGetFileName,並繼續執行整個文檔。 FunctionGetFileName是我在程序的其他地方寫的一個函數,它從FilePath中找到FileName,但之後還有更多的代碼不能執行。然而,從進一步的實驗中,我縮小了問題的範圍並相應修改了問題。 – soytsauce

+0

什麼版本的Excel?在2007年爲我工作的Ctrl + Shift + F。 –

回答

18

我實際上碰到了這個確切的問題,並最終找到了解決我的問題的方法。

它是Shift按鈕,用於調用您的代碼的鍵盤快捷鍵。

顯然有Excel中的一個功能,專門設計用於防止代碼當打開工作簿和移位鍵被按下,但運行不幸的是這也影響了工作簿打開通過VBA的Workbook.Open方法。這在KB Article 555263中提到,適用於Excel 2000 & 2003,但我在Excel 2010中遇到了同樣的問題,所以我想它也會影響2007年。

當您嘗試通過代碼很早在程序中打開工作簿時,會發生這種情況。如果在您有足夠時間實際釋放Shift按鈕之前撥打Workbook.Open的電話號碼,則Excel會將此解釋爲試圖阻止代碼運行並中止該過程。並沒有任何錯誤信息或任何我找到的東西。它只是突然停下來。

解決方法/修復是強制代碼在發出Workbook.Open命令之前等待釋放Shift鍵。

%的文章,只需將此代碼添加到您的宏應該這樣做:

'Declare API 
Declare Function GetKeyState Lib "User32" (ByVal vKey As Integer) As Integer 
Const SHIFT_KEY = 16 

Function ShiftPressed() As Boolean 
'Returns True if shift key is pressed 
    ShiftPressed = GetKeyState(SHIFT_KEY) < 0 
End Function 

Sub Demo() 
    Do While ShiftPressed() 
     DoEvents 
    Loop 
    Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx" 
End Sub 

(注:此代碼是針對Excel的32位版本的64位版本將需要使用。 Declare聲明中的PtrSafe屬性)。

如果你不想增加額外的代碼,那麼你唯一的其他選擇是不使用按Ctrl ++一些推出宏,還是後來把Workbook.Open命令宏(在開始時不是正確的),以便給自己啓動它之後釋放Shift按鈕的時間。

0

一個簡單的解決方法,它爲我做的是將VBA指派給快捷鍵而無需移位。我不喜歡這樣做,因爲與默認的Excel快捷方式有很多衝突。但有一些Excel 2010基於this article:Ctrl + e,Ctrl + j,Ctrl + m,Ctrl + q。

+1

歡迎來到SO!這個答案如何增加任何價值?已經有[答案](http://stackoverflow.com/a/19712974/923794)用另一種解決方法更詳細地描述了這個確切的問題。如果您確實想回答以往的問題,請確保您提供附加價值。 – cfi

1

只需在調用Workbooks.Open之前向「DoEvents」添加單個調用即可。 所以folloiwng段將工作:上法國論壇發現

DoEvents 
Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx" 
0

臨時解決方法:激活所選的工作簿之前使用下面ForEachWinDoEvents

Sub Test() 
    Application.ScreenUpdating = False 
    Set w1 = Workbooks.Add(xlWBATWorksheet) 
    Set w2 = Workbooks.Add(xlWBATWorksheet) 
    Set w3 = Workbooks.Add(xlWBATWorksheet) 
    Application.ScreenUpdating = True 
    ForEachWinDoEvents 
    w2.Activate 
End Sub 

Sub ForEachWinDoEvents() 
Dim win As Window 
    For Each win In Application.Windows 
    DoEvents 
    Next win 
End Sub 
0

問題是否有一行代碼在這行代碼之前隨時選擇多個選項卡?我發現這有點像在選擇鍵的整個過程中按住shift鍵。要解決這個問題,我有宏取消組合(單選)選項卡,然後宏開始工作。

+0

歡迎來到SO。請閱讀[如何回答]。 – thewaywewere

相關問題