2011-03-02 5 views
0

このスクリプトは、隠しワークシートテンプレートをコピーし、既存のシートを削除することによってテンプレートをリセットします(一部の参照データを再投入した後)。私はそれをテストし、デバッグモードで正常に動作します。サブルーチンの終了後にExcel VBAがクラッシュする

Option Explicit 
Sub reset_PrintLayout_byCopy() 
    'the script replace the used printlayout with a copy from the hidden master. 

    Dim MeetingData() As String 
    Dim i As Integer 
    Dim j As Integer 
    Dim currentSheet As String 
    Dim datacolumns() As String 
    Dim userConfirm As String 
    ReDim Preserve MeetingData(3, 2) 
    ReDim Preserve datacolumns(2) 

    'warning about deleting data 
    userConfirm = MsgBox(Prompt:="Resetting the template will erase all data on the " _ 
    & "PrintLayout Template. Choose ""Cancel"", if you wish to save the file first", _ 
    Buttons:=vbOKCancel, Title:="Data to be erased!") 

    If (userConfirm = vbCancel) Then 
     Exit Sub 
    End If 

    'set parameters 
    datacolumns(0) = "D1" 
    datacolumns(1) = "I1" 


    'stop screen updating and displaying warnings 
    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 


    'set active sheet 
    currentSheet = ActiveSheet.Name 

    'capture meeting data already filled out 
    For j = 0 To UBound(datacolumns) - 1 
     For i = 1 To 3 
      If Worksheets(currentSheet).Cells(i, Range(datacolumns(j)).Column).Value <> "" Then 
       MeetingData(i - 1, j) = Worksheets(currentSheet).Cells(i, Range(datacolumns(j)).Column).Value 
      End If 

     Next i 
    Next j 

    'make hidden template visible 
    Worksheets("hiddenPrintLayoutTemplate").Visible = True 

    'Rename current Sheet 
     Sheets(currentSheet).Name = "used_Print_Layout" 

    ''add a new sheet 
    ' ActiveWorkbook.Worksheets.Add(before:=Sheets("used_Print_Layout")).Name = "PrintLayout Template" 

    'copy hiddentemplate before current sheet 
     Worksheets("hiddenPrintLayoutTemplate").Copy before:=Sheets("used_Print_Layout") 
     ActiveSheet.Name = currentSheet 

    'set rowheight for title rows 
     Range("A12").EntireRow.RowHeight = 24 
     Range("A18").EntireRow.RowHeight = 24 

    'delete current used printlayout 
     Worksheets("used_Print_Layout").Delete 

    'refilled meeting data 
    For j = 0 To UBound(datacolumns) - 1 
     For i = 1 To 3 
      If MeetingData(i - 1, j) <> "" Then 
       Worksheets(currentSheet).Cells(i, Range(datacolumns(j)).Column).Value = MeetingData(i - 1, j) 
      End If 
     Next i 
    Next j 

    'hide PrintLayout template 
    'Worksheets("hiddenPrintLayoutTemplate").Visible = xlSheetVeryHidden 
    'Sheets("PrintLayout Template").Select 

    'activate screenupdating and display warnings 
    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 
End Sub 

ボタンのマクロモードで実行すると、実行されますが、実行されるとクラッシュします。私は問題が何かを見つけることができません。何か案は?

答えて

2

デバッグで行単位でステップ実行することがわかりませんが、コード内のキーポイントにstopステートメントを挿入してみてください。だから、たとえば、次のような部分でstop文を入れることができます:

'capture meeting data already filled out 
For j = 0 To UBound(datacolumns) - 1 
    For i = 1 To 3 
     If Worksheets(currentSheet).Cells(i, Range(datacolumns(j)).Column).Value <> "" Then 
      MeetingData(i - 1, j) = Worksheets(currentSheet).Cells(i,Range(datacolumns(j)).Column).Value 
     End If 
    Next i 
Next j 

stop 

'make hidden template visible 
Worksheets("hiddenPrintLayoutTemplate").Visible = True 

コードその時点までに正常に実行場合は、見ることができる(すなわち、デバッグなしでそれを実行します)。存在する場合は、stopステートメントを削除し、さらにコードの下に置きます。クラッシュの原因となった声明を見つけるまでこれを繰り返します。おそらく理由が現れます。

-1

一般に、Excel VBAで異常なクラッシュが発生した場合は、WindowsのデフォルトプリンタをMicrosoft XPS Document Writerに切り替えてみてください。奇妙だと思われますが、これが原因であることを見つけるために何時間も無駄にしていた問題については、私にとってはうまくいっています。

+1

提出された問題を考えれば、これは非常に遠いものと思われます。 – CmdrSharp

関連する問題