文件夹select对话框(VBA,Excel 2010)导致文件不可读

这可能是一个相当长的描述,所以请忍受我。 我遇到的问题与自定义macros,VBA和文件访问有关。

背景 :我正在尝试编写一个macros来处理多个CSV数据工作簿。 我有名为RawData_1.csv的文件,直到RawData_x.csv,其中x是我在特定文件夹中的文件数。

我的macros代码如下所示:

Sub ImportData() Application.ScreenUpdating = False Dim strDir As String Dim strFileName As String Dim wbToCopy As Workbook Dim intCol As Integer Set master = ActiveSheet **PLEASE SEE BELOW FOR 2 VERSIONS OF CODE THAT CAN GO HERE!** strFileName = Dir(strDir & "\*.csv") intCol = 2 Do While Len(strFileName) > 0 Set wbToCopy = Workbooks.Open(strFileName, , True) //Do other things I need it to do here wbToCopy.Close (False) strFileName = Dir intCol = intCol + 2 Loop Application.ScreenUpdating = True End Sub 

问题1(小问题) :当我执行macros时,文件以某种方式“改变”,并且下一次我在相同的文件夹中执行相同的macros时,它将报告没有find文件。 确切的错误是:

运行时错误“1004”:

找不到'RawData_1.csv'。 检查文件名称的拼写,并validation文件位置是否正确。

如果您尝试从最近使用的文件列表中打开文件,请确保文件现在已被重命名,移动或删除。

我已经find了解决这个问题的办法。 我所要做的就是进入带有所有csv文件的文件夹,打开列表中的第一个文件夹,并将其另存为MS-DOS CSV文件。 一旦我这样做了,我可以运行macros,它将能够打开所有的文件(不只是我“保存为”的第一个文件)。

虽然这很烦人,但这不是世界上最糟糕的事情。 如果有一个原因为什么excel这样做,我很想知道! 如果有这个问题的解决scheme,甚至更好!

问题2(大问题)这是我想解决的主要难题。 在上面的代码中,缺less的部分是告诉Excel(或macros)在哪里查找文件的代码的一部分。 我可以通过在path中硬编码来做到这一点,如下所示:

方法1:

 strDir = "C:\whateverPath" 

这种方法总是有效(除了上面遇到问题1时)。

但是,这显然不是编写macros的最佳方法,因为我不仅会使用它一次,而且需要多次使用它,而且我希望导入的数据文件将位于不同的文件夹中。 所以我试着写下如下:

方法2:

 Dim folderDialog As fileDialog Set folderDialog = Application.FileDialog(msoFileDialogeFolderPicker) folderDialog.AllowMultiSelect = False folderDialog.Show strDir = folderDialog.SelectedItems(1) 

我比较了方法1的strDir和方法2的strDir,发现它们的值之间没有可辨别的差异。 它们都包含正确的path“C:\ whateverPath”。

但是,使用方法2,excel将无法读取所选文件夹中的任何文件。 它将返回与上面相同的运行时错误1004,而我在上面的问题1中find的快速修复程序并没有帮助macros运行。

如果有人知道这里发生了什么,我真的很感激一些帮助解决这个问题!

编辑:我想我find了问题。 Set wbToCopy = Workbooks.Open(strFileName, , True)strFileName不使用完全限定的path。 所以当你调用.open方法时,我相信VBA正在使用CurDir值并将其附加到strFileName 。 当您执行“另存为”时, CurDir值将更改为您将.csv文件保存在其中的目录。这给出了“另存为”操作是允许您的macros运行的错觉。 实际上,这是将CurDir值更改为文件所在的目录的行为。 在.open使用完全限定的文件名,它应该每次运行。

以前的build议:我不认为你的文件名是完全合格的(你的错误信息应该是'C:\whateverPath\RawData_1.csv' could not be found. 'RawData_1.csv' could not be found. )。

我在查找代码中的错误时遇到了困难。 这是一种黑客一起,但如果你卡住,尝试使用这个:

 Option Explicit Sub ImportData() Application.ScreenUpdating = False Dim strDir As String Dim strFolderName As String Dim wbToCopy As Workbook Dim intCol As Integer Dim master As Excel.Worksheet Dim FSO As Object Dim FSO_FOLDER As Object Dim FSO_FILE As Object Dim FILE_EXT As String FILE_EXT = "csv" strFolderName = Get_Folder_Path() & "\" ''Create FileSystem Objects Set FSO = CreateObject("Scripting.FileSystemObject") Set FSO_FOLDER = FSO.GetFolder(strFolderName) Set master = ThisWorkbook.ActiveSheet ''**PLEASE SEE BELOW FOR 2 VERSIONS OF CODE THAT CAN GO HERE!** intCol = 2 If FSO_FOLDER.Files.Count > 0 Then ''Loop through each File in Folder For Each FSO_FILE In FSO_FOLDER.Files ''Test extension If FSO.GetExtensionName(FSO_FILE.Name) = FILE_EXT Then Set wbToCopy = Workbooks.Open(strFolderName & FSO_FILE.Name, , True) ''//Do other things I need it to do here wbToCopy.Close (False) intCol = intCol + 2 Else: End If Next Else MsgBox "No Files Found at " & strFolderName End If Set FSO = Nothing Set FSO_FOLDER = Nothing Application.ScreenUpdating = True End Sub Function Get_Folder_Path() As String Dim folderDialog As FileDialog Set folderDialog = Application.FileDialog(4) folderDialog.AllowMultiSelect = False folderDialog.Show Get_Folder_Path = folderDialog.SelectedItems(1) End Function 

请注意,这使用FileSystem库而不是本机Dir函数。 您还将select文件夹名称,而不是对话框的文件名称。