今だけ人気マンガ100円レンタル特集♪

いつもお世話になっております。
経過時間(秒)の数値表示でも、プログレスバーの表示でも良いのですが
可視化したいのです。
VBAの進捗表示は可能ですが、その中でVBA以外の処理に依存中は進
捗状況の表示処理も中断されてしまいます。
具体的には、VBAの一連の処理の中でPDFをエクセルに変換する処理
が含まれますが、この処理が一番時間がかかり、その進捗状況もリアルタ
イムで可視化できればと思っています。
他のアプリが動作中も、強引にVBAの中で動くことのできるタイマー処
理などがあればと可能だと思うのですが、知識がありません。
その他良い方法があればご教示いただきたいと質問させていただきました。
よろしくお願いします。

質問者からの補足コメント

  • つらい・・・

    お礼の文に誤りがありました。
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePD・・・・・・・
    は、エクセルをPDFに変換する処理の部分でした。
    (本プロセスには、この処理もあり、同じく時間がかかるため同様に進捗状況を
    しりたいのですが)
    PDFをエクセルに変換する部分は
    lRet = objAcroAVDoc.Open(PDF_NAME, "")
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()
    Set jso = objAcroPDDoc.GetJSObject
    jso.SaveAs PDF_NAME, "com.adobe.acrobat.xlsx" でした。
    各行の所要時間をしらべて、均一であれば各行間に、進捗可視化処理を挿入してみます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/04/07 12:18
  • つらい・・・

    試してみました。
    jso.SaveAs TEMP, "com.adobe.acrobat.xlsx" で1番時間を要しており
    5秒程度かかっていました。この5秒間の時間の経過も可視化できればと思
    っています。

      補足日時:2018/04/08 08:16

A 回答 (5件)

Acrobat を COM で呼び出して処理させているのですね。


Acrobat が途中経過を呼び出し側に出力する仕様になっていない以上無理だと思います。

呼び出し側の VBA でできることと言えば、処理する 「何か」 の単位に対するステップ数の進捗表示ぐらいかと。
進捗表示させたい工程にどんな処理が含まれているのかわかりませんが、例えば単純に 「とあるフォルダーにある PDF ファイル群をすべて Excel ファイルに変換する」 だったら処理対象のファイル数が分母になり、1ファイル終わるごとにカウントアップするとか。
    • good
    • 0
この回答へのお礼

ご指導ありがとうございます。
おっしゃる通りで、Acrobatへ処理を投げたステップで、その処理が終わるまで
VBAでは次のステップへ進まないのが、問題なのです。
そこで、先にタイマーを起動しておいて、そのあとでPDF→EXCEL変換処理を行う
ことができないかと思っています。
昔VB6の時代ではTimerコントロールを使ったことがありましたがVBAにはTimer
コントロールはありませんね。
またAPIのtimeSetEventを使って、試してみましたが、うまくいったり、フリーズ
したりと、極めて不安定で使い物になりませんでした。
他に方法がないものかと、博識な皆様のご意見・ご指導を仰ぎたくお願いいたし
ます。

お礼日時:2018/04/10 20:45

お疲れさまです。


なかなか大変ですね。

ご質問者さまは、ステータスバーや、ユーザーフォームとかでストップウォッチの様なものは作成できますでしょうか?

もし作成ができれば、それも動かしながら、PDF変換マクロを実行すれば良いと思います。

もし、変換処理でメモリを食ってしまい、ストップウォッチのカウントアップもされなくなってしまう場合は、別の手段が必要です。

また、ご連絡頂ければと思います。
    • good
    • 1

お疲れさまです。


毎回決まって5秒でしたら5秒のカウントダウンをステータスバーに表示すればよいと思います。

PDFファイルによって秒数が変わるとカウントダウンは厳しいので経過時間を秒数で表示させ、その処理が終了したらカウントアップを中止するとともにステータスバーの表示をやめればよいと思います。

