• ベストアンサー

Excel マクロの実行が途中で止まり(応答なし)になるのですが・・・

単純な1行おきに色を付けるマクロなのですが、 実行すると400件位は処理するのですが、そこで固まってしまいます。 1.5MB のデータで15000件位あります。 タスクマネージャのCPU使用率は100%になってます。 どのように対応すればよいか、ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.9

こんばんは。KenKen_SP です。 条件付き書式を使えば? Sub Sample1()   ' テストデータをセット   Cells.Delete   Range("A1:A15000").Value = "TestData"   MsgBox "条件付き書式で1行置きにセルを着色します", vbInformation   Application.ScreenUpdating = False   ' 条件付き書式をセット   ActiveSheet.Cells.FormatConditions.Delete   With ActiveSheet.UsedRange.EntireRow.FormatConditions     With .Add(Type:=xlExpression, Formula1:="=(MOD(ROW(),2)=0)")       .Interior.ColorIndex = 34     End With     With .Add(Type:=xlExpression, Formula1:="=(MOD(ROW(),2)>0)")       .Interior.ColorIndex = 36     End With   End With   Application.ScreenUpdating = True End Sub ご提示のコードで言えば、一行ずつ色を変えてくのではなく、   1. 一度最終セルまでの全体を色1で着色   2. For~Next を使って 1行飛ばしで色2で着色 とすると結果は同じでも、低速な Range オブジェクトへのアクセス数が約半分 に減らせますよ。 Sub Sample2()   Dim lLastRownum As Long   Dim i      As Long      ' テストデータをセット   Cells.Delete   Range("A1:A15000").Value = "TestData"      MsgBox "全体を着色してから1行置きに着色し直します", vbInformation      Application.ScreenUpdating = False   lLastRownum = Cells(Rows.Count, "A").End(xlUp).Row   Range("A1", Cells(lLastRownum, "A")).EntireRow.Interior.ColorIndex = 34   For i = 1 To lLastRownum Step 2     Rows(i).Interior.ColorIndex = 36   Next i   Application.ScreenUpdating = True End Sub

uran-1007
質問者

お礼

回答ありがとうございます。柔軟な発想力見事です。恐れ入りました。

その他の回答 (9)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.10

#01です。マクロのUPありがとうございました。 少し目先を変えてみました。15,000行でも一瞬で終わると思います。 ただし行数が1行しか無いときなどのエラー処理は入れていません。 Private Sub CommandButton1_Click() Dim IRO_1 As Integer Dim IRO_2 As Integer  IRO_1 = TextBox1.Text  IRO_2 = TextBox2.Text  Range("A1").Interior.ColorIndex = IRO_2  Range("A2").Interior.ColorIndex = IRO_1  Range("A1:A2").Copy  Rows("1:" & Range("A65536").End(xlUp).Row).Select  Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _   SkipBlanks:=False, Transpose:=False  Application.CutCopyMode = False End Sub

uran-1007
質問者

お礼

回答ありがとうございます。色々な手法がありますね。条件付書式初めて知りました。勉強になります。

  • taocat
  • ベストアンサー率61% (191/310)
回答No.8

