VBA 复制工作表至新的工作簿中的工作表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA 复制工作表至新的工作簿中的工作表相关的知识,希望对你有一定的参考价值。

工作簿A含有四个sheet:a,b,c,d,现需复制其中a,b的指定区域,新建工作簿并保存至A所在路径,名称为1-A,1-A中sheet名称为1-a,1-b,(A中a指定区域复制至1-A中1-a,A中b指定区域复制至1-A中1-b),用VBA怎么实现呢?

谢谢大家!

VBA使用工作表的Copy方法复制,用After或者Before指定复制到的位置,否则复制到新工作簿。

例如:

WorkBooks("文件一.xlsx").Sheets("表一").Copy After:=WorkBooks("文件二.xlsx").Sheets("表2")

扩展资料:

VBA的常用内置函数:

MsgBox

InputBox

舍入函数:Fix 向0取整,Int向下取整, Round四舍五入

Rnd: 返回0-1内的单精度随机数

Filter:对字符串的一维数组的过滤

InStr([Start, ]<Str1>,<Str2>[, Compare])与InStrRev: 查找子串

Len:字符串长度

Join:连接一维数组中的所有子字符串

Left,Right,Mid: 截取子字符串

Space(数值) :生成空格字符串

Ucase,Lcase:大小写转换函数

Ltrim, Rtrim,Trim :删除首尾空格

参考资料来源:百度百科-VBA (Visual Basic宏语言)

参考技术A

      Sub 新建工作簿()

      Application.ScreenUpdating = False

      Dim gzb As Workbook

      Set gzb = Workbooks.Add

      ActiveSheet.Name = "1-a"

      Workbooks("A.xls").Sheets("a").Cells.Copy [a1]

      Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = "1-b"

      Workbooks("A.xls").Sheets("b").Cells.Copy [a1]

      gzb.SaveAs ThisWorkbook.Path & "\\1-A.xls", FileFormat:=xlExcel8

      Set gzb = Nothing

      ActiveWorkbook.Close

      Application.ScreenUpdating = True

      End Sub


这个vba代码写在A工作簿的模块里即可,指定区域你可以自己修改下代码,我这里是全表复制的效果。

追问

我的代码:小白不懂,能修改下吗?

另一个问题,Application.ScreenUpdating = False/ture  这两句的作用大吗?应该可以不加的吧?

追答

Application.ScreenUpdating 最好加一下,后台执行的效率会比较高一些。

本回答被提问者采纳
参考技术B 将ab两个工作表,移动复制成新的工作簿,修改工作表名称,删除不想要的数据,
再保存。
用这个思路录制个宏就明白了。追问

不不,不要这样,删除数量巨大,就是选择,复制,选择,复制

追答

哦,选择区域的条件是什么?

跨多个工作表的 VBA 宏

【中文标题】跨多个工作表的 VBA 宏【英文标题】:VBA Macro across multiple worksheets 【发布时间】:2012-10-24 17:55:26 【问题描述】:

我正在尝试运行一个在多个工作表上执行功能的宏。假设我在工作表 4 上分配了宏按钮。我已经列出了我希望它逐步执行的功能:

1) 选择工作表 4 中的某些单元格并复制到工作表 4 中的相邻单元格。 2) 删除工作表 3 中的单元格范围。 3) 剪切工作表 2 中的单元格范围,然后将此单元格范围粘贴到工作表 3。 4)从单独的工作簿中获取单元格范围并复制到工作表 2 中。(我知道这是一个完全不同的问题,因为工作簿是自动发布的,我必须找到一种方法来链接两者。) 5) 更新位于工作表 4 和工作表 3 中的数据透视表。

我很想获得有关此功能的前 3 个功能的帮助。我在下面粘贴了我当前的代码。

Sub START()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim sh4 As Worksheet

Set sh1 = ActiveWorkbook.Sheets("Brand")
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek")
Set sh3 = ActiveWorkbook.Sheets("PriorWeek")
Set sh4 = ActiveWorkbook.Sheets("Pivot")

sh4.Range("B29:B30").Select
Selection.Copy

sh4.Range("C29").Select
ActiveSheet.Paste

sh3.Range("A4:AC1000").Select
Selection.Delete

sh2.Range("A4:AC1000").Select
Selection.Copy

sh3.Range("A4").Select
ActiveSheet.Paste

End Sub

它有效...但只有当我在正确的工作表中执行特定功能时它才有效。

