VBA实用小程序61: 在文件夹内所有文件中运行宏/在工作簿所有工作表中运行宏

2019-12-12 16:28:00 浏览数 (1)

学习Excel技术,关注微信公众号:

excelperfect

在文件夹中所有文件上运行宏,或者在Excel工作簿中所有工作表上运行宏,这可能是一种非常好的Excel自动化方案。例如处理类似的数据工作簿文件并想要提取数据或转换该工作簿。下面给出了适用这种情况的一些VBA程序,这些程序代码整理自analystcave.com,供有兴趣的朋友参考。

在文件夹内所有文件中运行宏

代码如下:

代码语言:javascript复制
'本程序来自于analystcave.com
Sub RunOnAllFilesInFolder()
    Dim folderName As String
    Dim eApp As Excel.Application
    Dim fileName As String
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim currWs As Worksheet
    Dim currWb As Workbook
    Dim fDialog As Object
   
    Set fDialog =Application.FileDialog(msoFileDialogFolderPicker)
    Set currWb =ActiveWorkbook
    Set currWs = ActiveSheet
 
    '选择存储所有文件的文件夹
    fDialog.Title = "选择文件夹"
    fDialog.InitialFileName =currWb.Path
    If fDialog.Show = -1 Then
      folderName =fDialog.SelectedItems(1)
    End If
       
    '创建一个单独的不可见的Excel处理进程
    Set eApp = NewExcel.Application
    eApp.Visible = False
   
    '搜索文件夹中的所有文件[使用你的格式例如*.xlsx来代替*.*]
    fileName = Dir(folderName& "*.*")
    Do While fileName<> ""
        '更新状态栏来指示进度
        Application.StatusBar= "正在处理" & folderName & "" & fileName
 
        Set wb =eApp.Workbooks.Open(folderName & "" & fileName)
        '...
        '在这里放置你的代码
        '...
        wb.CloseSaveChanges:=False '关闭打开的工作簿
        Debug.Print "已处理 "& folderName & "" & fileName
        fileName = Dir()
    Loop
    eApp.Quit
    Set eApp = Nothing
    '清除状态栏并通知宏已完成
    Application.StatusBar =""
    MsgBox "在所有工作簿中都完成了宏执行"
End Sub

这段代码完成下列操作:

1.在当前工作簿路径中打开“选择文件”对话框,要求选择一个用于存储所有文件的文件夹。

2.打开一个单独的Excel进程(应用程序),然后逐个打开每个文件。

3.使用要在每个打开的工作簿上运行的代码替换“在这里放置你的代码”部分。

4.每个打开的工作簿在关闭时不会保存所作的修改。

在子文件夹内所有文件中运行宏

当想在文件夹中所有Excel文件上运行宏时,其中的一种情况是遍历所有子文件夹来运行宏。下面的内容与前述内容几乎相同,但是请注意声明了一个全局变量fileCollection,这将首先用于存储子文件夹中标识的所有文件,并且仅用于在此VBA集合中存储的文件上运行所有宏之后。

代码如下:

代码语言:javascript复制
'本程序来自于analystcave.com
Dim fileCollection As Collection
Sub TraversePath(path As String)
    Dim currentPath As String
    Dim directory As Variant
    Dim dirCollection AsCollection
    Set dirCollection = NewCollection
   
    currentPath = Dir(path,vbDirectory)
   
    '浏览当前目录
    Do Until currentPath =vbNullString
        Debug.PrintcurrentPath
        If Left(currentPath,1) <> "." And (GetAttr(path & currentPath) And vbDirectory)= vbDirectory Then
            dirCollection.AddcurrentPath
        ElseIfLeft(currentPath, 1) <> "." And (GetAttr(path &currentPath) And vbNormal) = vbNormal Then
           fileCollection.Add path & currentPath
        End If
        currentPath = Dir()
    Loop
   
    '浏览子目录
    For Each directory IndirCollection
        Debug.Print "---子目录: "& directory & "---"
        TraversePath path& directory & ""
    Next directory
End Sub
 
Sub RunOnAllFilesInSubFolders()
    Dim folderName As String
    Dim eApp As Excel.Application
    Dim fileName As Variant
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim currWs As Worksheet
    Dim currWb As Workbook
    Dim fDialog As Object
   
    Set fDialog =Application.FileDialog(msoFileDialogFolderPicker)
    Set currWb =ActiveWorkbook
    Set currWs = ActiveSheet
 
    '选择存储所有文件的文件夹
    fDialog.Title = "选择文件夹"
    fDialog.InitialFileName =currWb.path
    If fDialog.Show = -1 Then
      folderName =fDialog.SelectedItems(1)
    End If
   
    '创建一个单独的不可见的Excel处理进程
    Set eApp = NewExcel.Application
    eApp.Visible = False
   
    '搜索文件夹中的所有文件[使用你的格式例如*.xlsx来代替*.*]
    Set fileCollection = NewCollection
    TraversePath folderName& ""
 
    For Each fileName InfileCollection
        '更新状态栏来指示进度
        Application.StatusBar= "正在处理" & fileName
 
 
        Set wb =eApp.Workbooks.Open(fileName)
        '...
        '在这里放置你的代码.
        '...
        wb.CloseSaveChanges:=False '关闭打开的工作簿
        Debug.Print "已处理 "& fileName  '在立即窗口打印已处理
    Next fileName
    eApp.Quit
    Set eApp = Nothing
    '清除状态栏并通知宏已完成
    Application.StatusBar =""
    MsgBox "在所有工作簿中都完成了宏执行"
End Sub

在工作簿所有工作表中运行宏

代码如下:

代码语言:javascript复制
'本程序来自于analystcave.com
Sub RunOnAllWorksheets()
    Dim folderName As String
    Dim eApp AsExcel.Application
    Dim fileName As String
    Dim ws As Worksheet
    Dim currWs As Worksheet
    Dim currWb As Workbook
    Dim fDialog As Object
   
    Set fDialog =Application.FileDialog(msoFileDialogFolderPicker)
    Set currWb =ActiveWorkbook
    Set currWs = ActiveSheet
 
    '搜索文件夹中的所有文件[使用你的格式例如*.xlsx来代替*.*]
    For Each ws In Sheets
        If ws.Name <>currWs.Name Then
            '更新状态栏来指示进度
           Application.StatusBar = "正在处理 "& ws.Name
            '...
            '在这里放置你的代码
            '...
            Debug.Print"已处理" & ws.Name
        End If
    Next ws
    '清除状态栏并通知宏已完成
    Application.StatusBar =""
    MsgBox "在所有工作表中已完成宏执行"
End Sub

代码中:

1.打开ActiveWorkbook中的每个工作表而不是ActiveSheet,可以根据需要删除If语句。

2.使用要在每个打开的工作表上运行的任何代码替换“在这里放置你的代码”部分。

vba

0 人点赞