改变工作驱动器

我在我的macros中有一些标准化的过程,将更改应用到放置在任何目录中的一堆文件,而我不知道为什么会得到不同的结果。 为了说明,这是标准代码的开始:

'list files in the folder where this macro is placed strNombreCarpeta = ThisWorkbook.Path ChDir strNombreCarpeta strArchivoExcel = Dir("*." & CStr(strExtension)) 'rest of the code 

即使我的工作目录是在另一个驱动器(不是“C:”),我可以得到'strNombreCarpeta'variables,内容为'E:/ updates / 12_06_files /'并处理该文件夹中的文件。

但是,在另一台PC上使用相同的macros文件,该过程根本不起作用,variables“strNombreCarpeta”得到一个空值,并且“Dir”命令按照我的默认path是%CURRENT_USER%/ DOCUMENTS试图列出该文件夹上的文件。

所以,我没有得到我想要的文件的任何变化。

有些想法为什么这种变化的驱动器有时只有工作? 我怎样才能防止呢?

始终以“C:”工作并不是一个标准的解决scheme,因为驱动器空间有限。

就我所知,ChDir无法更改CurrentDrive。 你必须使用单独的命令 – ChDrive。 所以代码如下所示:

 strNombreCarpeta = thisworkbook.path strDrive = left(strNombreCarpeta,1) ChDrive strDrive ChDir strNombreCarpeta strArchivoExcel = Dir("*." & CStr(strExtension)) 

就个人而言,我只是用Dir函数使用完整的文件夹目录。 所以:

 strArchivoExcel = Dir(strNombreCarpeta & "\*." & CStr(strExtension)) 

在我看来这更简单,更安全。 它甚至可能在networkingpath(UNC)

如果有人听到答案,为什么它有时没有ChDrive的工作,我想知道亲爱的自己。 我最好的工作理论是,其他一些进程正在改变application.CurrDrive&.CurrDir。

小心:我没有testing任何代码 – 我没有在这台机器上安装Office。

几种更可靠的方法来获取文件列表而不使用ChDir

 Public Sub listFilesDir() Dim f As Variant f = Dir(ThisWorkbook.Path & "\" & "*.txt") Do While Len(f) > 0 Debug.Print f f = Dir Loop End Sub 

 Public Sub listFilesFSO() Dim fso As Object, fsoFolder As Object, f As Variant Set fso = CreateObject("Scripting.FileSystemObject") Set fsoFolder = fso.GetFolder(ThisWorkbook.Path) For Each f In fsoFolder.Files If InStr(f.Name, ".txt") > 0 Then Debug.Print f.Name Next 'or For Each f In fsoFolder.Files If f.Type = "Text Document" Then Debug.Print f.Name Next End Sub 

  • .xlsm Type: "Microsoft Excel Macro-Enabled Worksheet"
  • .csv Type: "Microsoft Excel Comma Separated Values File"
  • .txt Type: "Text Document"

感谢您的回答。 是的,ThisWorkbook.Path不是null,strNombreCarpeta获得一个值,实际上,ChDir是什么不工作。

我的事情我在Windows系统中find了解决scheme。 我的电脑已经安装在驱动器'C:'(Windows,Program Files,Users)中,但是我移动了'Documents','Images'和'Downloads'子文件夹来驱动'E:'。 因此,macros观过程从一开始就以“E:”开头,这就是ChDir适用于“E:/ updates / 12_06_files /”的原因。

令人惊讶的是,试图在我自己的个人电脑上运行macros像“C:/ updates /”这样的文件夹显示了我在其他电脑上遇到的同样的错误。

我对我的代码做了一些修改,添加了这些代码:

 strCurrentDrive = Left(ThisWorkbook.Path,2) ChDrive strCurrentDrive ChDir strNombreCarpeta 'rest of the code 

和工作! 我不确定在使用“Left(ThisWorkbook.Path,2)”或“Left(ThisWorkbook.Path,1)”之间是否会有差异,但是两者都可以工作。

我之前使用'fso'来计算文件夹中的文件,但是我更喜欢避免这种情况,通常会使进程变慢。

再次感谢大家。