- ベストアンサー
エクセルマクロで教えていただきたいです。
ある処理プログラムをつくりました。 同じ処理を数千行にわたって繰り返すのですが、一瞬では到底終わらないため「進捗状況」を表示させたいと思うのですが、何かよい方法はございませんでしょうか。 「現在○○行を処理しています」なんていうメッセージが出せればいいかななんて考えてます。 Msgboxを使用することも思いついたのですが、これだと何かしらボタンを押さないと次へ進まない(と思っていますが違います?)ので自分の意図することと違うなぁという感じです。 よい方法教えてください。よろしくお願いします。 Windows98SE、EXCEL2000を使用しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Application.Statusbar="現在" & cnt & "行目…" とすれば、ステータスバーにメッセージが表示されます。 最後は Application.Statusbar=False で元に戻ります。
その他の回答 (4)
- diashun
- ベストアンサー率38% (94/244)
#2です。 「ラベルコントロール」はVBAのコントロールのひとつで、デフォルトではExcelメニューバーには表示されていないので、次の手順でツールバーに貼り付けてください。 1.メニューバーの「ツール」→「ユーザー設定」をクリックし「ユーザー設定ダイアログ」画面を表示。 2.「ツールバー」タブで「コントロールツールボックス」にチェックを入れる。 3.「閉じる」ボタンをクリック。 以上で「コントロールツールボックス」が表示されます。 そのボックスの中に「A」で表示されているのが、「ラベル」コントロールです。 文字通り、テキストを表示するためのコントロールで、フォントの種類、文字の大きさ、色の設定など各種プロパティが設定できます。 これを仮に「Workbook」の「Sheet1」に貼り付けた場合、VBEのSheet(1)オブジェクトとして指定するには、Sheet1のコード表示画面で、 「ThisWorkBook.Sheets(1).Label1」(デフォルト)で指定しプロパティ設定できます。また、これらのコントロールは印刷せずにSheet上で表示するだけにしたりすることも出来ます。
- imogasi
- ベストアンサー率27% (4737/17069)
VBではプログレスバーというコンとロールがありますが、エクセルVBAでは使えるかどうか判らないので、テキストボックスとラベルコントロールで代用してみます。 Sheet1において、 メニュバー部の余白で、マウスの右クリックをして 「コントロールツールボックス」をクリックする。 テキストボックス(アイコンはab|)のアイコンをクリックしてSheet1へ貼りつける。 またラベル(アイコンはA)のアイコンをクリックしてSheet1に貼りつける。 この2つのコントロールの高さサイズを同じに調整し、また左辺同志を重ねる(同位置)ように位置づける。 ラベルの上で右クリックしプロパティウィンドウを出し、Caption(Label1となっている)をDELキーで削除し、BackColorをその行の右欄右の方でクリックしてパレット・タブを選び、色を選択強して色パレットをクリックする。 もう一つコマンドボタンを貼りつける。 Sheet1のコマンドボタンをダブルクリックすると VBE画面に飛び Private Sub CommandButton1_Click() End Sub がVBE画面に現れるから、そこに下記を貼りつける。 Private Sub CommandButton1_Click() Sheet1.Label1.Visible = True Sheet1.TextBox1.Visible = True For i = 1 To 1000 Sheet1.Label1.Width = Sheet1.TextBox1.Width * i / 1000 If i Mod 100 = 0 Then Sheet1.Label1.Caption = Int(i / 10) & "%完了" End If Next i Sheet1.Label1.Visible = False Sheet1.TextBox1.Visible = False End Sub VBE画面の実行-デザインモードを脱し、Sheet1の画面に戻り、コマンドボタンをクリックして見てください。 進行状況が図示表示されます。 コマンドボタンは、テストをして見てもらうキッカケのためで、本番では要りません。 上記コードの主要部をご質問者の処理ループの中にいれてください。 Visible関係はループに入る前と脱出後にいれてください。 (私のパソコンは旧式CPUですので、テストしてみるには丁度適度の速さでしたが、速いCPUのパソコンでは1000を増やす(3箇所変更要)とゆっくりになるのではと思います。) Sheet1.Label1.Caption = Int(i / 10) & "%完了"は 別のラベルを直下貼りつけ、そこで表示するほうがよいかも。はじめの時文字が全部は出ないなどのことに気づきましたが、説明を短くするため上記のままとしました。
お礼
ご丁寧な説明をありがとうございます。 なんか高度そうですね!でもこれができたらもっとカッコイイかも! やってみます!ありがとうございました。
- diashun
- ベストアンサー率38% (94/244)
処理する行数を求める関数を作り、適当な行数処理毎にエクセルシートの適当なセル、またはラベルコントロールなどを表示させて、「現在○○行を処理しています」等というメッセージを表示してはどうでしょう。 これだとメッセージボックスのようにボタンを押して作業を中断することはありません。 <コーディング例> Option Explicit Sub メッセージ表示(lngCnt As Long) Application.ScreenUpdating = False ThisWorkbook.Sheets(1).Activate Select Case lngCnt Case 1000 Range("D3") = "現在 " & lngCnt & " 行を処理しています。" Case 2000 Range("D3") = "現在 " & lngCnt & " 行を処理しています。" Case 3000 Range("D3") = "現在 " & lngCnt & " 行を処理しています。" Case 4000 Range("D3") = "現在 " & lngCnt & " 行を処理しています。" Case 5000 Range("D3") = "現在 " & lngCnt & " 行を処理しています。" End Select End Sub 「lngCnt」(処理行)を引数にしています。 この引数を渡す処理は出来ますでしょうか?
補足
ありがとうございます。 ラベルコントロールって何でしょうか。 よろしければご教示ください。 よろしくお願いします。
- capa0218
- ベストアンサー率24% (54/222)
同じ処理を繰り返すって言うのは ループを使っているのでしょうか? 何処かのセルに 処理ごとに”現在○○行を処理しています”って入れる ではダメでしょうか? 同じセルに入れていくようにすれば カウンターのように見えると思いますよ
お礼
ありがとうございます。 おっしゃる通り、この方法でいけますね! でももうちょっと欲を出して、ウィンドウを開いてかっこよく(?)してみたい気がします。 ありがとうございました。
お礼
あ!いいですね、コレ! 単純で、しかもカッコイイ(?)・・・ 私が思い描いていたのに近いように思います。 使わせていただきます。 ありがとうございました。