【问题标题】:Excel VBA Dir() Error when file type changesExcel VBA Dir() 文件类型更改时出错
【发布时间】:2019-05-30 03:35:40
【问题描述】:

我试图更好地理解Dir 函数。我有一个Dir 循环来对目录中的所有.csv 文件执行操作,但是当循环遇到另一种文件类型(如.txt)时,它会出错而不是转到下一个.csv。物品。

这是我的代码的相关部分。

strSourceExcelLocation = "\\rilinfs001\Interdepartmental\Billings & Deductions\Billing Coordinators\MCB Reports\East\Monthly Quality MCBs (CMQ & SECMQ)\2019\Individual_Reports\" & fldr & "\"

strWorkbook = Dir(strSourceExcelLocation & "*.csv*")

Do While Len(strWorkbook) > 0
    'Open the workbook
    Set wbktoExport = Workbooks.Open(Filename:=strSourceExcelLocation & strWorkbook)

    'Export all sheets as single PDF
    Call Export_Excel_as_PDF(wbktoExport)

    'Get next workbook
    strWorkbook = Dir

    'Close Excel workbook without making changes
    wbktoExport.Close False
Loop

因此,如果目录中只有 .csv 文件,那么这可以正常工作。当它遇到另一种文件类型时,就会发生错误。

错误在线

strWorkbook = Dir

运行时错误 5:无效的过程调用或参数

我在开头使用.csv 中的通配符的方式是否遗漏了什么?

谢谢

【问题讨论】:

  • 你得到什么错误信息或号码?
  • 您应该重新应用相同的过滤器以仅获取 csv 文件,或者添加 If 语句以跳过找到的任何非 csv 文件。
  • 导致错误的文件的名称是什么?我从未见过Dir 忽略过滤器。
  • @TimWilliams 一个有效的示例文件名是“SECMQ0419045345D.CSV”。一个不起作用的例子是“SECMQ0419045345D.TXT”。每个 CSV 文件都会有一个对应的 TXT 文件。
  • @Mistella 我收到运行时错误 5。strWorkbook = Dir 行上的过程调用或参数无效。

标签: excel vba


【解决方案1】:

解决了我的问题。

问题似乎是因为当我调用另一个程序时,我在该子程序中有另一个Dir 来创建一个新文件夹(如果该文件夹尚不存在)。所以基本上我在Dir 中有一个Dir,这显然很糟糕。

我将文件夹创建部分移到了我的程序的最开始,因此它在我开始 Dir 循环所有 CSV 文件之前执行。

Option Explicit

Sub Loop_Dir_for_Excel_Workbooks()
Dim strWorkbook As String, wbktoExport As Workbook, strSourceExcelLocation As String, fldr As String, strTargetPDFLocation As String, d As String

strTargetPDFLocation = "\\nhchefs001\Accounting\IMAGING\BILLINGS & DEDUCTIONS\EAST MCB FILES\"
'***** Creating a folder to save the PDFs in. Naming the folder with today's date *****
d = Format(Date, "mm-dd-yyyy")
strTargetPDFLocation = "\\nhchefs001\Accounting\IMAGING\BILLINGS & DEDUCTIONS\EAST MCB FILES\" & d & "\"
If Len(Dir(strTargetPDFLocation, vbDirectory)) = 0 Then MkDir strTargetPDFLocation

fldr = InputBox("Input the EXACT Folder Name that you want to create PDFs for")

strSourceExcelLocation = "\\rilinfs001\Interdepartmental\Billings & Deductions\Billing Coordinators\MCB Reports\East\Monthly Quality MCBs (CMQ & SECMQ)\2019\Individual_Reports\" & fldr & "\"

'Search all Excel files in the directory with .xls, .xlsx, xlsm extensions
strWorkbook = Dir(strSourceExcelLocation & "*.csv")

Do While Len(strWorkbook) > 0
    'Open the workbook
    Set wbktoExport = Workbooks.Open(Filename:=strSourceExcelLocation & strWorkbook)

    'Export all sheets as single PDF
    Call Export_Excel_as_PDF(wbktoExport, strTargetPDFLocation)

    'Close Excel workbook without making changes
    wbktoExport.Close False

    'Get next workbook
    strWorkbook = Dir

Loop

End Sub

【讨论】:

    【解决方案2】:

    尝试对路径进行硬编码,然后再试一次。可能错误在硬编码中非常小。例如,在下面的代码中,将C:\Users\username\Desktop\AAA\ 替换为文件的路径。然后运行它。不要忘记最后一个\。它应该工作:

    Sub TestMe()
    
        Dim workbookPath As String
        workbookPath = Dir("C:\Users\username\Desktop\AAA\" & "*.csv")
    
        Do While Len(workbookPath) > 0
            Debug.Print workbookPath
            workbookPath = Dir
        Loop
    
    End Sub
    

    【讨论】:

    • 感谢您的回复。当我将确切的文件夹硬编码到其中时,您的代码确实有效,但我不会继续这样做。为了提供更多信息,我编辑了我的帖子以包含字符串 strSourceExcelLocation 是什么。该字符串包括另一个字符串fldr,它是通过用户输入确定的,因为它总是会发生变化,而且我们并不总是事先知道它的名称。如果它与该字符串无关,那么它是否与我在 Dir 循环期间执行的操作有关(编辑 csv 然后另存为 PDF)?
    • @TBoulz - 做一些小事是调试过程的第一部分。现在尝试在代码中添加fldr 部分并确保它有效。还是不要添加 pdf 部分。
    • 是的,我在同一个 sub 中添加了 fldr,它仍然有效。路径被打印到即时窗口。
    • @TBoulz - 就是这样。因此,如果只将CSV 路径打印到即时窗口,那么您可以专注于与Export_Excel_as_PDF 函数相关的3 行。
    • 我在循环中的第一个操作是打开CSV 文件,它不适用于一个字符串strSourceExcelLocation,因为它从目录返回文件名,但它需要完整文件路径。我以前使用strSourceExcelLocationstrWorkbook 打开文件。在我们尝试过的测试子中,我们留下了workbookPath,但我认为这还不足以打开文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多