頑張ってください!!
    • good
    • 0
この回答へのお礼

再度のご指導ありがとうございます。
変換所要時間は、PDFファイルのザイズによって大きく異なります。

>PDFファイルによって秒数が変わるとカウントダウンは厳しいので経過時間を秒数で表示させ.......

変換中は経過時間も表示させることができません。変換中も経過時間をリアルに表示できればいいのですが.......。

お礼日時:2018/04/08 12:36

お疲れさまです。



 PDFをエクセルに変換する処理をどの様に記述しているかわかりませんが、
 もし、単一の命令で一気に処理を投げかけその処理が終了するまで待っているのであると
 プログレスバーや、経過時間を表示させるのは厳しいかもしれません。

 私は、長い処理を行う時は、処理をステップに区切り、ステータスバーにステップ1経過時間●●分の様に
 表示させています。
 これは、例えばですが、STEP1開始時のシステム時刻を変数に格納し、表示させる直前のシステム時刻から
 引かせて表示等をさせていますが、どこにこの記述を埋め込むかは、プログラムの作りで違ってきます。
 
 これも、処理が細切れでところどころにスクリプトが記載できることが前提ですので、ご了承ください。
この回答への補足あり
    • good
    • 0
この回答へのお礼

さっそくのご指導ありがとうございました。
おっしゃる通り、PDF変換は、次のような処理でおこなっております。
Sheets("XXXX").Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePD・・・・・・・
なので、区切りに可視化のための処理を組み込むことができないのです。
この変換処理中も、処理を強引に横取りできるタイマー処理のようなものが
VBAで存在していればいいのですが。

お礼日時:2018/04/07 11:50

市役所などの自治体で行っているパソコン相談で相談したほうが良いと思います。

    • good
    • 0

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

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

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

Qエクセルマクロで進捗状況を表示させたい

いつもお世話になります。こんなことできますか?

プログラムの進捗状況を表示させたいのですが、
ステータスバーの表示だと隅っこの方ですし、表示も小さいので、画面の真ん中にメッセージウィンドウを出せないかななんて考えてます。
進捗状況は刻々と変わるので、Msgboxだといちいち「OK」を押さないといけなくなり実用的ではありません。

画面真ん中に表示する方法、何かいい方法ありませんか。

Aベストアンサー

ステータスバーに表示させるにが一番簡単な方法なのですが、お気に召さないのであればその次に簡単な方法を。

1.現在のシートとは別に表示用のシートを作成します。
2.表示用のシートのまんなかあたりのセルに、ステータスバーに表示させる進捗状況をセットします。
3.マクロ作動中は常に表示用シートをアクティブにして見せておくようにします。

これでOKですね。

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
...続きを読む

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に入ってきます。

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

Qexcel VBA プログレスバーについて(初心者)

VBA初心者の質問です…
excelで入力されている値を用いて、グラフ作成する簡単なデータを作りました。
特に問題なくグラフは出来たのですが、グラフ作成が1つではなく数個同時(順番)に作成しているため時間が掛かってしまいます。
この処理中にプログレスバーを表示出来ればと思い質問を致します。

私なりに調べ(goo内)下記サンプルを発見し、簡単なのでこれを使をうかと思うのですが、UserForm1の処理前にUserForm2.showだけでは
UserForm2の処理が終わらないと処理をしません…当然ですよね…
本当に初心者で申し訳ないのですが、UserForm1の処理最中にUserform2のプログレスバーを表示するのにはどうすればいいのでしょうか…

【サンプル】
Private Sub UserForm_Activate()

With Label1
.SpecialEffect = 2
.BackColor = vbBlue
www = .Width
.Width = 0
End With

For i = 1 To 1000
Me.Caption = i
Label1.Width = i / 1000 * www
Me.Repaint
Next

End Sub

また他におすすめなやり方があれば教えて頂ければ…
初心者な質問で申し訳御座いません。

