【问题标题】:Merge if output workbook name already exists如果输出工作簿名称已存在则合并
【发布时间】:2018-10-03 07:59:49
【问题描述】:

我在一个文件夹下有大约 100 个.xls 文件,并且我有一个宏脚本来循环遍历每个文件以进行一些数据处理。目标是将每个工作簿分成三个名称分别为N1N2N3。到目前为止,我的 SplitData 宏运行良好,但提取的工作簿存在问题。

我想将新提取的三个工作簿合并到已经存在的工作簿,而不是收到诸如“文件 N1 已存在”之类的警报。每次。我想知道是否有办法在 VBA 脚本中实现这一点?还是有其他解决方案?

谢谢!

这是我循环文件夹的代码:

Sub OpenFiles()
    Dim xStrPath As String
    Dim xFileDialog As FileDialog
    Dim xFile As String
    On Error Resume Next
    Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    xFileDialog.AllowMultiSelect = False
    xFileDialog.Title = "Select a folder"
    If xFileDialog.Show = -1 Then
        xStrPath = xFileDialog.SelectedItems(1)
    End If
    If xStrPath = "" Then Exit Sub
    xFile = Dir(xStrPath & "\*.xls")

    Do While xFile <> ""
        Call SplitData
    Loop
End Sub

这是 SplitData 宏:

Sub SplitData()
 ' 1. Fill every cells in merged columns for future steps
            Dim cell As Range, joinedCells As Range

            For Each cell In Range("E4:I60")
                If cell.MergeCells Then
                    Set joinedCells = cell.MergeArea
                    cell.MergeCells = False
                    joinedCells.Value = cell.Value
                End If
            Next


            ' 2. Split original sheet into three based on one col value 
            ' loop through selected column to check if has different values
            Const NameCol = "B"
            Const HeaderRow = 3
            Const FirstRow = 4
            Dim SrcSheet As Worksheet
            Dim TrgSheet As Worksheet
            Dim SrcRow As Long
            Dim LastRow As Long
            Dim TrgRow As Long
            Dim Student As String
            Application.ScreenUpdating = False
            Set SrcSheet = ActiveSheet
            LastRow = SrcSheet.Cells(SrcSheet.Rows.Count, NameCol).End(xlUp).Row
            For SrcRow = FirstRow To LastRow
                Student = SrcSheet.Cells(SrcRow, NameCol).Value
                Set TrgSheet = Nothing
                On Error Resume Next
                Set TrgSheet = Worksheets(Student)
                On Error GoTo 0
                If TrgSheet Is Nothing Then
                    Set TrgSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
                    TrgSheet.Name = Student
                    SrcSheet.Rows(HeaderRow).Copy Destination:=TrgSheet.Rows(HeaderRow)
                End If
            TrgRow = TrgSheet.Cells(TrgSheet.Rows.Count, NameCol).End(xlUp).Row + 1
            SrcSheet.Rows(SrcRow).Copy Destination:=TrgSheet.Rows(TrgRow)
            Next SrcRow
            Application.ScreenUpdating = True


            ' 3. Extract three new worksheets into three workbooks 
            Dim Pointer As Long

            Set MainWorkBook = ActiveWorkbook
            Range("E4").Value = MainWorkBook.Sheets.Count

            Application.ScreenUpdating = False   'enhance the performance
            For Pointer = 2 To MainWorkBook.Sheets.Count
                Set NewWorkbook = Workbooks.Add
                MainWorkBook.Sheets(Pointer).Copy After:=NewWorkbook.Sheets(1)
                Application.DisplayAlerts = False
                NewWorkbook.Sheets(1).Delete
                Application.DisplayAlerts = True
                With NewWorkbook
                    .SaveAs Filename:="D:\***\Inventory\" & MainWorkBook.Sheets(Pointer).Name & ".xls"
                End With
                NewWorkbook.Close SaveChanges:=True
            Next Pointer

            Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 您没有提供有关如何预测预期目标工作簿名称的指示。您没有在循环中打开工作簿或将文件名传递给 SplitData。也许一旦您实际打开了一个文件,您就可以确定目标工作簿文件名,如果它们存在则运行 MergeData,如果不存在则运行 SplitData。
  • @Danni .... SplitData 宏在哪里?你也可以从那个宏中添加代码吗?
  • @Jeeped 感谢您的回复。也许我没有说清楚,输出的三个工作簿的名称已经确定,不能更改。整个过程其实就是把原来的workbook按照一列拆分出来,里面有3个不同的值N1 N2 N3,然后分别把提取出来的三个workbook合并成三个大的。
  • @MohitBansal 请参考更新后的问题:)
  • On Error Resume Next 可能正在掩盖错误。

标签: vba excel data-processing


【解决方案1】:

假设您已经在脚本中的路径中设置了所需的文件名,请更改

Application.DisplayAlerts = True

Application.DisplayAlerts = false 

以避免收到覆盖警告。

保存后将其更改回 true 以防止其他地方出现问题。

希望对你有帮助

【讨论】:

  • 使用这个要求你使用良好的错误处理。如果您关闭警报,然后您的代码在警报重新打开之前的某个时间点失败,则 Excel 会处于非常糟糕的状态。阅读 Chip Pearson 的精彩文章 - cpearson.com/excel/errorhandling.htm
  • @oxwilder 感谢您的回复。但是还有一个问题,在禁用警报后,我提取的前两个工作簿不断更新我开始提取的第一个工作簿的相同结果,而第三个工作簿陷入循环,从起始工作簿添加相同的结果。我认为我的循环有问题但找不到,请您帮我检查一下吗?
  • @Danni 我很乐意在这里为许多其他人提供帮助,但您可能希望将此特定问题标记为已回答并发布一个新问题,说明您的下一个要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多