VBA - 如何将Excel中的行从一个工作簿复制到另一个工作簿?

时间:2012-04-19 14:15:27

标签: vba excel-vba excel-2010 excel

尽管有许多帖子我看起来和我的问题一样,但没有一个答案符合我的要求。如果你能把我联系到一个我很乐意读它。

我有一个包含工作表的工作簿。为简单起见,假设我的工作簿有一个工作表。在我的名为“Sheet1”的工作表中,单元格A1到A4中有数据。

我想要的VBA代码是:

  1. 将工作簿'A'的第1行(或特定单元格A1到A4)复制到范围变量'myRange'
  2. 创建一个新工作簿,让我们称之为工作簿'B'
  3. 将工作簿'B的默认“sheet1”命名为“Test Name”
  4. 打开工作簿'B'(虽然我意识到VBA代码“Workbooks.Add”会打开一本新书,所以这一步可能是多余的,因为Workbooks.Add涵盖了第2点和第3点的一半)
  5. 将'myRange'粘贴到'Workbook B'的第一行
  6. 将名为“Test Book”的“工作簿B”保存,并用方括号括起来的时间戳。该文件的文件扩展名也必须为“xls”
  7. 关闭'工作簿B'并返回'工作簿A'
  8. 到目前为止我所拥有的是:

    Sub OpenAndSaveNewBook()
        'Declarations
        Dim MyBook As String
        Dim MyRange As Range
        Dim newBook As Workbook
    
        'Get name of current wb
        MyBook = ThisWorkbook.Name
        Set MyRange = MyBook.Sheets("Sheet1").Range("A1,F1")
    
        'Create/Open new wb
        newBook = Workbooks.Add
    
        'Save new wb with XLS extension
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "/" & "TEST-BOOK", _
                                FileFormat:=xlNormal, CreateBackup:=False
    
        '===NOTE: BEFORE THE FOLLOWING RUNS I NEED TO PERFORM ACTIONS ON CELLS VIA VBA ON
        '===WORKBOOK 'A'. DOES THE NEWLY CREATE WORKBOOK BECOME THE PRIMARY/ACTIVE WORKBOOK
        '===? AND SO THEN DO I NEED TO ACTIVATE WORKBOOK 'A'? 
        ActiveWorkbook.Close savechanges:=True
    
        'Return focus to workbook 'a'
        MyBook.Activate
    End Sub
    

    正如您所看到的,我缺少将要处理的代码:

    • 将复制的数据粘贴到新工作簿
    • 将新工作簿的sheet1名称更改为其他内容
    • 在保存
    • 上的文件名字符串中添加时间戳

    最后,我在我的代码中包含了一个问题,因为我认为我可能对ActiveWorkbook方法有误解。当代码“Workbooks.Add”运行时,AFAIK成为活动工作簿,即具有焦点的工作簿。这会影响在工作簿“A”上运行的VBA代码吗?这是否意味着如果我想添加代码来操作工作簿“A”的单元格,那么我需要使用“MyBook.Activate”,其中“MyBook”包含工作簿'A的实际标题的字符串?

    非常感谢任何帮助。

    谢谢, QF

4 个答案:

答案 0 :(得分:10)

您可以直接执行此操作,而不是按照上面提到的方式复制粘贴。这也将否定变量的使用。

MyBook.Sheets("Sheet1").Rows("1:4").copy _
newBook.Sheets("Sheet1").Rows("1")

修改

我刚注意到您的代码出错了。

newBook = Workbooks.Add

这一行会给您一个错误,因为您必须使用Set

您的代码可以写成

Option Explicit

Sub OpenAndSaveNewBook()
    Dim MyBook As Workbook, newBook As Workbook
    Dim FileNm As String

    Set MyBook = ThisWorkbook

    FileNm = ThisWorkbook.Path & "\" & "TEST-BOOK.xls"
    Set newBook = Workbooks.Add

    With newBook
        MyBook.Sheets("Sheet1").Rows("1:4").Copy .Sheets("Sheet1").Rows("1")

        'Save new wb with XLS extension
        .SaveAs Filename:=FileNm, FileFormat:=xlNormal, CreateBackup:=False

        .Close Savechanges:=False
    End With
End Sub

更多编辑

阐述SET

的使用

我建议你看看这篇文章。

LINK:Worksheets does not work

答案 1 :(得分:4)

尽可能避免引用ActiveWorkbook以支持显式引用。

正如您所发现的那样,知道当前活动的内容可能会令人困惑,您无需激活工作簿来操作它。

所以你应该使用

newBook.SaveAs... 
newBook.Close...

录制的宏倾向于激活工作簿以便对它们进行处理,但这是因为记录它们的人的工作方式就是这样!所有激活确实都是改变焦点。

这同样适用于选择然后操纵当前选择;在VBA中没有必要,并且往往比直接操作慢。

答案 2 :(得分:3)

关于Excel的令人敬畏的事情是“记录宏”功能。我开始录制宏并按照您概述的步骤进行操作,然后对Excel提供的代码作为录制的宏进行了一些小修改:

Range("A1:F1").Select
Selection.Copy
Workbooks.Add
ActiveSheet.Paste
Sheets("Sheet1").Name = "Test Name"
Application.CutCopyMode = False
myNewFileName = myPath & myTestName & "_" & Date & ".xls"
ActiveWorkbook.SaveAs Filename:=myNewFileName _
    , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

Date函数返回当前系统日期。请务必注意,您想要的方括号不是有效的文件名字符;如果您尝试使用Excel,Excel将抛出错误。

答案 3 :(得分:1)

打开宏录制器;小心地执行你想要的步骤;停止录音机; “编辑”生成的宏。修复,因为你需要制作你想要的程序,例如,参数化它。