2009-05-05 79 views
0

我有一个工作簿,其中包含一些封面,然后是包含几张图的背面一堆工作表。图形页面通过一遍又一遍地复制粘贴一张表格(“MasterFormat”)来创建,每次更改几个关键值。当工作簿命中50个工作表时,复制工作表宏将停止执行任何操作

该宏最初用于相当快地生成一个Copy Method of Worksheet Class failed错误。我终于找到了如何解决它,从http://support.microsoft.com/kb/210684

问题是,我用我的更新版本有无尽的问题;主要是它继续愉快地运行,但实际上不会在一段时间后复制任何东西。部分原因是更新后的逻辑包含了几个Set x = y, if x is nothing then,它们(据我所知)只能在抑制错误的情况下工作,所以这就是我所做的。但是另一方面,在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 

它从元的工作簿,这是KB文章我挂上面的建议运行。有趣的是,尽管Open workbook,如果主工作簿没有打开,它似乎并不工作。

回答

1

的错误可能是由这种行:

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

Sheets(j)将指取其工作簿中的代码模块驻留在,这可能不是所预期的工作簿。

对我来说,以下的工作:用一个简单的Save因为这

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 

我把更换的紧密的自由/重启应达到同样的效果?

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行。

0

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

+0

不良形式的位标记自己的答案接受然后,不是? – Lunatik 2009-05-12 08:44:13