VBA 复制到新工作簿并保存
VBA to copy into a new workbook and save
希望对你有所帮助。我有下面的代码。本质上它所做的是,它打开一个对话框,允许用户 select 和 excel sheet,然后它转到国家列 (11) 过滤它,然后复制和将该国家/地区粘贴到新作品中sheet 以该国家/地区的名字命名新作品sheet,然后对下一个国家/地区重复该操作。
我现在想让它做的不是创建一个新的 sheet 并命名它。我想让它为每个国家/地区创建一个新工作簿,复制并粘贴信息,然后将新工作簿保存并命名到一个文件夹中。
我的代码如下。
我们一如既往地非常感谢您的帮助。
Sub Open_Workbook_Dialog()
Dim my_FileName As Variant
MsgBox "Pick your TOV file" '<--| txt box for prompt to pick a file
my_FileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*") '<--| Opens the file window to allow selection
If my_FileName <> False Then
Workbooks.Open Filename:=my_FileName
Call Filter '<--|Calls the Filter Code and executes
End If
End Sub
Public Sub Filter()
Dim rCountry As Range, helpCol As Range
With Worksheets("CountryList") '<--| refer to data worksheet
With .UsedRange
Set helpCol = .Resize(1, 1).Offset(, .Columns.Count) '<--| get a "helper" column just at the right of used range, it'll be used to store unique country names in
End With
With .Range("A1:Y" & .Cells(.Rows.Count, 1).End(xlUp).Row) '<--| refer to its columns "A:Q" from row 1 to last non empty row of column "A"
.Columns(11).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=helpCol, Unique:=True '<-- call AdvancedFilter on 6th column of the referenced range and store its unique values in "helper" column
Set helpCol = Range(helpCol.Offset(1), helpCol.End(xlDown)) '<--| set range with unique names in (skip header row)
For Each rCountry In helpCol '<--| iterate over unique country names range (skip header row)
.AutoFilter 11, rCountry.Value2 '<--| filter data on country field (6th column) with current unique country name
If Application.WorksheetFunction.Subtotal(103, .Cells.Resize(, 1)) > 1 Then '<--| if any cell other than header ones has been filtered...
Worksheets.Add Worksheets(Worksheets.Count) '<--... add new sheet
ActiveSheet.Name = rCountry.Value2 '<--... rename it
.SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("A1") 'copy data for country under header
End If
Next
End With
.AutoFilterMode = False '<--| remove autofilter and show all rows back
End With
helpCol.Offset(-1).End(xlDown).Clear '<--| clear helper column (header included)
End Sub
这还不完整,但我认为您想要类似的东西,添加一个 wokbook 变量:
'Add this above the loop
Dim wb As Workbook
'Replace where you create a new sheet with something similar to this
Set wb = Application.Workbooks.Add
wb.SaveAs Filename:=rCountry.Value2
.SpecialCells(xlCellTypeVisible).Copy wb.Sheets(1).Range("A1")
希望对您有所帮助
希望对你有所帮助。我有下面的代码。本质上它所做的是,它打开一个对话框,允许用户 select 和 excel sheet,然后它转到国家列 (11) 过滤它,然后复制和将该国家/地区粘贴到新作品中sheet 以该国家/地区的名字命名新作品sheet,然后对下一个国家/地区重复该操作。
我现在想让它做的不是创建一个新的 sheet 并命名它。我想让它为每个国家/地区创建一个新工作簿,复制并粘贴信息,然后将新工作簿保存并命名到一个文件夹中。
我的代码如下。
我们一如既往地非常感谢您的帮助。
Sub Open_Workbook_Dialog()
Dim my_FileName As Variant
MsgBox "Pick your TOV file" '<--| txt box for prompt to pick a file
my_FileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*") '<--| Opens the file window to allow selection
If my_FileName <> False Then
Workbooks.Open Filename:=my_FileName
Call Filter '<--|Calls the Filter Code and executes
End If
End Sub
Public Sub Filter()
Dim rCountry As Range, helpCol As Range
With Worksheets("CountryList") '<--| refer to data worksheet
With .UsedRange
Set helpCol = .Resize(1, 1).Offset(, .Columns.Count) '<--| get a "helper" column just at the right of used range, it'll be used to store unique country names in
End With
With .Range("A1:Y" & .Cells(.Rows.Count, 1).End(xlUp).Row) '<--| refer to its columns "A:Q" from row 1 to last non empty row of column "A"
.Columns(11).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=helpCol, Unique:=True '<-- call AdvancedFilter on 6th column of the referenced range and store its unique values in "helper" column
Set helpCol = Range(helpCol.Offset(1), helpCol.End(xlDown)) '<--| set range with unique names in (skip header row)
For Each rCountry In helpCol '<--| iterate over unique country names range (skip header row)
.AutoFilter 11, rCountry.Value2 '<--| filter data on country field (6th column) with current unique country name
If Application.WorksheetFunction.Subtotal(103, .Cells.Resize(, 1)) > 1 Then '<--| if any cell other than header ones has been filtered...
Worksheets.Add Worksheets(Worksheets.Count) '<--... add new sheet
ActiveSheet.Name = rCountry.Value2 '<--... rename it
.SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("A1") 'copy data for country under header
End If
Next
End With
.AutoFilterMode = False '<--| remove autofilter and show all rows back
End With
helpCol.Offset(-1).End(xlDown).Clear '<--| clear helper column (header included)
End Sub
这还不完整,但我认为您想要类似的东西,添加一个 wokbook 变量:
'Add this above the loop
Dim wb As Workbook
'Replace where you create a new sheet with something similar to this
Set wb = Application.Workbooks.Add
wb.SaveAs Filename:=rCountry.Value2
.SpecialCells(xlCellTypeVisible).Copy wb.Sheets(1).Range("A1")
希望对您有所帮助