VBA初心者の質問です…
excelで入力されている値を用いて、グラフ作成する簡単なデータを作りました。
特に問題なくグラフは出来たのですが、グラフ作成が1つではなく数個同時(順番)に作成しているため時間が掛かってしまいます。
この処理中にプログレスバーを表示出来ればと思い質問を致します。

私なりに調べ(goo内)下記サンプルを発見し、簡単なのでこれを使をうかと思うのですが、UserForm1の処理前にUserForm2.showだけでは
UserForm2の処理が終わらないと処理をしません…当然ですよね…
本当に初...続きを読む

Aベストアンサー

いいえ
☆下記のループに、入れては、だめです。
For j = 1 To 10000
Next
は、削除するか コメント行にしてください。


' ----------------------------------------------------
For j = 1 To 10000
'デバッグ用タイミング(実際はここに実行マクロを入れる)
↑↑
ここの部分に私で言うグラフ作成マクロを組み込めばいいのでしょうか?

Next
'-----------------------------------------------------
☆正確には、下記の中です。



' ----------------------------------------------------
'(実際はここに実行マクロを入れる)
' 例えば、
  Call グラフ作成処理プログラム
' とします。
'-----------------------------------------------------

また、
For i = 1 To cend
j = i / cend * 100
With UserForm1
.Label2.Caption = Int(j) & "%"
.Label1.Width = tsiz * j / 100
End With

の中の、cend = 1500 'デバッグ用数値を独自に設定する必要があるでしょう。
例えば、処理時間が、プログレスバーの最後にならない内に処理が終わってしまうとか、その反対にプログレスバーが、早く終わってしまうとかです。

私の場合は、処理する セルの数を算出して 設定しています。
参考として、変形させた コードを乗せます。
詳しいことは、省略します。[ ご自分で、考えてください。 ]


' 以下は 標準モジュールです。
Sub 123()
Dim tsiz As Integer, K As Integer, N As Integer
Dim Memorys As Long, Memorys_Cunt As Long, Memoryss As Long


Do
' 実際はここに実行マクロを入れる) 

Call My_Progress_bar(Memorys_Cunt, RoW, Memoryss)
Loop

UserForm1.Hide

End Sub


Function My_Progress_bar(I As Long, tsiz As Integer, cend As Long)

Dim J As Integer



J = I / cend * 100
If J >= 100 Then J = 100

With UserForm2
.Label2.Caption = Int(J) & "%"
.Label1.Width = tsiz * J / 100
End With

DoEvents

End Function
UserForm1.Show vbModeless


注意:これは、VBA には、プログレスバーの機能(コマンド)が、ないので、プログレスバー風に考えられたものです。

いいえ
☆下記のループに、入れては、だめです。
For j = 1 To 10000
Next
は、削除するか コメント行にしてください。


' ----------------------------------------------------
For j = 1 To 10000
'デバッグ用タイミング(実際はここに実行マクロを入れる)
↑↑
ここの部分に私で言うグラフ作成マクロを組み込めばいいのでしょうか?

Next
'-----------------------------------------------------
☆正確には、下記の中です。



' ----------------------------------------------------...続きを読む

QEXCEL あるセルに数字が入力されれば既存マクロ実行させたい

ボタン等のグラフィックオブジェクトのマクロ実行は簡単なのですが、
ある位置のセルにデーターが入力されれば、
既存のマクロを自動実行させることできますか?

Aベストアンサー

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
if Range(ある位置) <>"" then call 既存のマクロ名
End Sub

ある位置と既存のマクロ名を変更して使ってみてください。
あと このVBAは 操作するワークシートのほうに記述します。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QエクセルのVBA実行中の進捗バーについて

こんにちは!
エクセルのVBA実行中の進捗バーについて押し終えてください。
よくあるソフトのインスト時に表示されるインストの進捗バー?とほぼ同じ者をエクセルVBA実行時にもでるようにしたいのですが・・・
方法を教えてください。

