2011-04-27 16 views
0

同じマクロを含む2つのブックがあります。 1つのワークブックでは、マクロは超高速で1秒未満で実行されます。もう一方では、実行には約30秒かかります。私はExcel 2003を使用しています。ページ区切りは両方のブックでオフになっています。私は、何が他のものより遅く動く原因になるのか分かりません。何か案は?同一のマクロ速度差

Sub viewFirst() 
Dim dataSheet As Worksheet, inputSheet As Worksheet, projectID As Long 
Dim projectRow As Long, lLastRec As Long, inputLastRow As Long, dataLastRow As Long, x As Long, sh As Shape 
Worksheets("Input").Select 
ActiveSheet.Protect "", UserInterfaceOnly:=True 
Range("a1").Select 
ActiveSheet.Pictures.Insert ("working.jpg") 
Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
Application.EnableEvents = False 
Set inputSheet = Worksheets("Input") 
Set dataSheet = Worksheets("Database") 
With inputSheet 
    inputLastRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row - 1 
End With 
With dataSheet 
    dataLastRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row - 1 
    lLastRec = dataLastRow - 1 
End With 
With inputSheet 
    .Range("currentProject").Value = 1 
    projectID = .Range("currentProject").Value 
    projectRow = projectID + 1 
    For x = 1 To inputLastRow 
     If Range("b" & x).HasFormula Then 
      x = x + 1 
     End If 
     If x > inputLastRow Then 
      Exit For 
     End If 
     If Not Range("b" & x).HasFormula Then 
      .Range("b" & x).Value = dataSheet.Cells(projectRow, 2 + x) 
     End If 
    Next x 
    .Range("d125").Value = dataSheet.Cells(projectRow, 2 + 149) 
    .Range("d128").Value = dataSheet.Cells(projectRow, 2 + 150) 
    .Range("d131").Value = dataSheet.Cells(projectRow, 2 + 151) 
    .Range("d134").Value = dataSheet.Cells(projectRow, 2 + 152) 
    .Range("d137").Value = dataSheet.Cells(projectRow, 2 + 153) 
    .Range("d140").Value = dataSheet.Cells(projectRow, 2 + 154) 
End With 
With ActiveSheet 
    For Each sh In .Shapes 
     If sh.Type = msoPicture Then 
      ActiveSheet.Unprotect "" 
      sh.Delete 
      ActiveSheet.Protect "", UserInterfaceOnly:=True 
     End If 
    Next sh 
End With 
Range("b5").Select 
Application.EnableEvents = True 
Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 
End Sub 

-EDIT-

osknows、応答に感謝します。明確にするために、ワークブックは同時に開かれません。また、ワークシートはデータシート上のデータを除いて同じです。マクロの実行速度が遅いデータシートの行数は35行×204列、データシートの実行時間は56行ですX 156列。私は、入力シート上の非表示の列または非空白のセルを検索します。

答えて

3

2つのワークブックが表示されていなくても、わかりにくいです。最高のアドバイスは、コードの場所

dtStart = GetTickCount 
dtline2 = GetTickCount 
dtline3 = GetTickCount 
dtline4 = GetTickCount 
.. 
etc 

の特定の行の間、あなたのコード番号で、モジュールのdecareで...

によって

Public Declare Function GetTickCount Lib "kernel32"() As Long 

をあなたのコードの正確速度を測定することですdtStartとdtline2の間のティックの数はdtline2 - stStartなどです

また、多くの要因が遅くなる可能性があります。

  1. には、空白に見えるが、そうでない行が多数含まれる可能性があります。

  2. Set inputSheet = Worksheets("Input") & Set dataSheet = Worksheets("Database")は、大規模な複雑かもしれ

  3. For Each sh In .Shapesあなたは&シートは、複数のワークブックを持っている場合は、オープンで使用している未定義の範囲を有する同じ

  4. を見てお互いに比べて多くの重複形状を含めることができます範囲コードが実行されている間にワークブック/ワークシート/範囲が明示的に定義されていません。 (レンジ対例:.Rangeは)With

例えば

With ThisWorkbook 
    With SheetXYZ 
    With .range("XYZ1") 

    End with 
    End With 
End With 

または

を使用して範囲ファイルパス/ワークブック/シート/範囲またはセルなどへのフルパスを使用しての習慣に取得します
With ThisWorkbook 
    With SheetXYZ.range("XYZ1") 
    .formula = "=Now()" 

    End With 
End With 

もSにこの便利なサイトExcel Pages

0

をチェックしてくださいマシンを下げ、アドインをアンロードします。グローバル変更イベントを持つアドインがある場合は、ワークシートが変更されるたびに自動的に発生し、スローダウンを引き起こす可能性があります。あなたはスプレッドシートにかなり書いているので、それはたくさん呼ばれるでしょう。

セルごとに書き込む代わりに、配列(2次元、1の下限)を構築し、すべてのデータを1回の大きなスワップでセルに書き込むことを検討してください。ここにその動作の例があります。

Sub WriteOnce() 

    Dim aReturn() As Double 
    Dim i As Long, j As Long 

    Const lLASTROW As Long = 10 
    Const lLASTCOL As Long = 5 

    ReDim aReturn(1 To lLASTROW, 1 To lLASTCOL) 

    For i = 1 To lLASTROW 
     For j = 1 To lLASTCOL 
      aReturn(i, j) = Rnd 
     Next j 
    Next i 

    Sheet1.Range("A1").Resize(UBound(aReturn, 1), UBound(aReturn, 2)).Value = aReturn 

End Sub 

私はワークシートに一度しかアクセスしていないので、どのイベントハンドラも一度だけ起動します。

+0

ディック、答えてくれてありがとう - 両者は同じマシンで動作しています。基本的に、マクロは入力シート上のx行を取り出し、データシート上のx列に転置するだけです。 – Don

関連する問題