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

6
尽管我看过的许多帖子都与我的问题有相同的线索,但没有一个答案满足我所寻找的。如果您能给我提供一个链接,我将很愿意阅读它。
我有一个带有工作表的工作簿。为简单起见,让我们假设我的工作簿只有一个名为“Sheet1”的工作表,并且在这个工作表中,单元格A1到A4中有数据。
我想要我的VBA代码:
1. 将工作簿'A'第一行(或具体地说是单元格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'保存为文件名,文件扩展名必须为“xls” 7. 关闭'Workbook B'并返回到'Workbook A'
目前我所拥有的是:
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"运行时,这将成为活动工作簿,即具有焦点的工作簿。这会影响正在运行工作簿'A'上的VBA代码吗?这是否意味着如果我想添加用于操作工作簿'A'单元格的代码,那么我需要使用"MyBook.Activate",其中'MyBook'保存工作簿'A'的实际标题字符串?
任何帮助将不胜感激。
谢谢, QF
4个回答

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的使用。

我建议您查看此帖子。

链接:Worksheets does not work


同样执行 newBook.SaveAsnewBook.Close。正如你所发现的那样,了解 ActiveWorkbook 所指的内容可能会令人困惑,因此最好在可能的情况下使用明确的引用。 - e100
感谢您的回复。我是一个 VBA 新手,按照您的建议后出现了“无效限定符”错误消息。我猜这是因为 MyBook 是错误的类型?此外,这对我来说真的没有意义,因为在哪里有将内容粘贴到 newBook 的命令?您能详细说明一下吗? - qwerty_face
@SiddharthRout:当然可以。你的代码对我有效。非常感谢。 - qwerty_face
@qwerty_face:太好了 :) 在这种情况下,请记得选择相关答案来关闭您的问题 :) - Siddharth Rout
@SiddharthRout:感谢您昨天的帮助。我遇到了一个情况,现在需要从新工作簿中删除一行。您知道我该如何实现吗? 编辑 - 删除行将取决于工作簿“A”sheet1中单元格A1中的值是否与工作簿“B”sheet1中单元格A1中的值匹配。此代码片段运行时间比复制行的代码片段晚得多,因此可能看起来有点落后。 - qwerty_face
@qwerty_face:最好还是将这个问题作为一个新问题发布 :) - Siddharth Rout

4

尽可能避免使用对ActiveWorkbook的引用,而应该使用明确的引用。

正如你所发现的那样,知道当前活动的工作簿是令人困惑的,并且你不需要激活一个工作簿来操作它。

因此,你应该使用明确的引用,例如:

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

记录的宏通常会激活工作簿以便处理它们,但这是因为记录宏的人的工作方式!所有激活实际上只是改变了焦点。
同样的道理也适用于选择并操作当前选择;在VBA中这不是必要的,并且比直接操作更慢。

感谢您对ActiveWorkbook的澄清。 - qwerty_face

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
< p > Date函数返回当前系统日期。需要注意的是,您想要的方括号不是有效的文件名字符;如果您尝试使用它们,Excel会抛出错误。 < /p >

重要的是要注意,如果您尝试使用方括号,它们会引发错误。我之前并不知道这一点。非常感谢您的回复。 - qwerty_face

1
打开宏录制器,仔细执行所需的步骤,停止录制;"编辑"生成的宏。根据需要进行修正,例如参数化以实现预期的程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接