【发布时间】:2018-10-03 07:59:49
【问题描述】:
我在一个文件夹下有大约 100 个.xls 文件,并且我有一个宏脚本来循环遍历每个文件以进行一些数据处理。目标是将每个工作簿分成三个名称分别为N1、N2、N3。到目前为止,我的 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