2017-11-03 11 views
0

私はVBAコードでExcelファイルを持っています ユーザーフォームに6桁の数字を入力すると、VBAは別のシートをチェックし、 6桁の数字がワークシートにあります。 もしそうであれば、ステージを変更しますが、この6桁の数字をワークシートに追加しますVBAコードをスピードアップするには

これは完璧に動作しましたが、Excelファイルが行数6000行は、このコードは非常に遅くなっており、シートを更新する20秒までかかる

誰かが私には、このコードアップを加速、またはそれはコードが

の下

ある

acheiveする別の方法を提案する助けてください
Private Sub cmdPSDUdate_Click() 
Dim x 
If (Me.PSDUDateRow = "") + (Me.PSDStageCB.ListIndex = -1) Then Exit Sub 
With Sheets("psdata stage cals").ListObjects("PSDataStageCals") 
    x = Application.Match(Val(Me.PSDUDateRow), .ListColumns(1).DataBodyRange, 0) 
    If IsNumeric(x) Then 
     .ListRows(x).Range(2) = Me.PSDStageCB.Value 
    Else 
     .ListRows.Add.Range = Array(Val(Me.PSDUDateRow), Me.PSDStageCB) 
    End If 
End With 
Me.PSDUDateRow.Value = "" 
Me.PSDStageCB.Value = "" 
Me.PSDUDateRow.SetFocus 
End Sub 

ありがとうございます

ラフール

+0

コードにエラーは発生せず、単に遅い場合は、ここに属しません。レビューと改善の提案については、https://stackexchange.com/に移動することを検討してください。 –

+0

@KostasK。私はあなたが[CodeReview.SE](https://codereview.stackexchange.com/help/how-to-ask)を意味すると思いますか? – Vegard

+0

正しい。 https://codereview.stackexchange.com/questions/tagged/vba –

答えて

-2

VBAが解釈されるため、遅いです。

本当にスピードを上げたいのであれば、VBAをActiveXやオートメーション(あるいはもっと現代的な)技術に基づいたコンパイル済みのプログラミング言語に置き換えることをお勧めします。 (これは、Excelを起動してExcelファイル内でプログラムを実行する代わりに、Excelファイルで何かを行うコンピュータプログラムを起動する必要があることを意味します)

+0

あなたのVBAが遅いという答えは間違っています。 *この* VBAは遅いです。しかし、答えは「何かをもっと速く使う」ことではありません。それは「もっとスマートなプログラム」です。このVBAは、MATCH関数のバイナリルックアップバージョンに変更し、ワークシートでそれらを実行することによって、現在実行中のわずかな時間で実行するようにリファクタリングすることができます。 Excel/VBA除算。数ミリ秒を節約する全く異なるプラットフォームへの移行を検討するだけでなく、ユーザーがスピードについて不満を抱くことを夢見ることもないほど十分に速い。 – jeffreyweir

+0

@jeffreyweir:私はあなたのことを理解していますが、実際にここにいこう:彼はテーブルを使って作業しており、何千ものエントリしかなく、すでに完了するのに数十秒待つ必要があります。これは、画面の更新を停止するなど、プロセスのスピードアップが不可能であることを意味しますか?いいえ、明らかに仕事を速くするトリックがありますが、いくつかの限界までしかスピードアップすることはできませんが、新技術が必要になると、それが起きる可能性があります。とにかく捨てなければならないもののために、すべての努力をしました。 – Dominique

+0

上記の変更を加えれば、コードは目の瞬きで実行されます。 Excelが遅く実行されている唯一の理由は、不注意で遅く実行するようにプログラムされているためです。ユーザーがVBAで実行しているのか、次の10年からの量子コンピュータであるのかを知ることができないほど、同じプロセスを驚くほど速く実行するように簡単にプログラムすることができます。あなたがコードをリファクタリングした後にある日にあなたが*パフォーマンス限界に達するかもしれないので、ひどく書かれたコードをスピードアップしようとするのは面倒なことではないと言っても過言ではありません。私たちはここでその限界に近づいていません。 – jeffreyweir

2

画面更新を自動計算など

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

‘Place your macro code here 

Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 
Application.DisplayStatusBar = True 
Application.EnableEvents = True 
0

あなたのコードに間違いはありません。多分、ワークブックそのものが犯人です。それは巨大になり、オープンに時間がかかりますか? 「はい」の場合は、「cleanup excel file」を検索してみてください。私が見つけた
一部の結果:Storaxによって提案さの調整に加えて
https://excelfilecleaner.codeplex.com/
https://support.microsoft.com/en-us/help/3070372/how-to-clean-up-an-excel-workbook-so-that-it-uses-less-memory

1

は、Excel/VBAの除算を介してデータ・セル・バイ・セルをもたらしているので、あなたのコードが遅いです。

また、MATCH関数のバイナリバージョンを使用することにより、MATCH関数を大幅に高速化することができます。 http://dailydoseofexcel.com/archives/2015/04/23/how-much-faster-is-the-double-vlookup-trick/を読んで、Excelシート内で完全にルックアップを実行するか(VBAを使用して数式をシートに書き込んで実行するか)、またはExcelシート内で完全にルックアップを実行するかバリアント配列を使用してすべてのデータを一度にVBAに取り込み、ロジックを実行してから、一度にダンプして戻します。 Google "ExcelとVBAの間でデータを効率的に転送する方法"など。また、チャールズ・ウィリアムズの記事をチェックしてください。

関連する問題