【问题标题】:Excel VBA - combine macro to rename worksheet & macro to merge worksheets in one macroExcel VBA - 组合宏以重命名工作表和宏以将工作表合并到一个宏中
【发布时间】:2018-09-10 15:32:05
【问题描述】:

我正在使用两个宏。 第一个将excel文件的工作表重命名为工作簿名称的宏。第二个宏将这些重命名的工作簿(仅包含一个工作表)合并到一个工作簿中。每个重命名的工作簿都是由第二个宏创建的新工作簿中的一个单独选项卡。

其中一个文件的名称示例:AA_aaa##123456789-123456789。 在重命名宏中,我从名称中删除了最后一个字符,因此工作表被命名为 AA_aaa。所有文件都有不同的名称,但都具有相同的格式和长度。

对于第一个宏,我打开每个 excel 文件,运行宏并关闭并再次保存 excel 文件。对于第二个宏,我打开一个仅包含合并宏的 exmpy excel 文件。我从此文件运行合并宏,它要求我选择要合并的文件。我要合并的文件当时需要关闭。

我采取的步骤顺序是:
1. 我打开要重命名工作表的 excel 文件。
2. 我运行重命名宏(我打开了另一个 Excel,其中包含要重命名的宏,因此我可以从那里选择它)。
3. 我用重命名的工作表保存并关闭工作簿。
4. 我对所有其他 excel 文件都这样做(我通常有大约 10 个文件要一次重命名)。
5. 我打开一个包含合并宏的 Excel 文件(excel 文件中没有数据)。
6. 我运行合并宏。
7. 宏要求我选择要合并的文件(这些是我在前面的步骤中重命名的 10 个文件)。
8. 我选择在第一步中重命名的文件。

结果:我现在有一个包含多个工作表的文件,这些工作表包含我重命名的文件中的数据,每个工作表的名称都是原始文件的名称!

我需要每天执行大约 20 次此过程。尤其是第 1 步(重命名工作表)需要花费大量时间,因为我需要分别打开和保存每个文件。我希望有人可以帮助我将这两个宏合二为一。目的是运行 1 个宏,首先重命名工作表,然后将它们合并到一个文件中。

这些是我目前使用的宏:

使用宏 1 重命名工作表:

Sub RenameSheet()
Dim myname
myname = Replace(ActiveWorkbook. Name, ".xls", "")
    ActiveSheet.Select
    Activesheet.Name = Left$(Activeworkbook.Name, InStrRev(Activeworkbook.Name,".")-22)
    Range("A1").Select
End Sub

宏 2 合并工作簿:

Sub MergeExcelFiles()
    Dim fnameList, fnameCurFile As Variant
    Dim countFiles, countSheets As Integer
    Dim wksCurSheet As Worksheet
    Dim wbkCurBook, wbkSrcBook As Workbook

    fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)

    If (vbBoolean <> VarType(fnameList)) Then

        If (UBound(fnameList) > 0) Then
            countFiles = 0
            countSheets = 0

            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual

            Set wbkCurBook = ActiveWorkbook

            For Each fnameCurFile In fnameList
                countFiles = countFiles + 1

                Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)

                For Each wksCurSheet In wbkSrcBook.Sheets
                    countSheets = countSheets + 1
                    wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
                Next

                wbkSrcBook.Close SaveChanges:=False

            Next

            Application.ScreenUpdating = True
            Application.Calculation = xlCalculationAutomatic

            MsgBox "Processed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
        End If

    Else
        MsgBox "No files selected", Title:="Merge Excel files"
    End If
End Sub

【问题讨论】:

  • 你是什么意思“在执行它们时节省时间”?结合这两个宏实际上根本不会出现性能问题。您的意思是节省您不必进入宏菜单并选择在两者上运行的时间吗?
  • 目前我每天会收到大约 100 个 excel 文件。对于所有这些文件,我首先将工作表重命名为工作簿的名称。然后我使用合并 excel 文件宏将它们合并在一起。第二步非常快,但第一步我打开每个文件,运行宏,然后关闭它并转到下一步。这需要花费大量时间。我希望我可以在执行第二个宏时以某种方式进行重命名。

标签: vba excel


【解决方案1】:

您可以将它们分开,然后从一个中调用它们,而不是合并宏:

Sub RunMyMacros()

RenameSheet
MergeExcelFiles

End Sub

在您的情况下,我认为这将是最干净的解决方案。合并它们不会提高性能。

