2012-04-19 92 views
5

尽管很多帖子我已经经历是沿着相同的路线,我的问题看,没有一个答案满足我所期待的。如果你能把我和我联系起来,我很乐意阅读它。VBA - 如何在Excel中从一个工作簿复制一行到另一个?

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

我想要什么我的VBA代码做的是:

  1. 复制第1行(或特别单元A1至A4)练习册 'A' 到范围变量 'myRange'
  2. 创建一个新的工作簿,让我们称之为工作簿'B'
  3. 为Workbook'B的默认“sheet1”重新命名为“Test Name”
  4. Open Workbook'B'(尽管我意识到VBA代码“Workbooks.Add”会打开一个新的书所以这一步可以是多余的,因为Workbooks.Add覆盖点2和3的一半)
  5. 粘贴“myRange”到“工作簿B”
  6. 保存“工作簿B”的第一行名称为“测试书”和方括号中的时间戳。该文件还必须是文件扩展名为“XLS”
  7. 关闭“工作簿B”并返回到“工作簿”

我到目前为止是这样的:

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

回答

9

,而不是复制粘贴你上面提到的方式,你可以直接做到这一点。这也会否定变量的使用。

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

+0

做'newBook.SaveAs'和'newBook.Close'。正如你所发现的,知道ActiveWorkbook所指的是什么可能会令人困惑,因此最好在可能的情况下使用明确的引用。 – e100 2012-04-19 14:46:14

+0

感谢您的回复。我是一名VBA新手,在您的建议之后,我收到了“无效限定符”错误消息。我想这是因为MyBook是错误的类型?另外,这对我来说没有任何意义,因为粘贴到newBook的命令在哪里?你能详细说明一下吗? – 2012-04-19 14:47:19

+0

@ e100:当您发布此评论时,我正在编辑我的帖子:) – 2012-04-19 14:48:12

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会抛出一个错误。

+0

“...需要注意的是,如果您尝试使用这些方括号,它会引发错误。”我对此毫无头绪。非常感谢您的回复。 – 2012-04-19 14:55:34

4

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

正如您发现的那样,您可能会对目前处于活动状态的内容感到困惑,并且您无需激活工作簿即可对其进行操作。

所以,你应该使用

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

录制的宏倾向于激活工作簿,以便对他们的工作,但那是因为这是谁记录他们一个人的工作方式!所有的激活确实是改变焦点。

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

+0

感谢ActiveWorkbook的清晰度。 – 2012-04-19 14:57:43

1

打开宏录像机;仔细执行你想要的步骤;停止录音机; “编辑”生成的宏。根据您需要制作您想要的程序进行修复,例如对其进行参数化。

相关问题