Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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文件的所有子文件夹并提取所有VBA代码_Excel_Powershell_Recursion_Vbscript_Extract - Fatal编程技术网

如何递归检查现有Excel文件的所有子文件夹并提取所有VBA代码

如何递归检查现有Excel文件的所有子文件夹并提取所有VBA代码,excel,powershell,recursion,vbscript,extract,Excel,Powershell,Recursion,Vbscript,Extract,我正在寻找一种方法,如何将PowerShell脚本与VBscript结合起来,从复杂文件夹结构中的大量excel文件中提取所有VBA/win32代码 我需要递归检查现有Excel文件(PSH)的所有子文件夹,并将每个Excel工作表的所有代码VBA/win32/对话框(VBS)提取到相同文件夹级别的文本文件中 我发现VBscript可以从excel表格中提取VBA代码,请参见下面的链接和代码。现在我想将其合并到一个PowerShell脚本中 你能帮帮我吗 代码: 选项显式 常量vbext\u

我正在寻找一种方法,如何将PowerShell脚本与VBscript结合起来,从复杂文件夹结构中的大量excel文件中提取所有VBA/win32代码

我需要递归检查现有Excel文件(PSH)的所有子文件夹,并将每个Excel工作表的所有代码VBA/win32/对话框(VBS)提取到相同文件夹级别的文本文件中

我发现VBscript可以从excel表格中提取VBA代码,请参见下面的链接和代码。现在我想将其合并到一个PowerShell脚本中

你能帮帮我吗

代码:

选项显式
常量vbext\u ct\u ClassModule=2
常量vbext\U ct\U文件=100
常数vbext\u ct\u MSForm=3
常量vbext\U ct\U标准模块=1
主要
副总管
Dim xl
暗fs
暗淡的笔记本
Dim VBComp
暗Sfx
Dim导出文件夹
如果Wscript.Arguments.Count为1,则
MsgBox“作为唯一的参数,提供XLS文件的完整路径以从中提取所有VBA。”
其他的
Set xl=CreateObject(“Excel.Application”)
设置fs=CreateObject(“Scripting.FileSystemObject”)
xl.Visible=true
设置WBook=xl.Workbooks.Open(Trim(wScript.Arguments(0)))
ExportFolder=WBook.Path&“\”&fs.GetBaseName(WBook.Name)
fs.CreateFolder(ExportFolder)
对于WBook.VBProject.VBComponents中的每个VBComp
选择案例VBComp.Type
案例vbext\U ct\U类模块,vbext\U ct\U文档
Sfx=“.cls”
案例vbext\U ct\MSForm
Sfx=“.frm”
案例vbext\U ct\U标准模块
Sfx=“.bas”
其他情况
Sfx=“”
结束选择
如果是Sfx“”,则
出错时继续下一步
呃,明白了
VBComp.Export导出文件夹&“\”&VBComp.Name&Sfx
如果错误号为0,则
MsgBox“无法导出”&ExportFolder&“\”&VBComp.Name&Sfx
如果结束
错误转到0
如果结束
下一个
xl.退出
如果结束
端接头

PowerShell中的递归非常简单:

Get ChildItem'C:\base\folder'-Include'*.xls*'-Recurse |%{
&cscript.exe//NoLogo'C:\path\to\your.vbs'$\ FullName
}
但是,与其为每个文件运行VBScript,我建议将VBScript代码翻译为PowerShell。它不需要太多的工作,而且还将提高代码的整体性能

option explicit

Const vbext_ct_ClassModule = 2
Const vbext_ct_Document = 100
Const vbext_ct_MSForm = 3
Const vbext_ct_StdModule = 1

Main

Sub Main
    Dim xl
    Dim fs
    Dim WBook
    Dim VBComp
    Dim Sfx
    Dim ExportFolder

    If Wscript.Arguments.Count <> 1 Then
        MsgBox "As the only argument, give the FULL path to an XLS file to extract all the VBA   from it."
    Else

        Set xl = CreateObject("Excel.Application")
        Set fs = CreateObject("Scripting.FileSystemObject")

        xl.Visible = true

        Set WBook = xl.Workbooks.Open(Trim(wScript.Arguments(0)))

        ExportFolder = WBook.Path & "\" & fs.GetBaseName(WBook.Name)

        fs.CreateFolder(ExportFolder)

        For Each VBComp In WBook.VBProject.VBComponents
            Select Case VBComp.Type
                Case vbext_ct_ClassModule, vbext_ct_Document
                    Sfx = ".cls"
                Case vbext_ct_MSForm
                    Sfx = ".frm"
                Case vbext_ct_StdModule
                    Sfx = ".bas"
                Case Else
                    Sfx = ""
            End Select
            If Sfx <> "" Then
                On Error Resume Next
                Err.Clear
                VBComp.Export ExportFolder & "\" & VBComp.Name & Sfx
                If Err.Number <> 0 Then
                    MsgBox "Failed to export " & ExportFolder & "\" & VBComp.Name & Sfx
                 End If
                On Error Goto 0
            End If
        Next

        xl.Quit
    End If
End Sub