VBA认为Integer是Object

时间:2018-09-13 08:58:52

标签: excel vba excel-vba

此代码为NotCopySheet变量的行设置值返回错误91。当我仅将代码保留在MsgBox行中时,VBA运行良好。 我在工作表中有一个名为“ NotCopy”的范围。 我没有太多VBA经验。这是我发现可以完成我所需要的代码。我将使用NotCopySheet变量停止复制/删除前几张纸。

Sub CopyWorkbookValue()

Dim Output As Workbook, Source As Workbook
Dim sh As Worksheet
Dim FileName As String
Dim OriginalName As String
Dim firstCell
Dim NotCopySheet As Integer

OriginalName = ActiveWorkbook.Name
NotCopySheet = ActiveSheet.Range("NotCopy").Cells(1, 1).Value
MsgBox "The number of sheet ignore is " & NotCopySheet

Application.ScreenUpdating = False
Set Source = ActiveWorkbook
Set Output = Workbooks.Add
Application.DisplayAlerts = False

Dim i As Integer

For Each sh In Source.Worksheets

    Dim newSheet As Worksheet

    ' select all used cells in the source sheet:
    sh.Activate
    sh.UsedRange.Select
    Application.CutCopyMode = False
    Selection.Copy

    ' create new destination sheet:
    Set newSheet = Output.Worksheets.Add(after:=Output.Worksheets(Output.Worksheets.Count))
    newSheet.Name = sh.Name

    ' make sure the destination sheet is selected with the right cell:
    newSheet.Activate
    firstCell = sh.UsedRange.Cells(1, 1).Address
    newSheet.Range(firstCell).Select

    ' paste the values:
    Range(firstCell).PasteSpecial Paste:=xlPasteColumnWidths
    Range(firstCell).PasteSpecial Paste:=xlPasteFormats
    Range(firstCell).PasteSpecial Paste:=xlPasteValues, _
    Operation:=xlNone, SkipBlanks:=True, Transpose:=False

Next

' delete the sheets that were originally there
While Output.Sheets.Count > Source.Worksheets.Count
  Output.Sheets(1).Delete
Wend

FileName = "C:\Dropbox\0 EPAS Export\ValueOnly_" & OriginalName
Output.SaveAs FileName
'Output.Close
Application.ScreenUpdating = True

End Sub

2 个答案:

答案 0 :(得分:0)

查看代码后,只需一行代码即可完成

ActiveWorkbook.SaveCopyAs "C:\Dropbox\0 EPAS Export\ValueOnly_" & ThisWorkbook.Name & ".xlsx"

或更佳

ThisWorkbook.SaveCopyAs "C:\Dropbox\0 EPAS Export\ValueOnly_" & ThisWorkbook.Name & ".xlsx"

更新:ThisWorkbook.Name引用具有宏的工作簿。据我从您的代码中了解到,您正在尝试从ActiveWorkbook复制所有工作表。如果运行宏时另一个工作簿处于活动状态,则使用ActiveWorkbook可能会产生不良结果。 ValueOne & workbook.name是您将要使用的新工作簿命名约定。您之前也评论过要删除工作表,可以通过将代码添加到宏中或打开新工作簿并删除要使用的工作表来实现。

答案 1 :(得分:0)

该错误很可能是由NotCopySheet = ActiveSheet.Range(“ NotCopy”)。Cells(1、1).Value中的“ ActiveSheet”引起的。如果ActiveSheet不是具有命名范围“ NotCopy”的工作表,则将导致问题。话虽如此,您的代码比需要的复杂得多。您要做的就是将所有公式转换为值,然后以新名称保存文件。

   Sub CopyWorkbookValue()
    Dim NotCopySheet As Integer
    On Error GoTo ErrorExit
        NotCopySheet = Range("NotCopy").Cells(1, 1).Value
        MsgBox "The number of sheet ignore is " & NotCopySheet
       For Each sh In ThisWorkbook.Sheets
            sh.UsedRange.Copy
            sh.UsedRange.PasteSpecial Paste:=xlPasteValues
       Next sh
       ThisWorkbook.SaveCopyAs "C:\Dropbox\0 EPAS Export\ValueOnly_" & ThisWorkbook.Name & ".xlsx"
     Exit Sub
ErrorExit:
     MsgBox "Error text here."
    End Sub

查看您的代码,看起来您过度依赖宏记录器来生成代码。虽然宏记录器很有用,但它也会生成许多不需要的代码。停下来,想一想到底要执行什么操作,然后使用宏记录器生成将执行所需操作的代码段。查看宏记录器生成的代码,并弄清楚每一行到底在做什么,以及是否真的需要在代码中包括它。