【问题标题】:How to run macro specific to multiple files in a folder?如何运行特定于文件夹中多个文件的宏?
【发布时间】:2013-10-15 12:45:32
【问题描述】:

我已经将几段代码散列在一起,以根据日期从文件夹中的所有工作表中提取一行数据(这部分是通过消息框手动输入的),然后在每个工作簿中插入一个名为 summary 的新选项卡,然后粘贴行数据。我可以部分做到这一点,但它只有在我将宏插入每个工作簿时才有效,但我需要代码是通用的并循环浏览文件夹中所有关闭的工作簿。我把我写得很糟糕的代码放在下面,它有很多重复,但不知道如何清理它而不弄乱它,并且不能使它适用于封闭的工作簿,任何帮助将不胜感激。谢谢。

这是代码:

Sub SheetnamesCopyRowToSummaryTab() 'Includes All Worksheets LATEST
Set WSNew = Worksheets.Add
WSNew.Name = "Site Name"
WSNew.Move Before:=Sheets(1)
Columns(1).Insert
For i = 1 To Sheets.Count
    Cells(i, 1) = Sheets(i).Name
Next i
     ActiveSheet.Name = "Summary"
     'WSNew.Range("B1:J1").Value = Array("Month", "Period", "Actual Consumption",     "Invoice Consumption", "Consumption Variance", "Simulated Cost", "Invoice Cost", "Cost Variance", "Cumulative Cost Variance")

Dim NumSheets As Long
NumSheets = Sheets.Count
On Error Resume Next
Application.DisplayAlerts = False
Sheets("Summary").Delete
Application.DisplayAlerts = True
On Error GoTo 0

Set WSNew = Worksheets.Add
WSNew.Name = "Summary"
WSNew.Move Before:=Sheets(1)
Dim strSeek As String
Application.ScreenUpdating = False
For i = 1 To NumSheets
Range("A" & i) = Sheets(i).Name
Next i

Application.ScreenUpdating = False
strSeek = InputBox(Prompt:="Enter the invoice period that you wish to search for.", _
    Title:="Select Invoice Period", Default:="MARCH 2013")
    For Each WS1 In ThisWorkbook.Sheets
    With WS1
        .UsedRange.AutoFilter Field:=1, Criteria1:=strSeek

        On Error Resume Next
        .AutoFilter.Range.Offset(1, 0).Resize(.Cells(.Rows.Count, "A").End(xlUp).Row, .Columns.Count) _
            .SpecialCells(xlCellTypeVisible).Copy Destination:=WSNew.Range("A" & WSNew.Cells(WSNew.Rows.Count, "B").End(xlUp).Row).Offset(1) 'Added .offset (1) this then took row from each ws but left blank rows on summary where there was no data on ws for the month
        On Error GoTo 0

        .AutoFilterMode = False
        'headers were placed here
    End With
Next WS1

Columns(1).Insert
For i = 1 To Sheets.Count
    Cells(i, 1) = Sheets(i).Name
Next i
ActiveSheet.Name = "Summary"
WSNew.Range("A1:J1").Value = Array("Site Name", "Month", "Period", "Actual Consumption", "Invoice Consumption", "Consumption Variance", "Simulated Cost", "Invoice Cost", "Cost Variance", "Cumulative Cost Variance")
Columns.AutoFit
Cells.Font.Size = 8
Range("B2:J12").Font.Bold = False
Range("A1:J1").Font.Bold = True
Range("A1:J1").Interior.Color = RGB(191, 191, 191)
Range("A1").RowHeight = 20
Range("A1:J1").HorizontalAlignment = xlCenter
Range("A1:J1").VerticalAlignment = xlCenter

结束子

【问题讨论】:

    标签: vba


    【解决方案1】:

    如果您的代码有效,那就没问题。我认为有一些清理它的潜力,但是如果不知道必须做什么就很难。

    您的宏始终在 ActiveWorkbook 和 ActiveSheet 上运行。所以它可以工作,如果你只是打开文件夹中的每个 Excel 文件,调用你的宏并关闭(刚刚打开的)工作簿。

    类似这样的:(只是写下来,没有考虑性能什么的)

    Public Sub LoopingThroughExcelFiles()
    Dim fso As Object, wb As Workbook
    Dim o As Object, pathToFolder As String
    pathToFolder = "N:\" ' <-- has to be changed
    Set fso = CreateObject("Scripting.FileSystemObject")
        For Each o In fso.GetFolder(pathToFolder).Files
            If InStr(o.Type, "Excel") Then
                Set wb = Workbooks.Open(o.Path)
                SheetnamesCopyRowToSummaryTab
                wb.Close
            End If
        Next
    Set fso = Nothing
    End Sub
    

    你可以试试。也许它有效,但无论如何您都可以看到如何获取给定文件夹中每个 excel 文件的路径。

    【讨论】:

    • 感谢您的快速回复,我尝试了您的代码,它打开了第一个文件并运行了这么远,但与以下内容一致: .UsedRange in: For Each WS1 In ThisWorkbook.Sheets With WS1 。 UsedRange.AutoFilter Field:=1, Criteria1:=strSeek - 不知道这是为什么?谢谢
    • 好的,所以我们必须稍微改变一下你的宏。只是测试一下:如果设置strSeek="MARCH 2013"并把输入框注释掉,会不会报错? (错误信息是什么?)
    • 它仍然停在 .UsedRange 并显示错误消息“运行时错误 1004。对象'工作簿'的方法'打开'失败”。它确实打开了第一个工作簿,插入摘要选项卡并将选项卡名称复制到 A 列中,然后在尝试复制数据行时停止,无论如何我可以将示例文件附加到这篇文章吗?谢谢
    • 好的。我刚刚看到另一件事,这可能会导致错误。因此,请将代码中的每个“ThisWorkbook”替换为“ActiveWorkbook”。 (说明:ThisWorkbook是带宏的Workbook,ActiveWorkbook是你能看到的workbook)
    • 哇,解决了这个问题真是太好了!非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多