子程序完成后,Excel VBA崩溃

时间:2011-03-02 09:56:22

标签: excel vba excel-vba copy

此脚本用于重置模板,方法是复制隐藏的工作表模板并删除现有工作表(重新填充一些参考数据后)。我测试了它,它在调试模式下运行良好。

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 

在按钮上以微距模式运行时,它会运行,但excel崩溃,完成后。我找不到问题所在。有什么想法吗?

2 个答案:

答案 0 :(得分: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 :(得分:-1)

通常,如果您在Excel VBA中出现奇怪的崩溃,请尝试将Windows默认打印机切换到Microsoft XPS Document Writer。看起来很奇怪,但这对我来说有用的问题,我浪费了很多时间才发现这是罪魁祸首。