2016-05-06 13 views
0

時にクリックしたときには、私は多くの時間がかかるこのループでマクロを持っている:VBA - マクロ仕上げはるかに速く、私はプロセス

Dim tempval As String 
Dim row As Integer, col As Integer 
Application.ScreenUpdating = False 

    For row = 2 To 500 Step 1 
     tempval = "" 
     For col = 7 To 15 Step 1 
      tempval = tempval & Cells(row, col).Value 
      Cells(row, col).Value = "" 
     Next col 
     Cells(row, 7).Value = tempval 

     For col = 8 To 16 Step 1 
     tempval = tempval & Cells(row, col).Value 
     Cells(row, col).Value = "" 
    Next col 
    Cells(row, 8).Value = tempval 

    Next row 

Application.ScreenUpdating = True 
Range("LibAnglais2:LibAnglais9").Select 
Selection.Delete Shift:=xlToLeft 
Range("LibFrancais2:LibFrancais9").Select 
Selection.Delete Shift:=xlToLeft 

コードが前に、このループの後、あります。 このループでは、コードの終了に3分かかります。それなしでは、30秒かかる。 しかし、ループ中にExcelのウィンドウをクリックすると(プログラムが実行されたときに、クリックすると、ウィンドウが白くぼやけた画面になります)、マクロをクリックして約45秒後に終了します...

Doなぜアイデアがありますか?そして、これを修正してより速いマクロを作るにはどうすればいいですか?

+0

たぶんApplication.Calculation = xlCalculationManualは – gizlmo

+0

いいえ、それは動作しません(ループの前)に役立ちます。 :/ – Ikanagura

+0

単純な 'cells(a、b).value =" "'がコンピュータを遅くし、変更した場合は、次の行の前にDoEventsを追加してください。 – ib11

答えて

1

ワークシートから一括してロードされたバリアント配列で作業します。連結にはJoin Functionを使用してください(Chr(124)は 'パイプ'文字です)、処理された値をワークシートに戻します。

Option Explicit 

Sub sonic() 
    Dim r As Long, vTMPs() As Variant, vVALs() As Variant 

    Application.ScreenUpdating = False 
    Application.EnableEvents = True 
    Application.Calculation = xlCalculationManual 

    With Worksheets("Sheet1") 
     vTMPs = .Range("G2:P500").Value2 
     ReDim vVALs(LBound(vTMPs, 1) To UBound(vTMPs, 1), LBound(vTMPs, 2) To 2) 
     For r = LBound(vVALs, 1) To UBound(vVALs, 1) 
      vVALs(r, 1) = Join(Array(vTMPs(r, 1), vTMPs(r, 2), vTMPs(r, 3), vTMPs(r, 4), _ 
            vTMPs(r, 5), vTMPs(r, 6), vTMPs(r, 7), vTMPs(r, 8)), Chr(124)) 
      vVALs(r, 2) = Join(Array(vTMPs(r, 2), vTMPs(r, 3), vTMPs(r, 4), vTMPs(r, 5), _ 
            vTMPs(r, 6), vTMPs(r, 7), vTMPs(r, 8), vTMPs(r, 9)), Chr(124)) 
     Next r 
     .Range("G2:P500").ClearContents 
     .Range("G2").Resize(UBound(vVALs, 1), UBound(vVALs, 2)) = vVALs 

     Application.ScreenUpdating = True 
     'I don't know what the following is supposed to do 
     .Range("LibAnglais2:LibAnglais9").Delete Shift:=xlToLeft 
     .Range("LibFrancais2:LibFrancais9").Delete Shift:=xlToLeft 
    End With 

    Application.EnableEvents = True 
    Application.Calculation = xlCalculationAutomatic 

End Sub 
+0

それは動作します!どうもありがとうございました ! – Ikanagura

1

時々、VBAはメッセージをより高速に処理する必要があります。なぜ私は本当に知りませんが、私のマクロのようなものがあると、Nextの前にループ内にDoEvents行が追加され、不思議です。より複雑なアプリケーションにはお勧めできません。ここでは、それの説明を見つけることができます:https://support.office.com/en-us/article/DoEvents-Function-7af41eca-88e0-470d-adaf-0b3d4c2575b0

だからあなたのコードは次のようになります。

DoEvents 
Next row 

HTH

+2

'doevents'は、この特定の場合にマクロをさらに遅くします。 –

0

[OK]をみんな、そう、私は解決策を見つけました。このサブのセルが変更された各時間を

Private Sub Worksheet_Change(ByVal Target As Range)

とコードパス: は実際には、私は自分のコード内の他のサブを持っていました。 だから私は置く:私のコードで

Application.EnableEvents = False 

を、そしてそれが仕事です! ありがとうございました!

編集実際には問題は完全に解決されていません...コードがワークシートを保存した後、またはコードを修正した後に時間がかかることに気付きました。ソリューションがありますか?

+0

このイベントはまったく必要ですか?あなたがしなければ、単にそれを削除することができますので。 – ib11

+0

ねえ、私はそれが必要です。 – Ikanagura

+0

さて、大丈夫、あなたがそれを見つけられてうれしい。 – ib11

関連する問題