2011-10-11 58 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