【问题讨论】:

而不是像sh1sh2 等不可读的变量名称。为什么不称它们为有用和透明的东西,如shtBrandshtCurrentWeek 等。工作中的一个人也是这样做的sh1 sh2 业务,当我们尝试阅读他的代码时,它会让每个人都抓狂。 @Jean-FrançoisCorbett 是的,这实际上是个好主意。起初我没有这样做的原因是因为在我的业务中,没有人知道如何编码。我试图自动化的这项任务已经手动完成了大约 2-3 年。这很荒谬,但这是个好主意!谢谢。 【参考方案1】:

通过删除selectselectionactivesheet,您将能够使此工作表独立

Sub START()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim sh4 As Worksheet

Set sh1 = ActiveWorkbook.Sheets("Brand")
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek")
Set sh3 = ActiveWorkbook.Sheets("PriorWeek")
Set sh4 = ActiveWorkbook.Sheets("Pivot")

sh4.Range("B29:B30").Copy sh4.Range("C29")

sh3.Range("A4:AC1000").Delete

sh2.Range("A4:AC1000").Copy sh3.Range("A4")

End Sub

【讨论】:

【参考方案2】:

你有了一个很好的开始。只需稍加改进,您就会拥有它。

基本上,至少在这种情况下,不需要.Select 您的范围(工作表、工作簿等)。您可以直接使用它们并使用Copy 提供它们将被复制到的目标。

见下面的代码:

Sub START()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim sh4 As Worksheet
Dim wkb As Workbook

Set wkb = Workbooks("wkbName") '-> best to call workbooks by name, as opposed to "ActiveWorkbook", also best to set it to object

With wkb '-> now we can work with this object directly and succinctly

    Set sh1 = .Sheets("Brand")
    Set sh2 = .Sheets("CurrentWeek")
    Set sh3 = .Sheets("PriorWeek")
    Set sh4 = .Sheets("Pivot")

    sh4.Range("B29:B30").Copy sh4.Range("C29")

    'sh3.Range("A4:AC1000").Delete -> you don't need this if you are overwritting it

    sh2.Range("A4:AC1000").Copy sh3.Range("A4")

End With

End Sub

【讨论】:

为什么要杀死变量? @Mattboy -> 最好将它们从内存中删除。对于这么小的代码,没什么大不了的,但是当您有大型代码项目时,它会有所帮助。 无论如何,当你退出潜艇时它们会被杀死,但正如斯科特所说,当你真正需要它时,养成这个习惯并不是一个坏习惯。 是的@nutsch,那是我的想法。向人们展示良好的习惯,而不是忽视它:) @ScottHoltzman:在每个过程结束时将所有对象设置为Nothing 将使您的代码充满大部分无用的样板垃圾。您只需要对 Class_Terminate 事件处理程序与全局变量和对象交互的方式不好的对象执行此操作——它们本身就是你不应该使用的坏东西(一个值得注意的例外是 VBA 奇怪的原生 Err 对象没有办法)。对于WorkbookWorksheet 对象,这是无关紧要的,因此不要浪费你的呼吸在什么都没有。【参考方案3】:

sheets("name1").range("B29:B30").copy Destination:=sheets("name2").range("C29")

假设工作表名称为 name1 和 name2,将从一个工作表复制到另一个工作表

【讨论】:

【参考方案4】:
Sub START()

Sheet("Pivot").Range("B29:B30").Copy Sheet("Pivot").Range("C29")
Sheet("CurrentWeek").Range("A4:AC1000").Copy Sheet("PriorWeek").Range("A4")

End Sub

【讨论】:

-1 发布本质上是已接受答案的片段有什么意义?

以上是关于VBA 复制工作表至新的工作簿中的工作表的主要内容,如果未能解决你的问题,请参考以下文章

VBA:如果工作簿中的工作表名称等于从用户窗体中选择的组合框值,则复制该工作表并将其粘贴到另一个工作簿中

将一个工作簿中的工作表中的VBA代码复制到另一个工作簿?

如何用VBA把一个工作簿中的工作表内容复制到另一个汇总工作簿里面的指定的工作表里面去?

从打开的工作簿中的单个工作表盲创建新的 Excel 工作簿

如何将工作簿中的某些工作表导入文件夹中的其他工作簿? (VBA)

Excel 2010 vba 复制选择工作表,保存并关闭两个工作簿