2011-10-11 51 views
0

我正在使用此代碼,它之前工作得很好,但現在出於某種原因,我得到一個錯誤,只是說「400」,我沒想到我改變了什麼。Excel VBA - 代碼用於工作,現在找不到問題

Sub getdata() 

Dim xcell As Range 
Dim ycell As Range 
Dim sheetname As String 
Dim wblist() As String 
Dim i As Integer 
Dim wbname As String 
Dim j As Integer 

i = 0 
j = 0 

FolderName = "C:\Documents and Settings\shahzad.khan\Desktop\CRs\LOG" 
wbname = Dir(FolderName & "\" & "*.xls") 

Application.ScreenUpdating = False 

Do While wbname <> "" 

i = i + 1 
ReDim Preserve wblist(1 To i) 
wblist(i) = wbname 
wbname = Dir 


Set ycell = Range(Cells(i + 3, 2), Cells(i + 2, 28)) 
Set xcell = Range(Cells(2, 3), Cells(2, 28)) 
sheetname = "loging form" 

ycell.Formula = "=" & "'" & FolderName & "\[" & wblist(i) & "]" _ 
& sheetname & "'!" & xcell.Address 

Loop 

Do While j < 100 
Cells(j + 3, 1).Select 
ActiveCell.FormulaR1C1 = "=LEFT(RC[6],4)" 

Cells(3 + j, 1) = Val(Cells(3 + j, 1)) 
Cells(3 + j, 2).Select 
ActiveCell.FormulaR1C1 = _ 
"=VLOOKUP(RC[-1],'[CR Status.xlsx]Sheet1'!R3C1:R189C3,3,FALSE)" 

If Cells(3 + j, 1).Value = 0 Then 
Cells(3 + j, 1).Value = "" 
Cells(3 + j, 2).Value = "" 
End If 

j = j + 1 

Loop 

Application.CutCopyMode = False 
Application.ScreenUpdating = True 

Cells(1, 1).Select 

End Sub 

我知道現在的代碼效率不高,但它工作。它似乎粘貼了我想要的大部分信息,但由於某些原因,它並未捕獲我試圖從中拉出的excel文件的第一列和最後一列,而第二個循環甚至沒有開始。此外,它不再訪問文件夾中的每個文件,它似乎停止在目錄結束前的大約4個文件。任何幫助將不勝感激,謝謝!

+0

什麼行會失敗? – MalibuCusser

+0

我不確定,有沒有找到什麼方法? – user960358

+0

在代碼中設置斷點,或在調試菜單中使用Step Into。 – MalibuCusser

回答

0

錯誤400對應於應用程序定義或對象定義的錯誤。這意味着它不喜歡或理解你通常的參考。

通過您的代碼瀏覽彈出的唯一地方就是你

Do While j < 100 
    Cells(j + 3, 1).Select 
    ActiveCell.FormulaR1C1 = "=LEFT(RC[6],4)" 

除非我錯過了我不看到你提到你通過它想循環什麼工作。

順便說一下,你真的不應該「選擇」一個單元格。它速度慢,效率低下。與工作表一樣。你可以做類似的東西來..

Do While j < 100 
    'First way 
    Sheet1.Cells(J+3,1).FormulaR1C1 = "=Left(RC[6],4)" 
    'Second way 
    Worksheets("Sheet1").Cells(J+3,1).FormulaR1C1 = "=Left(RC[6],4)" 

儘量確保您的所有引用明確設置(使用F8和循環通過代碼,看「機」窗口),讓我知道,如果您有任何問題,我們會從那裏縮小範圍。

編輯:讓我們一路回顧並從另一個角度加以解決。你需要做的是去工具 - >參考 - >向下滾動到Microsoft腳本運行時,然後單擊它並點擊確定。然後使用下面的代碼。

Sub Main() 
Dim FSO As FileSystemObject 
Dim File As File 
Dim Folder As Folder 
Dim Files As Files 
Dim WkBook As Workbook 
Dim FileInfo As Variant 

Set FSO = New FileSystemObject 
Set Folder = FSO.GetFolder("C:\Documents and Settings\shahzad.khan\Desktop\CRs\LOG") 
Set Files = Folder.Files 

For Each File In Files 

    If Right(File.Name, 3) = "xls" Then 

    Set WkBook = Workbooks.Open(File) 
    FileInfo = WkBook.Worksheets("Sheet1").Range("A2:J400").Value 

    'Do Work With Array Here 

    WkBook.Close 
    End If 

Next 

Set Files = Nothing 
Set Folder = Nothing 
Set FSO = Nothing 


End Sub 

現在,無論您添加或減少多少個文件,該代碼都可以工作。當您完成與數組的工作並想將信息放入另一個Excel表中時,您只需翻轉代碼即可。像...

MyWorkbook.Worksheet("Sheet1").Range("A2:J400") = FileInfo 

我知道,不回答原來的問題,但錯誤400平時總是意味着一些地方改變,現在卻無法找到它。而不是去尋找它,通常更容易編碼保護。

+0

感謝您選擇單元格的提示。 此外,我的代碼沒有進入第二個循環,似乎它在目錄中的文件數量有問題,因爲它在完成信息之前崩潰。 – user960358

+0

我用f8來通過循環,它看起來像在「Ycell.formula」行發生錯誤。它是在從第56或第57個文件中提取數據之後。 – user960358

+0

與我添加文件有關嗎?因爲當我拿出幾個文件並添加新文件時,它不會停在同一個地方,它會提前停止。 – user960358