こんばんは。 原因は、Select。 行Select,色付け、行Select,色づけ・・・ おい、おい、という感じでCPUが慌てふためいて・(^^;;; 今回のような場合はSelectは必要ありませんので外しましょう。   -------------------------------------------------------- Private Sub CommandButton1_Click()  Dim IRO_1 As Variant  Dim IRO_2 As Variant  Dim i As Integer  Dim WK_RESULT As Integer  IRO_1 = Val(TextBox1.Text)  IRO_2 = Val(TextBox2.Text)  i = 1  Do While Cells(i, 1) <> ""    WK_RESULT = i Mod 2    If WK_RESULT = 0 Then      Rows(i).Interior.ColorIndex = IRO_1    Else      Rows(i).Interior.ColorIndex = IRO_2    End If    i = i + 1  Loop End Sub ------------------------------------------------------- これに限らず、不要なSelectはしないようにしましょう。 以上です。   

uran-1007
質問者

お礼

回答ありがとうございます。最小限での修正、的確なアドバイス、感服いたしました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。 >タスクマネージャのCPU使用率は100%になってます。 あながち、CPU使用率の一瞬100%になる場合は気にしなくてよいのですが、ブックのOLEやDDEの問題とかありますので、ずっと、そのままになってしまう場合は、そういう他とつながっているものを疑ってよいと思います。 また、Excel2000 ということですと、配列数式の累計演算セル数の約5,500個を越える部分に、エラーを起こす元があるようですから、数式には気をつけたほうがよいです。また同様に、書式も、累計数の問題でエラーがありますから、このような、一個ずつ色づけする方法は、あまり芳しくありません。まとめて色を塗るというのが鉄則です。しかし、それでも、1.5M ファイルサイズがあって、なお、列全体に色をつけてしまうというのは、書式を使って範囲を広げることですから、全体的なワークシートの使い方の考え方としては無理があります。 とはいえ、このような場合は、AutoFilter などを使うと良いようです。なぜか、負担が少ないようです。ともかく、以下で試してみてください。 なお、変数 i  は、Long型です。 '--------------------------------------------------------------- Private Sub CommandButton1_Click() Dim Iro_1 As Integer Dim Iro_2 As Integer Dim i As Long On Error GoTo ErrHandler Iro_1 = TextBox1.Text Iro_2 = TextBox2.Text Application.ScreenUpdating = False With ActiveSheet   i = Range("A65536").End(xlUp).Row   With .Range(.Cells(1, 256), .Cells(i, 256))     .FormulaLocal = "=MOD(ROW(),2)"     .AutoFilter Field:=1, Criteria1:="0"     .EntireRow.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = Iro_1     .AutoFilter Field:=1, Criteria1:="1"     .EntireRow.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = Iro_2     .AutoFilter     .ClearContents   End With End With Application.ScreenUpdating = True Exit Sub ErrHandler:   MsgBox Err.Number & ": " & Err.Description End Sub

uran-1007
質問者

お礼

回答ありがとうございます。コピーさせてもらい実行したのですがちょっと上手くいきませんでした・・・ちょっと間違えたかもしれませんが・・貴重なご意見参考にさせてもらいます。

回答No.6

Ano4です。 (;¬_¬) ぁ ゃι ぃ を取り消します。(^^ゞ 実際にソースを貼り付けて実行して見ました。 IRO_1 = 2 IRO_2 = 4 に変更して、   i = i + 1   DoEvents Loop End End Sub とLoopの前に DoEvents と End Subの前に End を付けて実行しました。 問題なく1行置きに色がつきましたねぇ・・・ 但し、3000行までで、700Hzの5年ほど前のノートPCです。 という事で、ソースは問題ありません。 という事は、メモリは大丈夫ですか?いくつを積んでいますか?

uran-1007
質問者

お礼

回答ありがとうございます。多くの方に教えていただき、無事解決致しました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

1セルごとに、同じにしろ、違うにしろ、条件付書式を多数セルに設定すると、メモリを食うというのを読んだことがあります。上限もあったように記憶します。 小生はInsideエクセルは不確かですが、1セルもRangeで1つですが、それに対O応する書式をメモリに網羅して記憶するはずで、記憶単位はRangeだと思うのです。 (1)なるべく同じ条件付き書式なら、セル範囲で設定する。 (2)データ内容の変化に瞬時にたいおうできないが、書式をV条件をVBAで切り分け、対応した書式をVBAで設定するのはどうでしょう。 (3)(2)を進めてChangeイベントでデータの変化を捉えたとき (2)と同じ判別と書式設定のルーチンを通す のはどうでしょう。

uran-1007
質問者

お礼

回答ありがとうございます。多くの方に教えていただき、無事解決致しました。

回答No.4

ここはソース公開が手っ取り早いですね。 自分も他の方もソースが(;¬_¬) ぁ ゃι ぃ と睨んでいます。 ソースに問題が無ければ、別の方向に目が向けれますしね。

uran-1007
質問者

補足

ANO.1にソースを貼り付けて見ましたのでお願いします。

  • starsip
  • ベストアンサー率36% (22/60)
回答No.3

一番良いのは最新のマシンに 替える事でしょうか? CPUが100%超えているという事ですよね。 私もExcelを使っていますが、私事で言えば 自宅の2000と会社の2003では機能が違うし、 自宅のADSLと会社のCATVでは速度も違います。 私は判っている(つもりです)ので もし、自宅が固まっても問題ありません。 (判ってます・・PC古いし、速度も出ないし・・ 固まった場合の対処とか・・)) 固まるのがいやであれば、とりあえず一番いい方法は 最新マシンを購入でしょうか。 私もお金さえあれば、最新PC購入が夢ですね。

uran-1007
質問者

お礼

回答ありがとうございます。 EXCEL2000なのですが、会社のPCで結構新しいものなのですが・・・ 何回か実行して385件目とか392、400位とか400件前後で必ず固まるんです。件数少ない時は正常に終わっていたはずなんですが。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

>単純な1行おきに色を付けるマクロなのですが、 条件付き書式を使うとか、2行選択して書式のコピーしたほうが早い気がしますが... >実行すると400件位は処理するのですが、そこで固まってしまいます。 マクロのコードが分らないと適切な回答は付きませんよ。 現状で考えられるのは、変数が多すぎるとか、ループの仕方に問題があるとかですが... >1.5MB のデータで15000件位あります。 >タスクマネージャのCPU使用率は100%になってます。 とりあえずでなら、ブックをコピーして500件位で試してみて同じ症状がでるか確認してください。 そこででないならメモリ容量の問題の可能性が高いです。 逆に同じ症状があるなら、マクロのコードに無駄・無理があります。 その場合は補足にでもコードを公開して確認できるようにしてください。

uran-1007
質問者

お礼

回答ありがとうございます。多くの方に教えていただき、無事解決致しました。

uran-1007
質問者

補足

ANO.1にソースを貼り付けて見ましたのでお願いします。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

「固まる」とありますがCPU使用率が100%だとすると固まっている(フリーズしている)のではなくループしている可能性もありますね。 ループの終了判定にIntegerの変数を使用して、桁落ちしたりしていませんか? マクロを補足に掲載してみれば具体的な回答が得られるかもしれませんよ。 なお1行おきに色を付けるだけなら条件付き書式で「=MOD(ROW(),2)=0」という式を使って、書式で背景色を指定すれ方法でも実現できます。

uran-1007
質問者

補足

フォームを使っていてボタンを押下するとこんな感じなのですが・・・ Private Sub CommandButton1_Click() Dim IRO_1 As Integer Dim IRO_2 As Integer Dim i As Integer IRO_1 = TextBox1.Text IRO_2 = TextBox2.Text i = 1 --------Do While ActiveSheet.Cells(i, 1) <> "" -----------WK_RESULT = i Mod 2 -----------If WK_RESULT = 0 Then --------------ActiveSheet.Rows(i).Select -----------------With Selection.Interior ----------------------.ColorIndex = IRO_1 ----------------------.Pattern = xlSolid ----------------------.PatternColorIndex = xlAutomatic -----------------End With -----------Else --------------ActiveSheet.Rows(i).Select -----------------With Selection.Interior ----------------------.ColorIndex = IRO_2 ----------------------.Pattern = xlSolid ----------------------.PatternColorIndex = xlAutomatic -----------------End With -----------End If -----------i = i + 1 --------Loop End Sub

関連するQ&A

  • IE6を最初に起動すると「応答無し」になって、しばらくすると「実行中」になる。

    WindowsXPを使っています。ウィルスソフトはマカフィーインターネットセキュリティーです。InternetExplore6を最初に起動するとCPU使用率が100%になりタスクマネージャのアプリケーションタグで「応答無し」の状態が表示され、しばらくしてから「実行中」に変わりhomepageが表示されます。また、ポップアップなどで2つ目のページを開くときもタスクマネージャでそのタスクが2行になって表示され状態が「応答無し」になり、しばらくしてからタスクが1行になって「実行中」になりページが表示されます。いくつかのウィンドウが開いているときは日本語入力ができないときもあります。タスクマネージャのプロセスタグでこのようなときの状態を見ると「iexplore.exe」が3つありその中の1つがCPUの数値が大きくなっています。「解決法を教えていただけませんか? FireFoxでは初回からまったく問題なくページを開けます。

  • EXCEL VBAマクロの実行優先度を下げたい

    いつもお世話になっております。 EXCEL VBAであるマクロを実行させています。 このマクロは終了するのに丸1日以上掛かるもので、それを実行している間、EXCEL.EXEのCPU使用率が100%になってしまいます。 私の所有するPCパワーが乏しい&所有PCが1台だけのため、このマクロを実行している間、EXCEL以外の他の作業の動作がとても遅くて困っています。 例えば、テキストエディタで文字を打って変換するのに数秒かかったりします。 タスクマネージャでEXCEL.EXEのプロセス優先度を下げることができるのは知っていますが、以前別のマクロでそれを実行して他の作業をやっていた時にEXCELが強制終了された経験があり、私のPCではタスクマネージャによるプロセス優先度の変更はシステムが不安定になることに繋がるようです。 ですので、できることなら、実行中のVBAマクロのみ優先度を下げたいんですが、そのようなことは可能なのでしょうか。 よろしくお願いいたします。

  • マクロを組んだエクセルの動作が遅い

    OS: Windows 2000 マクロを組んだエクセルの動作が非常に、異常に遅いのです。 マクロを組んでいないエクセルはすぐに起動でき、すぐに印刷、終了ができるのですが、 マクロを組んでいるエクセルは起動するのに1~2分、印刷も終了も同じく遅いのです。 また、マクロを組んでいるエクセルを開く際に、タスクマネージャでCPU使用率を見て みると、必ず100%になっているんです(マクロを組んでないものは100%までいかない)。 日に日に動作が遅くなっているように感じ、とても困っています。 ご教授ください。m(__)m

  • EXCEL2000 VBA Core2Quadの4つのコアをすべて使ってマクロを実行したい

    いつもお世話になっております。 タイトルの通り、EXCEL2000 VBAでCore2Quadの4つのコアをすべて使ってマクロを実行したいのですが、可能でしょうか。 これまでPen4 1.51GHzのPCを使っていたのですが処理速度が遅いため、新しくCore2Quad搭載のPCを購入しました。 旧PCで処理に長時間掛かるマクロを実行したところ、CPU使用率25%となっており、タスクマネージャで確認したところ1つのコアしか使っていないようです。 せっかく高いお金を出して購入したのにこれでは宝の持ち腐れです。 よろしくお願いいたします。

  • エクセル マクロ たまに固まる!

    超初心者です。よろしくお願いします。 最近マクロに興味を持ち始めたのですが、たまに実行するとエクセルが固まって閉じられなくなるときがあります。確か「なんとかの情報をなんとかしています。この処理には数分かかります。」みたいなメッセージが出ていたような気がします。 タスクマネージャのアプリケーションからも終了できず、プロセスから終了すると閉じることができました。これは防ぐことのできないトラブルですか?

  • 実行タスクの経過時間を知る方法

    WindowsServer2003です。 実行中のタスクをタスクマネージャーのプロセスで見ると、 CPU使用率や、メモリ使用量はわかりますが、 実行開始してからの経過時間まではわかりません。 調べる方法はありませんか? よろしくお願いします。

  • エクセルのマクロで実行したいです!

    こんにちは。エクセルのマクロで実行したいことがあります。 周りに聞く人もいなくて困っています。 エクセルのデータがあり、売上の集計をしないといけませんが、 その前にデータを整える必要があります。 A列の10000000番代以上で会社によって固定の値となります。 A列の1~1005番までが担当コードでその横が(B列)担当者名になります。 実行したいマクロは、サンプルとしてF列~L列に表示しておりますが、 実際は、A列~G列に実行します。 またB列の【不良代替】とある文字、及び【小 計】の行は削除します。 また区分(B列に挿入)には「0」か「1」の数値が入りますが、 それは後にVLOOKをあてるので、問題ないです。 マクロ実行後に、いろいろな会社がありますが、支店も本店(何も記載なし)も 別の列でいいので、例えばI列などに合わせて合計を表示したいです。 名称が色々あるため、一社一社数えると日が暮れてしまいます。 それをマクロで記載するのはできますでしょうか。 ピボットテーブルは使わない方向で行きます。 可能な限りマクロで実行したいので、ご存じの方がいらっしゃれば、 ご教授頂きたいです。宜しくお願いいたします。

  • Excel マクロ SQL実行について

    いつもお世話になっております。 現在、Excel1997と2007でマクロを作成しております。 使用している環境は様々でOSは2000~XPまでです。 っで質問なんですが、「マクロ」というシートと「データ」というシートがあったとして、「マクロ」シートにはボタンがあり、ボタンを押すとマクロが実行します。 マクロが実行されると「データ」というシートにあるデータをマクロ内のSQLで集計して、新しい「出力」というシートに吐き出します。 現在マクロ内のSQLはDAOライブラリを使用しています。EXCELマクロ内でSQLを使用する場合にDAOやADO等のライブラリを使用せずにSQLを実行することは可能でしょうか?

  • タスクスケジューラに登録したタスクの実行優先度を上げたい

    Excel-VBAで作成したデータ処理プログラムを, タスクスケジューラにて定時実行させてるのですが, 処理が遅くて苦慮しています。(OS:Win2000Server) 単独実行だと5分(CPU使用率max100%)で完了するものが, タスクスケジューラからの実行だと30分(CPU使用率10%以下)もかかります。 タスクスケジューラへ登録したタスクの優先度を上げる術はないものでしょうか。

  • Excelマクロ が重いときと重くないときがある

    ボタンをクリックすると、 1、新しいブックを作成して、 2、ボタンのあるブック(元ブック)のデータの必要なものだけをコピペして、 3、オフセットを使用して、一定間隔で罫線を引く。 というマクロが組んであります。 その、元ブックのみが開いているときは瞬間で終わる処理が、 別ブックが開いていると、処理がとても遅くなります。 しかもその別ブックというのが、 特に元ブックとは関係のないもので、 マクロも組んでないものなんです。 また、その別ブック以外のブックは、 開いていても問題なく、早く処理してくれるのですが、 その別ブックが開いているときだけ処理が遅くなります。 マクロを実行しているファイルとまったく関係のないブックでも 開いていると、マクロの実行速度が遅くなることがあるのでしょうか。 ご存知のかた、みえましたら、 ご教授願います。

専門家に質問してみよう