Excel 循环目录打开每个文件激活表并添加新列
我已经编写了需要执行以下操作的代码:Excel 循环目录打开每个文件激活表并添加新列,excel,vba,Excel,Vba,我已经编写了需要执行以下操作的代码: 扫描目录op.xlsx文件#请查看 打开文件激活表“Buitendelen”(有些文件没有,所以跳过文件继续) 如果激活了表“buitendelen”,则在C和D之间添加新列 保存文件 关闭文件 转到下一个文件 它有时无法工作,或者在编辑文件一段时间后崩溃 Sub-AllFiles\u click() “//相应地更改主文件夹的路径 调用RecursiveFolders(“C:\testlab\testmap”) 端接头 子递归文件夹(ByVal MyPat
Sub-AllFiles\u click()
“//相应地更改主文件夹的路径
调用RecursiveFolders(“C:\testlab\testmap”)
端接头
子递归文件夹(ByVal MyPath作为字符串)
将文件系统设置为对象
将文件夹变暗为对象
Dim objSubFolder作为对象
Dim objFile作为对象
将wkbOpen设置为工作簿
设置FileSys=CreateObject(“Scripting.FileSystemObject”)
设置objFolder=FileSys.GetFolder(MyPath)
Application.ScreenUpdating=False
Application.DisplayAlerts=False
'打开每个文件夹和子文件夹
对于objFolder.SubFolders中的每个objSubFolder
'在文件夹和子文件夹中搜索文件
对于objSubFolder.Files中的每个objFile
'设置打开的工作簿
设置wkbOpen=Workbooks.Open(文件名:=objFile)
'调用passwordfirst代码以解锁工作表
先打密码
'已激活的表buitendelen
wkbOpen.Sheets(“Buitendelen”)。激活
'调用columnadd代码以添加列
呼叫columnadd
'关闭工作簿并保存
wkbOpen.Close savechanges:=真
下一个
“重新开始
调用递归文件夹(objSubFolder.Path)
下一个
Application.ScreenUpdating=True
Application.DisplayAlerts=True
端接头
'使用密码解锁工作表的代码
子密码优先()
ActiveSheet.Unprotect密码:=“Freonr410a”
端接头
'要添加列的代码
私有子列add()
列(“D:D”)。插入Shift:=xlToRight,CopyOrigin:=XLFormatFromLeftOrove
端接头
关于您的代码和问题,我看到了一些东西。首先,线路:
ActiveSheet.Unprotect Password:="Freonr410a"
这一行有时可能会导致一些问题,因为打开特定工作簿后的第一个活动工作表可能不是Buitendelen工作表。您需要依靠某人(或您自己)关闭工作簿并激活此工作表(棘手的事情)
这一行:
Columns("D:D").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
。。。如果要添加新列,可能也是一些问题的根源。想象您的第一个工作表不是Buitendele工作表。您可以成功解锁未受保护的工作表,但现在您正试图将新列添加到完全不同的工作表中。不能接受
我还看到您忽略了根文件夹(“C:\testlab\testmap”)中的任何文件(文件夹除外)。这意味着,如果TestMap文件夹中有任何文件,它们将保持不变。我不知道这是不是我想要的东西
在这里,您可以找到问题的解决方案(在W10/Excel 2017 32位上测试)
额外说明:请按照命名约定进行操作,所有文件或递归文件夹都不会告诉任何有关子例程体的信息
变量命名约定:准确地说,如果您要使用匈牙利符号,请使用它-FileSys应更改为objFileSys。仅供参考,您真的应该删除密码。当密码崩溃时,您会遇到什么错误?另请检查步骤1中的注释,仅供参考“列(“D:D”)。插入”不会在D和之间插入列E@yuca路径正确且错误为fout 1004方法在[code]列(“D:D”)上插入类范围失败。插入移位:=xlToRight,CopyOrigin:=XLFormatFromLeftOrave[/code]@josh eller的密码是fake@eVinx目录不能有文件扩展名。不清楚您在步骤1中的意思是什么感谢您更干净的代码唯一的一件事是文件中没有“Buitendelen”表,只有“Bezoekers registratie”表是否有跳过此文件并继续下一步的选项?我想,如果工作簿包含1工作表,则跳过2如果执行此操作。没有内置的功能,可以检查工作表是否存在。我已经更新了我的答案。如果您觉得我的回答有用,请将我的回答标记为“答案”。另外,非常感谢+1:)
Sub AllFiles_click()
Call RecursiveFolders("C:\testlab\testmap")
End Sub
' Go through every folder starting from objFolder
' location recursively and add one column after column D
' inside workbook. If Buitendelen worksheet does not exists,
' go to next workbook.
Sub RecursiveFolders(ByVal MyPath As String)
Const BuitendelenWsName as String = "Buitendelen"
Dim FileSys As Object
Dim objFolder As Object
Dim objSubFolder As Object
Dim objFile As Object
Dim wkbOpen As Workbook
Dim wshToEdit as Worksheet
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set objFolder = FileSys.GetFolder(MyPath)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each objSubFolder In objFolder.SubFolders
For Each objFile In objSubFolder.Files
Set wkbOpen = Workbooks.Open(filename:=objFile)
If SheetExists(BuitendelenWsName, wkbOpen) Then
Set wshToEdit = wkbOpen.Worksheets(BuitendelenWsName)
' Before any changes, worksheet has to be unprotected.
wshToEdit.Unprotect Password:="Freonr410a"
wshToEdit.Columns("D:D").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
End if
wkbOpen.Close savechanges:=True
Next
Call RecursiveFolders(objSubFolder.Path)
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
set FileSys = nothing
set objFolder = nothing
set objSubFolder = nothing
set objFile = nothing
set wkbOpen = nothing
set wshToEdit = nothing
End Sub
Public Function SheetExists(byval sheetToFind As String, byref container as Workbook) As Boolean
Dim sht as Worksheet
SheetExists = False
For Each sht In container.Worksheets
If sheetToFind = sht.name Then
SheetExists = True
Exit For
End If
Next sht
set sht = nothing
End Function