尝试从工作簿列表中迭代一些工作簿,超出范围错误

时间:2015-03-17 13:19:06

标签: excel vba excel-vba

我有问题。我猜它更容易第一次编写代码,然后解释它,所以这里:

Sub Test()
   Dim myHeadings() As String
   Dim i As Long
   Dim path As String
   Dim pathtwo As String
   Dim currentWb As Workbook
   Dim openWb As Workbook
   Dim openWs As Worksheet
   Set currentWb = ActiveWorkbook
   path = "C:\pathto\"
   pfile = Split("File1,File2,File3", ",")
   myHeadings = Split("Januari,Februari,Mars,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December", ",")

 For j = 0 To UBound(pfile)
    pathtwo = path & pfile(j) & ".xlsx"
    i = 0
    If IsFile(pathtwo) = True Then
        For i = 0 To UBound(myHeadings)
            Set openWb = Workbooks.Open(pathtwo)
            Set openWs = openWb.Sheets(myHeadings(i))
            If openWs.Range("C34") = 0 Then
                currentWb.Sheets("Indata").Cells(70, i  + 27 + 12*j.Value = ""
            Else
                currentWb.Sheets("Indata").Cells(70, i + 27 + 12*j).Value = openWs.Range("C34")
            End If
       Next i
     End if
     Workbooks(openWb.Name).Close
Next j
End sub

我想从pfile列表中选择一个文件,遍历myHeadings中定义的所有工作表并在C34中扣除该值(实际上有更多的值被扣除,但要保持简短)。在此之后我想关闭文件,转到下一个文件并执行相同的操作直到所有三个文件(再次,实际上还有更多,其中一些还不存在)。

函数“IsFile”是

Function IsFile(fName As String) As Boolean
'Returns TRUE if the provided name points to an existing file.
'Returns FALSE if not existing, or if it's a folder
   On Error Resume Next
   IsFile = ((GetAttr(fName) And vbDirectory) <> vbDirectory)
End Function
由iDevlop在stackoverflow上编写,在这个帖子中:VBA check if file exists

我有

的原因
 currentWb.Sheets("Indata").Cells(70, i + 27 + 12*j).Value = openWs.Range("C34")

是因为我想开始在AA70(第70行,第27栏)将我的数据写入currentWb。 j * 12是因为它是“周期性的”,取决于它是哪个文件(文件file1对应于2015,file2到2016等),因此在我的摘要中我有月和年。

问题出现了但是当我运行这个宏时,在火星表的第一个文件中我超出了范围,但在我添加文件的迭代之前,第一个文件中没有任何下标超出范围。有谁能看出这是怎么回事?

请注意,缩进等可能有些偏差,因为我从一个更大的文件中复制了这个文件,其间有许多行与不相关的代码。

1 个答案:

答案 0 :(得分:1)

对于您的具体问题,这不是正确的答案,但这是我做类似的事情,可能会帮助您了解我是如何做到的。基本上这样做是打开CSV并复制整个工作表并将其粘贴到工作簿中。我正在将20个CSV转储合并到一个工作簿中,以便更容易地挖掘这些东西。

关于Dir()

您可以使用2个参数或不带参数来调用Dir。您使用2个参数初始化路径和属性(这是可选的)。我第二次在这个潜艇中打电话给Dir,这是没有任何争议的。这样做是获取后续文件。

Sub Add_Sheets()

Dim ws As Worksheet
Dim PasteSheet As Worksheet
Dim wb As Workbook

Set wb = Application.Workbooks.Open("C:\Users\Desktop\CSV\All.xlsx") 'Location of where you want the workbook to be

StrFile = Dir("c:\Users\Desktop\CSV\*.csv") 'Dir of where all the CSVs were. 
    Do While Len(StrFile) > 0
        Debug.Print StrFile
        Application.Workbooks.Open ("c:\Users\Desktop\CSV\" & StrFile)
        Set ws = ActiveSheet
        ws.Range("A1:C" & rows.Count).Select 'Selecting Specific content on the worksheet
        Selection.Copy
        wb.Activate
        wb.Worksheets.add(After:=Worksheets(Worksheets.Count)).name = StrFile 'Setting the sheet name to the name of the CSV file
        Range("A1").PasteSpecial Paste:=xlPasteValues
        StrFile = Dir 
    Loop

End Sub