关于Dir VBA的问题

时间:2015-03-17 16:05:44

标签: vba excel-vba excel

我有一组文件,我想用文件名循环:2015年预算,2016年预算,2017年预算到2022年。我使用Dir循环使用它们。

Dim OpenWb as workbook
path = Dir("C:\pathtofile\Budget 20??.xlsx") 'Using the ? Dir Wildcard
filepath = "C:\pathtofile\" 'Since Dir returns file name, not the whole path
myHeadings = Split("Januari,Februari,Mars,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December", ",")
j = 0
 Do While Len(path) > 0
    i = 0
    If Dir = "Budget 2014.xlsx" Then
        j=0
    Else
        For i = 0 To UBound(myHeadings)
            Set openWb = Workbooks.Open(filepath & path)
            MsgBox Len(path)
            Set openWs = openWb.Sheets(myHeadings(i))
            If openWs.Range("C34") = 0 Then
                currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = ""
            Else
                currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = openWs.Range("C34")
            End If
        Next i
   End if
   path = Dir
   j= j + 1
  Loop

麻烦的是,在文件路径中还有一个名为Budget 2014的文件,我不想循环,因为1)没有必要,已经计算了值和2)因为它在循环中搞砸我的索引

更新了我的代码。但是在for i = 0 ...循环中使用msgBox(path)返回“Budget 2014.xlsx”,我不想循环,因此这与我的j下标“混乱”。

3 个答案:

答案 0 :(得分:1)

您可以使用Year方法。像,

Dim OpenWb as workbook, yearNo As Long, filepath As String

filepath = "C:\pathtofile\"
yearNo = Year(Date())

path = Dir("C:\pathtofile\Budget " & yearNo & ".xlsx")

Do While Len(path) > 0
    set OpenWb = Workbooks.open(filepath & path) ' Since Dir only returns file name
    'Doing some things
    yearNo = yearNo + 1
    path = Dir("C:\pathtofile\Budget " & yearNo & ".xlsx")
Loop

答案 1 :(得分:1)

你也可以试试这个:

Dim OpenWb as workbook
path = Dir("C:\pathtofile\Budget 20??.xlsx") 'Using the ? Dir Wildcard
filepath = "C:\pathtofile\" 'Since Dir returns file name, not the whole path
myHeadings = Split("Januari,Februari,Mars,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December", ",")
j = 0
 Do While Len(path) > 0
    i = 0
'change here: only execute if it's NOT the file you're NOT after
    If Dir <> "Budget 2014.xlsx" Then
        For i = 0 To UBound(myHeadings)
            Set openWb = Workbooks.Open(filepath & path)
            MsgBox Len(path)
            Set openWs = openWb.Sheets(myHeadings(i))
            If openWs.Range("C34") = 0 Then
                currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = ""
            Else
                currentWb.Sheets("Indata").Cells(70, i + 27 + 12 * (j + 1)).Value = openWs.Range("C34")
            End If
        Next i
'Change here: only update path & j if you processed the file
       path = Dir
       j= j + 1
   End if
  Loop

答案 2 :(得分:1)

Sub M_snb()
 c00 = "C:\pathtofile\"
 sn = Application.GetCustomListContents(4)

 c01 = Dir(c00 & "Budget 20*.xlsx")
 Do While c01 <> ""
  If c01 <> "Budget 2014.xlsx" Then
   With GetObject(c00 & c01)
    For j = 0 To UBound(sn)
     c02 = c02 & "|" & IIf(.Sheets(sn(j)).Range("C34") = 0, "", .Sheets(sn(j)).Range("C34"))
    Next
    .Close 0
   End With
  End If
  c01 = Dir
 Loop

 sp = Split(Mid(c02, 2), "|")
 ThisWorkbook.Sheets("Indata").Cells(70, 51).Resize(, UBound(sp)) = sp
End Sub