Excel VBA在新创建的工作簿中执行代码

时间:2016-11-23 10:24:53

标签: excel vba excel-vba

我试图将我的Excel文件中的一个工作表保存到一个新文件中,但没有使用公式。

我有这个代码正在努力保存文件:

Sub SaveInvoice()

 'Create a filename based on invoicenumber
 Dim FileName As String
 FileName = Sheets("Sale").Range("C3").Value

 'Copy the "Print" sheet
 Worksheets("Print").Copy

 With ActiveWorkbook
    'Save the file as new
    .SaveAs FileName:="C:\" & FileName
 End With

End Sub

这就像一个魅力,但我需要删除公式,所以我用Google搜索并编写了这段代码:

ActiveSheet.Copy
Cells.Copy
Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

这也是有效的,但是一旦我将两段代码合并在一起,整个函数就会中断。

 With ActiveWorkbook
    'Transform cells to values
     ActiveSheet.Copy
     Cells.Copy
     Range("A1").PasteSpecial Paste:=xlPasteValues
     Application.CutCopyMode = False

    'Save the file as new
    .SaveAs FileName:="C:\" & FileName
 End With

这导致我的基础工作表从公式中删除。

我需要知道如何在newle创建的工作簿上调用该函数。

3 个答案:

答案 0 :(得分:2)

复制没有Destination excel的工作表时会创建New WorkbookNew Workbook只有Worksheet处于活动状态。

编辑:我刚才在最终代码中意识到这些来自原始代码的行:

'Copy the "Print" sheet
 Worksheets("Print").Copy

内移动
With ActiveWorkbook

之前指的是New Workbook创建的Worksheet.Copy,现在指的是Source Workbook

那么让我们看看Op的最终代码实际上在做什么:

此处ActiveWorkbook是[来源工作簿],ActiveSheet 必须是[打印]

With ActiveWorkbook

这会复制ActiveSheet创建New Workbook只有一张

     ActiveSheet.Copy

这些行正在影响[来源工作簿]中的ActiveSheet [打印]。 不是因为With声明,而是因为它是活跃的

    Cells.Copy
    Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False

With中旨在影响其所引用对象的命令必须以点[。]开头;但是这些行无效,因为单元格和范围不是工作簿对象的方法和属性,因此会触发错误。

  

使用声明

     

对单个对象或用户定义的类型执行一系列语句。

     

(来自msdn.microsoft.com帮助)

这会保存With语句引用的工作簿,仍然包含公式

   'Save the file as new
   .SaveAs FileName:="C:\" & FileName

End With

试试这段代码:

Sub SaveInvoice_TEST_1()
'Create a filename based on invoicenumber
Dim FileName As String
    With ThisWorkbook
        FileName = .Sheets("Sale").Range("C3").Value
        'Copy the "Print" sheet
        .Worksheets("Print").Copy
    End With

    With ActiveWorkbook
        Rem Replace Formulas with Values
        .Sheets(1).UsedRange.Value = .Sheets(1).UsedRange.Value2
        'Save the file as new
        .SaveAs FileName:="C:\" & FileName
    End With
    End Sub

建议阅读以下页面以深入了解所使用的资源:

With Statement

答案 1 :(得分:0)

尝试以下内容。阅读“ActiveSheet.Copy”的帮助页面 - 请注意,它会创建一个新工作簿并激活它

Dim MyWkbk as workbook 

set MyWkbk = ActiveWorkbook
ActiveSheet.Copy

With ActiveWorkbook
    Cells.Copy
    Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False

   'Save the file as new
   .SaveAs FileName:="C:\" & FileName
   '.close
End With


MyWkBk.activate

答案 2 :(得分:0)

感谢@EEM找到解决方案。

这是我使用的代码:

Sub SaveInvoice()
    Dim FileName As String

    With ThisWorkbook
        'Create a filename based on invoicenumber
        FileName = .Sheets("Sale").Range("C3").Value

        'Copy the "Print" sheet
        .Worksheets("Print").Copy
    End With

    With ActiveWorkbook
        'Replace Formulas with Values
        .Sheets(1).UsedRange.Value = .Sheets(1).UsedRange.Value2

        'Save the file as new
        .SaveAs FileName:="C:\" & FileName
    End With
End Sub