人に聞けない痔の悩み、これでスッキリ >>

ExcelVBAが、あとどれくらいで終了するか処理経過をリアルタイムにグラフもしくは%で表示させたいのです。

当然、ForやLoop処理などもあるので、何度、繰り返されて、どのくらい時間がかかり、後、どのくらいで終わるのかは、条件によって異なってくると思うので、自分で判定させるようにしなければならないかとは思っていますが・・

ソフトのインストーラーみたいな感じにヴィジュアル的に経過表示をさせたい(%での表示でも良いです)のですが、何か良い方法はありますでしょうか?

ご教授いただけると幸いです。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんにちは。


http://www.h3.dion.ne.jp/~sakatsu/ProgressBarTop …
こちらを参考にされると良いと思います。
    • good
    • 0
この回答へのお礼

このサイト、なかなか参考になりそうです!
早速、試してみたいと思います。
ありがとうございました。

お礼日時:2007/07/24 14:38

2-3日前にもプログレスバー関連の質問で、横道に議論が行っていたと思うが、素人的に、この質問に疑問におもい、下記のことの方が重要なのでないかと思って書きます。


所要時間がわかれば、プログレスバー、やステータスバーやグラフ
的にでも表示できると思う。
あるプログラムを実行して、終わるまでの時間は
(1)CPUの処理速度
(2)OS
(3)インタープリターかコンパイラーか
(4)処理ロジックの組み方・利用ファイルシステムの違い
(5)入出力装置の入出力能力、そのドライバーソフトの処理具合
(6)他の同時に走っている処理プログラム、その数
(7)処理タスクの優先度設定(どのタスクの優先度を上げるか
オペレーターが介入できるOSあり)
(8)そのコンピュターのメモリなどリソースの多少
(9)メモリのごみやディスクの記録状況(Defrag的なこと)
などなどで左右されると思う。
それで正確には処理完了時間は実行して見るまでわからないと思う。
それが判らないと、
・動いてます
・時間が経ってます。経過時間が増えてます。
の表示になってしまう。これも大切と思うが。
ーーー
それで
(1)経験的に過去に複数回時間を計って(上記1-7は自分のパソコンの場合と仮定して)大体の平均時間を出す。
それでスタートから現時点までの経過時間を割って、比率を出し表示する
(2)既回答で紹介のあるページの例にあるが、プログラムのコードを見て多数回繰り返しがあり、その処理時間が、全体のメインを占めると考えた場合は、今まで完了した繰り返し回数/全繰り返し回数を途中処理済割合として、コントロール等に通常長さで表示する。
ーー
ですから
(1)・上記(1)の時間の見積もり
   ・スタートから現時点までの経過時間を出すコード
   ・プログレスバーコントロールのインストールと
   ・長さ設定の仕方  
    のコードを勉強する
(2)処理時間がかかりそうな、繰り返しを見つける。
   その何分(10,100,1000分の1とか)の経過ごとに
   バーの表示更新の処理に飛ぶやり方の勉強
ということになるのでしょうか。
    • good
    • 0
この回答へのお礼

エクセルシート上にある抽出データの量によって、また、実行されるPC環境によって、大きく割合が変わってくると思われますので、あらかじめ比率を出しにくいのですが、参考にさせていただきます。
取り合えず、シート上の行数を1行づつ、なめていくので、処理済行数/総行数で、割合を表示させることとしました。
ありがとうございました。

お礼日時:2007/07/24 14:44

M$のページに例があります。



[XL] ユーザー フォームでプログレス バーを表示する方法
http://support.microsoft.com/kb/211736/ja
    • good
    • 0
この回答へのお礼

MSのサイトですね。
ぱっと見、わかりにくそうですが、良く読んでみたいと思います。
ありがとうございました。

お礼日時:2007/07/24 14:39

取り合えずなら、


Application.Statusbat="10%"
とか
    • good
    • 0
この回答へのお礼

Application.Statusbatではなくて、
Application.StatusBarですよね?
取り合えずで用いたあと、徐々に高度にしてみたいと思います。
ありがとうございました。

お礼日時:2007/07/24 14:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q経過時間を表示したい

現在の時刻と開始時刻から、経過時間を表示したいです。
現在の時刻は16時30分だったら、16:30
開始時刻は12時15分だったら、12:15という変数があります。
答えで4:30という数字が欲しいです。
経過時間は24時間以下を考えれば良いです。

Aベストアンサー

No1の者ですが
A=CDate(Time)-CDate(Time_Start)
の結果、Aが小数になってしまうという問題についてです。

変数Aの型が何になっているのか謎ですが「答えで4:30という数字が欲しい」ということなのでNo2さんの回答のようにformat関数を使うと簡単です。

A=Format(CDate(Time)-CDate(Time_Start),"hh:mm")

format関数が邪魔であれば変数AをDate型で定義してやればよいかと思います。


ちなみに変数Aに小数が入っていることについてですが、VBの日付型というのは整数+小数で管理しており、整数部で日数を、小数部で時間を管理しています(Excelなどで日付を入力したセルを数値表示すると分かると思います)。今回は日数はゼロですので0.xxxという小数が変数Aに入ってきます。

QVBAでリアルタイムで計算結果をグラフに表示

Excel2010でVBAを使っています。


30分くらいかかる計算があるのですが、
計算が終了するまで待っていたのでは、計算結果がどのようなものになるのか分からないため
リアルタイムで計算結果をグラフに表示してくれるプログラムを書きたいと考えています。


検索したところ、
http://www.johoka.net/vbsin.htm
VBの場合には、Picture1.Line を使えば、うまくいきそうだということが分かりました。
同様のことをVBA上でやりたいのですが、
http://pasokoma.jp/xp_bto/a_333563
のページにはVBAにはそのような機能はないと書かれています。

本当にユーザーフォーム上でグラフを表示させることはVBAではできないのでしょうか?


http://www.asahi-net.or.jp/~zn3y-ngi/YNxv9d92.html
そのほか、シート上でのグラフを画像として表示させるという方法も見つかりました。
この方法でリアルタイムで計算結果を表示させるにはどうしたら良いですか?

Aベストアンサー

#3です。
下記の様なコードで普通にグラフは書き換わりますので、何が問題なのかわかりかねます。

☆ワークシートモジュールに記載、コマンドボタンを2個もうけている。
Dim stopFlag As Boolean

Private Sub CommandButton1_Click()
Dim i As Long
Dim j As Double

stopFlag = False
i = 1
Do While Not stopFlag
j = i ^ 2 + 3 * i + 4
  ’グラフのデータ範囲のセル一個だけ変更している
Me.Range("B3").Value = j
i = i + 1
DoEvents: DoEvents: DoEvents
Loop

End Sub

Private Sub CommandButton2_Click()
stopFlag = True
End Sub

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング