2016-04-01 22 views
1

どこからでもこの問題に対する回答を見つけることができなかったので、皆さんが助けてくれることを願っています。私のExcelマクロは数回のデータを繰り返します。それは、ソースファイルをオートフィルタし、情報を取り出し、そのデータで動作し、約50回、すなわち1人につき1回再実行します。ここで私が意味する、すべての個々のサブメソッドがうまく動作し、かなり気に高速であるかのいくつかのコードがあります:ExcelがアクティブなウィンドウのときにExcelがゆっくり実行されています

For j = 1 To names.Count 
    'filter the source by name, generate sheet 
    FilterName names(j) 
    'prepare data with the necessary dates 
    FillMasterDates dates(), j 

    Dim i As Long 
    Dim ending As Long 
    ending = Sheets("Daten").Rows.End(xlDown).Row 
    Dim cellvalue As String 

    'check dates, etc 
    For i = 1 To ending 
     cellvalue = Sheets("Daten").Cells(i, 1) 
     If cellvalue = "" Then 
      Exit For 
     End If 
     ColorCell (i) 
     FilterDate CStr(dates(i)), names(j) 
    Next i 

    'user data has been successfully gathered, copy over to final sheet 
    FillColumns j 
Next j 

全体のコードは、私が約2000行を持っていると私が作成したことを考えると(実行するために約4〜秒かかります新しいシート50人用)、これは問題ありません。困ったことに、ExcelがApplication.ScreenUpdating = False(この時点では以前のマクロであったが、この時点ではまだアクティブ)を使用していても、アクティブなウィンドウを維持すると、マクロを実行するのに必要な時間が25秒になります。同じ入力、同じ出力。つまり、マクロを実行するには、excel-macroのタブを実行するには約4-5秒必要です。マクロを実行しますが、Excelにとどまり、25秒待ってください。

私は試しましたが、Application.WindowState = Application.WindowStateActiveWindow.SmallScrollDoEventsApplication.CalculateFull()です。私は別の計算設定を試しましたが、実際にExcelに自然な数式計算を使用していません - ソースファイルが* .xlsファイルであり、最終出力がこの形式のままでなければならないためExcelをインターフェイスとして使用する必要があります。

感謝のためにコードスニペットを増やす必要がある場合は、尋ねてください。私は今、良い二日間のために困惑してきました。

答えて

0

あなたが本当にExcelを経由して直接シートにアクセスいけない行くように見えるすべてのバックグラウンドナンセンスをバイパスしたい場合は、いつでもしかし

などの計算やアラートを無効にする
Application.ScreenUpdating = false 
Application.Calculations = xlManual 
Application.DisplayAlerts = False 

のカップルより多くのラインを試みることができますこのコンセプトは、あなたがそれに慣れていなくても少しでも価値があるならば、面倒かもしれません。なぜなら、あなたが最初にそれをやったことがない理由をすばやく速めるでしょう。

私はちょうどそれはあなたがあなたのデータをループすることができますこれで今

Dim RangeArray as Variant 'This will store your range as a values array 

RangeArray = Sheet1.Range("A1:G100000").Value 'this will put the entire ranges values into the array 

If Not IsArray(RangeArray) Then ExitSub 'If your range is only 1 cell it will not create an array so be careful, handle this as needed 

'This Array always starts lowerbound 1, RangeArray(1,1) = First Cell 

をどのように機能するかの例をあげて操作し、ちょうどあなたがセルまたはの場合と同様に、配列を変更するので、病気にあなたのコードを持っていけません範囲はオーバーヘッドがなく、その値だけでオブジェクトではありません。

あなたが必要なものを行っている一度あなたがする必要があるすべては、バックシートに値を入れているが

Sheet1.Range("A1:G100000").value = RangeArray 

を範囲とそれをthatsの、非常にシンプルで非常に効果的な、そして、配列の範囲には、この転送どんなに大きなものであっても即座です。

だけ---------- NEW MESSAGE ---------------これは

おかげ ポール・S

を助けなら、私に知らせて---------

ウィンドウがアクティブで表示されている間にこの問題が発生した場合は、少し過度で危険なものを試すことができます。問題はあなたのコード失敗し、エラーをトラップするのに失敗した場合、taskmanagerに移動してそこに閉じ込めるまで、それは見えなくなります。

Application.Visible = false 

(私がテストしたことがありませんが)これは、これはウィンドウを非表示にあなたをシミュレートし、あなたのコードは...

が完了したときにちょうどそれを取り戻す必要がありすぎ

をウィンドウを非アクティブ化する必要があります - ------------- NEW MESSAGE -------------------

Application.Windowstate = xlMinimized 

これはトリックを行う必要があります:Dを、必要がありますこの最初のhahaを言及した

私はあなたにも同様のことを試したことを見ましたが、コードが間違っています。これを試してみてください。

+0

お返事ありがとうございます。範囲を使用してオブジェクトを使用して私の仕事をするという私の現在の問題は、範囲内のオートフィルタデータを使いたいと思っていますが、これまでの試みは失敗しています。私はそれをすべてミリ秒以下にまで減らすことができると理解していますが、元の4秒は私の目的には十分であり、顧客にも満足しています。不規則な行動を単に止める他の方法はないのでしょうか?あなたが私の投稿を確認したら、警告を無効にするためのコード例をすでに試しました。 –

+0

Haha oh神、ありがとうPaul!ちょっと変わったことですが、うまくいきます。おそらく、アクティブなウィンドウを現在開いている別のウィンドウに切り替えるための「劇的な」コマンドはないでしょう。たとえば、ALT + TABの仕組みを言います。 –

+0

ありがとうございました!それは完全に動作します。私はALT TABを稼働させようとしていましたが、それはもっと細かいことです。あなたは大きな助けになりました –

関連する問題