2017-06-06 78 views
0

剛開始使用VBA時,我的代碼非常慢。我在網絡驅動器上有許多工作簿,每個工作簿都有幾張工作表。我試圖在每個工作表,以預先設計的工作表從多個不連續的範圍的數據提取,使用以下代碼:用於循環的VBA需要太長的時間

Private Function GetValue(path, file, sheet, ref) 
    'retrieve value 
    '// code 
    GetValue = ExecuteExcel4Macro(arg) 
End Function 

Sub UpdateModel1() 

    sheet = "blah blah" 
    Application.ScreenUpdating = False 

    'Outputs 
    destRow = 31   'destination row 
    destCol = 6    'destination column 
    srcRow = 50    'source row 

    For C = 23 To 31  'loop through source columns 
     ref = Cells(srcRow, C).Address 
     Cells(destRow, destCol) = GetValue(path, file, sheet, ref) 
     destCol = destCol + 1 
    Next C 

    Application.ScreenUpdating = True 

End Sub 

然而,子過程中使用嵌套for循環花費太長。有關如何改進此代碼的任何建議? PS:這是一個業餘愛好者的代碼,我只是在尋找一些能夠正常工作的東西。

+0

也許GetValue減慢它的循環迭代並不是很多。你有沒有嘗試沒有GetValue看它執行多快? – jivko

+0

我不明白這一點:ExecuteExcel4Macro(arg)'arg沒有被定義在任何地方,然後你不使用你傳遞給函數的變量。當你運行它時,你會得到除「=」以外的結果嗎? –

+0

它看起來像您的「GetValue」函數打開工作簿並提取一個值然後關閉它。這是一個昂貴的過程。更不用說你正在通過網絡連接進行此操作。更昂貴。現在它處於一個循環中。難怪它太慢了。如果這不是一個例行程序,您可以將文件複製到本地機器上。另外,如果可能,在源文件仍處於打開狀態時,您可能會將多個值複製到目標文件。 – twegner

回答

0

這裏是你正在嘗試做一個工作示例:

Sub TestGetSheetValue() 
    MsgBox GetSheetValue("N:\Tax Documents\", "Tax Stuff.xlsx", "Sheet1", "R1C3") 
End Sub 


Function GetSheetValue(strPath As String, strFile As String, strSheet As String, strCellRef As String) 
    GetSheetValue = ExecuteExcel4Macro("'" & strPath & "[" & strFile & "]" & strSheet & "'!" & strCellRef) 
End Function 

顯然改變你傳遞什麼到適合您需求的功能,注意地址是R1C1格式。

strSheet是工作表名稱,而不是工作表索引。

請確保您有一個路徑

上尾隨\最後,儘量不要使用類似文件,路徑和板材的變量名名。