Aベストアンサー

1、テキストボックス編。

テキストボックスのテキストに四角(黒ベタ)を予めセット。

Private Sub CommandButton1_Click()
  Dim I As Integer
  Dim L As Integer
  Dim T As String
  
  T = Me.TextBox1.Text
  L = Len(T)
  Me.TextBox1.Visible = True
  For I = 1 To L
    Me.TextBox1.Text = Left(T, I)
    Pause 1
    DoEvents
  Next I
  Me.TextBox1.Visible = False
End Sub

これで、1秒毎に、四角が1個増えていきます。
見ようでは、プログレスバーです。

2、プログレスバー編。

プログレスバーそのものを配置。
プログレスバーは、[コントロールの選択]をクリックして行います。

Private Sub CommandButton2_Click()
  Dim I As Integer
  
  Me.ProgressBar.Max = 20
  Me.ProgressBar.Left = 200
  Me.ProgressBar.Top = 200
  Me.ProgressBar.Visible = True
  For I = 1 To 20
    Me.ProgressBar.Value = I
    Pause 1
    DoEvents
  Next I
  Me.ProgressBar.Visible = False
End Sub

これでも、1秒毎に、バーが伸びていきます。
上記のコードをテストするには、下記のPause関数を標準モジュールに登録する必要があります。

Public Sub Pause(ByVal PauseTime As Single)
  Dim Finish As Single
  
  Finish = Timer + PauseTime
  Do
    DoEvents
  Loop Until Timer > Finish
End Sub

1、テキストボックス編。

テキストボックスのテキストに四角(黒ベタ)を予めセット。

Private Sub CommandButton1_Click()
  Dim I As Integer
  Dim L As Integer
  Dim T As String
  
  T = Me.TextBox1.Text
  L = Len(T)
  Me.TextBox1.Visible = True
  For I = 1 To L
    Me.TextBox1.Text = Left(T, I)
    Pause 1
    DoEvents
  Next I
  Me.TextBox1.Visible = False
End Sub

これで、1秒毎に、四角が1個増えていきます。
見ようでは、...続きを読む

QExcel2003 マクロの進捗を表示するマクロ

長い処理をするマクロで、処理がされているのかフリーズしているのかわからないようなものがあります。
全体の処理で2分ほどかかるのですが、(Core2Duo 2Ghz)この間、「処理しています」というような、インストールをする際に出てくるような処理工程を表示するようなマクロを作ることは可能でしょうか?

Aベストアンサー

こちらのページが参考になります。

プログレスバーコントロールで進捗状況を表示するには?
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv9g1810.html

QExcelVBAでBookを開く時にファイル名の一部だけを指定で

VBA初心者です。
ExcelVBAで決まったフォルダーのファイルを開きたいのですが、ファイル名が固定した文字+日付になっているため、この固定した文字だけでこのファイルを開く方法を教えて下さい。このフォルダーには2つファイルがありますが、もう1つは全く違うファイル名です。

Aベストアンサー

> ワイルドカード"*"はどんな時に使えるのですか

Dir関数を使用時の"*" (アスタリスク) および "?" (疑問符) のワイルドカード文字については、
VBAのヘルプを参照し、特に「使用例」のコードを理解してください。

その他 VBAでの ワイルドカード使用に関しては、ヘルプで Like で検索して、
Like 演算子 を参照し、同じく「使用例」のコードを理解されたら宜しいかと思います。


> 通常のOPENメソッドでの> ファイル名指定では使えないと思うのですが。

Workbooks.Openメソッドの1番目の引数は、ファイルが特定出来るように指定する必要が
ありますので、当然 ワイルドカード文字は、使用出来ません。

殆ど、フルバスで指定します。 もし、パス名を省略すると カレントホルダ内のファイルを
指定したことになります。([メニュー]-->[オプション]-->[全般]タブの中で指定)


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

人気Q&Aランキング