Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 循环目录打开每个文件激活表并添加新列_Excel_Vba - Fatal编程技术网

Excel 循环目录打开每个文件激活表并添加新列

Excel 循环目录打开每个文件激活表并添加新列,excel,vba,Excel,Vba,我已经编写了需要执行以下操作的代码: 扫描目录op.xlsx文件#请查看 打开文件激活表“Buitendelen”(有些文件没有,所以跳过文件继续) 如果激活了表“buitendelen”,则在C和D之间添加新列 保存文件 关闭文件 转到下一个文件 它有时无法工作,或者在编辑文件一段时间后崩溃 Sub-AllFiles\u click() “//相应地更改主文件夹的路径 调用RecursiveFolders(“C:\testlab\testmap”) 端接头 子递归文件夹(ByVal MyPat

我已经编写了需要执行以下操作的代码:

  • 扫描目录op.xlsx文件#请查看
  • 打开文件激活表“Buitendelen”(有些文件没有,所以跳过文件继续)
  • 如果激活了表“buitendelen”,则在C和D之间添加新列
  • 保存文件
  • 关闭文件
  • 转到下一个文件
  • 它有时无法工作,或者在编辑文件一段时间后崩溃

    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