VBA遍历目录编辑文件时报错Invalid procedure call or argument求助
错误根因
该报错由VBA的Dir函数特性直接导致:Dir不支持嵌套调用。你外层已启动了遍历.py文件的Dir上下文,后续处理.xml、.macro文件时,多次调用带参数的Dir(sFileName2)、Dir(sFileName1)检查文件是否存在,直接覆盖了外层Dir的遍历状态。等回到外层循环执行无参StrFile = Dir获取下一个.py文件时,原有遍历上下文已经丢失,因此抛出「无效过程调用或参数」错误。
修复方案
核心思路是断开外层文件遍历对Dir的依赖,同时替换文件存在性检查逻辑,避免嵌套调用Dir:
- 先把目标路径下所有
.py文件全量读取到集合中,后续遍历集合处理文件,无需再依赖Dir迭代 - 用
FileSystemObject的FileExists方法做文件存在性检查,完全不占用Dir的上下文,稳定性更高 - 修正变量声明不规范、未定义变量缺失逻辑等问题
修正后代码
' 需先在VBE菜单-工具-引用中勾选「Microsoft Scripting Runtime」 Dim fso As New FileSystemObject Sub InternalData_Header() Dim path As String, StrFile As String Dim pyFiles As New Collection, pyFile As Variant Dim fileNameWithoutExt As String ' 对应原代码未定义的Arr1(0) Dim sBuf As String, sTemp As String, iFileNum As Integer, sFileName As String path = "C:\Users\xyz\Downloads\2" ' 第一步:先收集所有.py文件到集合,脱离Dir迭代依赖 StrFile = Dir(path & "\*.py") Do While Len(StrFile) > 0 pyFiles.Add StrFile StrFile = Dir Loop ' 第二步:遍历集合处理每个.py文件 For Each pyFile In pyFiles sFileName = path & "\" & pyFile ' 提取无后缀的文件名,替换原代码的Arr1(0) fileNameWithoutExt = Left(pyFile, Len(pyFile) - 3) ' 处理.py文件 iFileNum = FreeFile Open sFileName For Input As iFileNum sTemp = "" Do Until EOF(iFileNum) Line Input #iFileNum, sBuf sTemp = sTemp & sBuf & vbCrLf Loop Close iFileNum ' 原FoundCell判断逻辑保留 If Not FoundCell Is Nothing Then iFileNum = FreeFile Open sFileName For Output As iFileNum Print #iFileNum, sTemp Close iFileNum End If ' 处理.seq文件 sFileName = path & "\" & fileNameWithoutExt & ".seq" If fso.FileExists(sFileName) Then ' 用fso检查文件存在 iFileNum = FreeFile Open sFileName For Input As iFileNum sTemp = "" Dim seqHist As String Do Until EOF(iFileNum) Line Input #iFileNum, sBuf If InStr(1, sBuf, " Initial") Then seqHist = sBuf End If sTemp = sTemp & sBuf & vbCrLf Loop Close iFileNum iFileNum = FreeFile Open sFileName For Output As iFileNum Print #iFileNum, sTemp Close iFileNum End If ' 处理.xml文件 Dim sTemp1 As String, sFileName2 As String sFileName2 = path & "\" & fileNameWithoutExt & "--master.xml" If fso.FileExists(sFileName2) Then iFileNum = FreeFile Open sFileName2 For Input As iFileNum sTemp1 = "" Do Until EOF(iFileNum) Line Input #iFileNum, sBuf sTemp1 = sTemp1 & sBuf & vbCrLf Loop Close iFileNum iFileNum = FreeFile Open sFileName2 For Output As iFileNum Print #iFileNum, sTemp1 Close iFileNum End If ' 处理.macro文件 Dim macroCount As Long, sFileName1 As String For macroCount = 1 To 5 sFileName1 = path & "\" & fileNameWithoutExt & "_" & macroCount & ".macro" If fso.FileExists(sFileName1) Then iFileNum = FreeFile Open sFileName1 For Input As iFileNum sTemp = "" Do Until EOF(iFileNum) Line Input #iFileNum, sBuf sTemp = sTemp & sBuf & vbCrLf Loop Close iFileNum iFileNum = FreeFile Open sFileName1 For Output As iFileNum Print #iFileNum, sTemp Close iFileNum End If Next macroCount Next pyFile End Sub
内容的提问来源于stack exchange,提问作者Samadhan Gaikwad
相关产品推荐
相关产品推荐

