我的宏中有一些标准化的流程可以将更改应用到放在任何目录中的一堆文件,而且我不知道为什么会得到不同的结果。为了说明,这是标准代码的开始:
'list files in the folder where this macro is placed
strNombreCarpeta = ThisWorkbook.Path
ChDir strNombreCarpeta
strArchivoExcel = Dir("*." & CStr(strExtension))
'rest of the code
即使我的工作目录在另一个驱动器中(不是" C:"),我也可以获得for' strNombreCarpeta'变量,内容为' E:/ updating / 12_06_files /'并处理该文件夹上的文件。
但是,在另一台PC中使用相同的宏文件,该过程根本不起作用,变量' strNombreCarpeta'得到一个空值," Dir"命令工作,我的默认路径是%CURRENT_USER%/ DOCUMENTS,并尝试列出该文件夹上的文件。
所以,我没有对我想要的文件进行任何更改。
有些人知道为什么这种驱动器的改变有时会起作用? 我该如何防止这种情况?
始终在" C:"不是标准解决方案,因为驱动器中的空间有限。
答案 0 :(得分:0)
据我所知,ChDir无法更改CurrentDrive。你必须使用单独的命令 - ChDrive。所以代码看起来像:
strNombreCarpeta = thisworkbook.path
strDrive = left(strNombreCarpeta,1)
ChDrive strDrive
ChDir strNombreCarpeta
strArchivoExcel = Dir("*." & CStr(strExtension))
就个人而言,我只会使用带有Dir功能的完整文件夹目录。所以:
strArchivoExcel = Dir(strNombreCarpeta & "\*." & CStr(strExtension))
在我看来,这更容易,更安全。它甚至可能在网络路径(UNC)上工作
如果有人明白答案,为什么它有时候没有ChDrive,我想知道自己的anwser。我最好的工作理论是,其他一些过程正在改变应用.CurrDrive& .CurrDir。
注意:我没有测试上面的任何代码 - 我没有在这台机器上安装Office。
答案 1 :(得分:0)
在不使用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"
答案 2 :(得分:0)
感谢您的回答。是的,ThisWorkbook.Path不为null,strNombreCarpeta获取一个值,实际上,ChDir是无效的。
我在Windows系统中找到了解决方案。我的电脑已将所有内容安装在驱动器'C:'(Windows,程序文件,用户)中,但差别在于我移动'文档','图像'和'下载'子文件夹来驱动'E:'。因此,宏过程从一开始就在'E:'开始,这就是为什么ChDir与'E:/ updating / 12_06_files /'合作的原因。
令人惊讶的是,尝试在我自己的PC中运行宏,如'C:/ updating /'这样的文件夹显示了我在其他PC上遇到的相同错误。
我对我的代码做了一些修改,添加了以下几行:
strCurrentDrive = Left(ThisWorkbook.Path,2)
ChDrive strCurrentDrive
ChDir strNombreCarpeta
'rest of the code
并且工作了!我不确定在使用'Left(ThisWorkbook.Path,2)'或'Left(ThisWorkbook.Path,1)'之间是否存在差异,但两者都有效。
之前我曾使用'fso'来计算文件夹中的文件,但我更喜欢避免它,通常会使进程变慢。
再次感谢大家。