6

尽管我看过许多与我的问题相同的帖子,但没有一个答案能满足我的要求。如果您可以将我链接到我很乐意阅读它。

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

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

  1. 将工作簿“A”的第 1 行(或特别是单元格 A1 到 A4)复制到范围变量“myRange”中
  2. 创建一个新的工作簿,我们称之为工作簿'B'
  3. 将工作簿“B”的默认“sheet1”命名为“测试名称”
  4. 打开工作簿“B”(尽管我意识到 VBA 代码“Workbooks.Add”会打开一本新书,因此此步骤可能是多余的,因为 Workbooks.Add 涵盖了第 2 点和第 3 点的一半)
  5. 将“myRange”粘贴到“工作簿 B”的第一行
  6. 保存名称为“Test Book”的“工作簿 B”,并用方括号括起来的时间戳。该文件还必须是文件扩展名“xls”
  7. 关闭“工作簿 B”并返回“工作簿 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”运行时,AFAIK 将成为活动工作簿,即具有焦点的工作簿。这是否会影响 VBA 代码在工作簿“A”上运行的方式?这是否意味着如果我想添加代码来操作工作簿“A”的单元格,那么我需要使用“MyBook.Activate”,其中“MyBook”包含工作簿“A”的实际标题字符串?

任何帮助将不胜感激。

谢谢,QF

4

4 回答 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

我建议你看看这篇文章。

链接:工作表不起作用

于 2012-04-19T14:36:23.173 回答
4

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

正如您所发现的,知道当前处于活动状态的内容可能会令人困惑,并且您无需激活工作簿即可对其进行操作。

所以你应该使用

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

录制的宏往往会激活工作簿以便对其进行处理,但那是因为录制宏的人就是这样工作的!所有激活真正做的是改变焦点。

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

于 2012-04-19T14:54:15.363 回答
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 将引发错误。

于 2012-04-19T14:47:38.837 回答
1

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

于 2013-05-06T00:47:23.757 回答