尽管有许多帖子我看起来和我的问题一样,但没有一个答案符合我的要求。如果你能把我联系到一个我很乐意读它。
我有一个包含工作表的工作簿。为简单起见,假设我的工作簿有一个工作表。在我的名为“Sheet1”的工作表中,单元格A1到A4中有数据。
我想要的VBA代码是:
到目前为止我所拥有的是:
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
正如您所看到的,我缺少将要处理的代码:
最后,我在我的代码中包含了一个问题,因为我认为我可能对ActiveWorkbook方法有误解。当代码“Workbooks.Add”运行时,AFAIK成为活动工作簿,即具有焦点的工作簿。这会影响在工作簿“A”上运行的VBA代码吗?这是否意味着如果我想添加代码来操作工作簿“A”的单元格,那么我需要使用“MyBook.Activate”,其中“MyBook”包含工作簿'A的实际标题的字符串?
非常感谢任何帮助。
谢谢, QF
答案 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
我建议你看看这篇文章。
答案 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)
打开宏录制器;小心地执行你想要的步骤;停止录音机; “编辑”生成的宏。修复,因为你需要制作你想要的程序,例如,参数化它。