如果您真的需要将它们组合在一起,我想它应该是这样的 - 请注意,我在一些基本上没用的行上做了几个 cmets:

Sub MergeExcelFiles()
    Dim fnameList, fnameCurFile As Variant
    Dim countFiles, countSheets As Integer
    Dim wksCurSheet As Worksheet
    Dim wbkCurBook, wbkSrcBook As Workbook
    Dim myname

    'Rename sheet
    myname = Replace(ActiveWorkbook.Name, ".xls", "")
    'ActiveSheet.Select     'this serves no purpose
    ActiveSheet.Name = Left$(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 22)
    Range("A1").Select 'I don't think this does anything for you either

    'Merge excel files
    fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)

    If (vbBoolean <> VarType(fnameList)) Then

        If (UBound(fnameList) > 0) Then
            countFiles = 0
            countSheets = 0

            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual

            Set wbkCurBook = ActiveWorkbook

            For Each fnameCurFile In fnameList
                countFiles = countFiles + 1

                Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)

                For Each wksCurSheet In wbkSrcBook.Sheets
                    countSheets = countSheets + 1
                    wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
                Next

                wbkSrcBook.Close SaveChanges:=False

            Next

            Application.ScreenUpdating = True
            Application.Calculation = xlCalculationAutomatic

            MsgBox "Processed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
        End If

    Else
        MsgBox "No files selected", Title:="Merge Excel files"
    End If
End Sub

【讨论】:

  • 谢谢。我已经尝试过了,但我收到运行时错误“5”。
  • 我假设我收到了该错误,因为对于重命名宏,我需要打开工作簿,而对于第二个宏,我需要在不打开要合并的文件的情况下运行它。要运行第二个宏,我打开一个新的 excel 文件并从那里运行它。在运行宏时,我选择需要合并的文件。
  • 当您使用 ActiveWorkbook 时,很难判断您正在从哪个工作簿工作 - 您以什么顺序运行这些宏?
  • 顺序是: 1. 我打开要重命名工作表的excel文件。 2. 我运行重命名宏。 3. 我保存并关闭文件。 4. 我对所有其他文件做同样的事情。 5. 我打开一个包含合并宏的 Excel 文件(文件本身为空)。 6. 我运行合并宏 7. 宏要求我选择要合并的文件 8. 我选择在第一步中重命名的文件。结果:我现在有一个包含多个工作表的文件,这些工作表包含我重命名的文件中的数据,每个工作表的名称都是原始文件的名称!我希望它现在有意义......
  • “我对所有其他文件都这样做” 还有哪些其他文件?还有多少人?当前的名称是什么,他们总是这样命名吗?重命名宏是位于每个工作簿中,还是从您的PERSONAL.xlsb 或其他工作簿运行?这里有很多问题需要回答 - 我建议您可以使用这些详细信息编辑您的问题,或者完全重新发布它并像您在这里一样解释这些步骤。
【解决方案2】:

经过反复试验,我设法将这两个宏结合起来。我在这里发现了一个类似的问题,并使用了其中一个答案并将其更改为我的需要。

我将此添加到 MergeExcelFiles 宏中:

wbkCurBook.Sheets(wbkCurBook.Sheets.Count).Name = Left$(wbkSrcBook.Name, InStrRev(wbkSrcBook.Name, ".") - 22)

现在在执行宏以合并文件时重命名文件:

Sub MergeAndRenameExcelFiles()
Dim fnameList, fnameCurFile As Variant
Dim countFiles, countSheets As Integer
Dim wksCurSheet As Worksheet
Dim wbkCurBook, wbkSrcBook As Workbook

fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)

If (vbBoolean <> VarType(fnameList)) Then

    If (UBound(fnameList) > 0) Then
        countFiles = 0
        countSheets = 0

        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual

        Set wbkCurBook = ActiveWorkbook

        For Each fnameCurFile In fnameList
            countFiles = countFiles + 1

            Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)

            For Each wksCurSheet In wbkSrcBook.Sheets
                countSheets = countSheets + 1
                wksCurSheet.Copy After:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
                wbkCurBook.Sheets(wbkCurBook.Sheets.Count).Name = Left$(wbkSrcBook.Name, InStrRev(wbkSrcBook.Name, ".") - 22)
            Next

            wbkSrcBook.Close SaveChanges:=False

        Next

        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic

        MsgBox "Procesed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
    End If

Else
    MsgBox "No files selected", Title:="Merge Excel files"
End If

结束子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多