0

我有一本工作簿,里面有很多封面,然后是后面的一堆包含一些图表的表格。图形页面是通过一遍又一遍地复制粘贴一张表(“MasterFormat”)创建的,每次都更改一些关键值。

该宏最初用于相当快地出现Copy Method of Worksheet Class failed错误。我最终从http://support.microsoft.com/kb/210684找到了解决方法。

问题是,我的更新版本遇到了无穷无尽的问题。主要是它继续愉快地运行,但一段时间后实际上并没有复制任何东西。之所以高兴的部分原因是更新后的逻辑包含几个Set x = y, if x is nothing thens,(据我所知)仅适用于抑制错误,所以这就是我所做的。但另一方面,它在有 50 张纸后停止复制,并且没有给出任何解释(尽管这可能是 的位置错误on error goto 0)。

有谁知道我应该修复什么才能让它真正复制所有的工作表,而不仅仅是感到无聊并停下来?

代码如下:

Sub GenerateSheets()
    Application.ScreenUpdating = False

    Dim oBook As Workbook

    On Error Resume Next
    Set oBook = Workbooks("SSReport.xls")

    If oBook Is Nothing Then
        Set oBook = Application.Workbooks.Open("SSReport.xls")
    End If
    On Error GoTo 0

    Dim i, j As Integer
    Dim SheetName As String
    Dim ws As Worksheet
    Const PairingCount = 63

    Dim Pairings(1 To PairingCount, 1 To 2) As String
    For i = 1 To PairingCount
        Pairings(i, 1) = oBook.Sheets("SSPairings").Rows(i + 1).Cells(1)
        Pairings(i, 2) = oBook.Sheets("SSPairings").Rows(i + 1).Cells(2)
    Next i

    For i = 1 To PairingCount

         If i Mod 5 = 0 Then
            oBook.Close SaveChanges:=True
            Set oBook = Nothing
            Set oBook = Application.Workbooks.Open("SSReport.xls")
         End If

        Application.ScreenUpdating = False
        j = oBook.Worksheets.Count
        SheetName = "P" & Pairings(i, 1) & Pairings(i, 2)
        On Error Resume Next
        Set ws = oBook.Sheets(SheetName)
        If ws Is Nothing Then
            On Error GoTo 0
            oBook.Sheets("MasterFormat").Copy After:=Sheets(j)
            oBook.Sheets("MasterFormat (2)").Name = SheetName
        End If
        oBook.Sheets(SheetName).Cells(1, 2) = Pairings(i, 1)
        oBook.Sheets(SheetName).Cells(1, 5) = Pairings(i, 2)
        oBook.Sheets(SheetName).Cells(1, 8) = "P"
    Next i

    Application.ScreenUpdating = True
End Sub

它是从元工作簿运行的,这是我上面链接到的知识库文章的建议。有趣的是,尽管Open workbook没有打开主工作簿,但它似乎并没有真正起作用。

4

3 回答 3

1

该错误可能是由这一行引起的:

oBook.Sheets("MasterFormat").Copy After:=Sheets(j)

Sheets(j)引用代码模块所在的任何工作簿,这可能不是预期的工作簿。

以下对我有用:

Sub GenerateSheets()
Dim oBook As Workbook
Dim i As Long
Dim j As Long
Dim SheetName As String
Dim ws As Worksheet
Const PairingCount = 63
Dim Pairings(1 To PairingCount, 1 To 2) As String

On Error Resume Next
Set oBook = Workbooks("SSReport.xls")
On Error GoTo 0
If oBook Is Nothing Then
    Set oBook = Application.Workbooks.Open("SSReport.xls")
End If

With oBook
    For i = 1 To PairingCount
        Pairings(i, 1) = .Sheets("SSPairings").Rows(i + 1).Cells(1)
        Pairings(i, 2) = .Sheets("SSPairings").Rows(i + 1).Cells(2)
    Next i

    For i = 1 To PairingCount
        If i Mod 5 = 0 Then
            '//Save in case of corruption/error?'
            .Save
        End If

        j = .Worksheets.Count

        SheetName = "P" & Pairings(i, 1) & Pairings(i, 2)

        On Error Resume Next
        Set ws = .Sheets(SheetName)
        On Error GoTo 0
        If ws Is Nothing Then
            .Sheets("MasterFormat").Copy After:=.Sheets(j)
            .Sheets("MasterFormat (2)").Name = SheetName
        End If

        .Sheets(SheetName).Cells(1, 2) = Pairings(i, 1)
        .Sheets(SheetName).Cells(1, 5) = Pairings(i, 2)
        .Sheets(SheetName).Cells(1, 8) = "P"
    Next i
End With
End Sub

我冒昧地将关闭/重新打开替换为简单Save的,因为这应该达到相同的结果?

于 2009-05-05T09:57:58.317 回答
0

尝试改变

        If ws Is Nothing Then
            On Error GoTo 0
            oBook.Sheets("MasterFormat").Copy After:=Sheets(j)
            oBook.Sheets("MasterFormat (2)").Name = SheetName
        End If
        oBook.Sheets(SheetName).Cells(1, 2) = Pairings(i, 1)
        oBook.Sheets(SheetName).Cells(1, 5) = Pairings(i, 2)
        oBook.Sheets(SheetName).Cells(1, 8) = "P"

进入

     If ws Is Nothing Then
        On Error GoTo 0
        oBook.Sheets("MasterFormat").Copy After:=Sheets(j)
        oBook.Sheets("MasterFormat (2)").Name = SheetName
    else
       oBook.Sheets(SheetName).Cells(1, 2) = Pairings(i, 1)
       oBook.Sheets(SheetName).Cells(1, 5) = Pairings(i, 2)
       oBook.Sheets(SheetName).Cells(1, 8) = "P"
    End If

我想如果 ws 什么都不是,那么它会卡在接下来的 3 行中。

于 2009-05-05T15:42:32.963 回答
0

根据 Lunatik 的回答,我改为oBook.Sheets("MasterFormat").Copy After:=Sheets(j)oBook.Sheets("MasterFormat").Copy After:=oBook.Sheets(j)这似乎解决了问题。

于 2009-05-12T03:45:58.493 回答