[[20180131072554]] 『プログレスバーを利用し、進捗を表示したいのです』(ayumi) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『プログレスバーを利用し、進捗を表示したいのですが...』(ayumi)

vba初心者になります。

このマクロ(標準モジュールで計算実行コマンドボタン)実行中に
プログレスバーを使用し、進捗を表示できればと思います。
ユーザーフォームにプログレスバーを設置し、標準モジュールコードを
あるサイトから取得しました。

それが、こちらになります。

Sub info表示()
Dim i As Long
info.Show vbModeless
For i = 1 To 30000
With info

     .ProgressBar1.Value = i
     .パーセント.Caption = Int(i / 30000 * 100) & "%"
     .Repaint
End With
Next i
info.Hide
MsgBox "処理が終了しました。"
Unload info
End Sub

過去の先輩が作成したvbaを以下に記述させて頂きました。
この計算実行時にプログレスバーで進捗を表示できたらと思うのですが、
「Sub info表示()」〜をどこにどのように組み込めばいいか全く分かりません...

教えて頂けないでしょうか?
不可能であればそういった回答でも構いませんのでご協力頂きたいと
思って投稿しました。

Sub 計算実行()
確認 = MsgBox("計算を実行します。よろしいですか?" , 4)

 Select Case 確認
 Case vbYes
 GoTo 継続
 Case vbNo
 End Select

End

継続:
Sheets("出力先").Select

'Sample time C2 ※指定数
'Data size C3  ※指定数
'データ(F2〜) ※9600固定

Dim inr(9600)
Dim fr(9600), fi(9600)
Z = Cells(2, "c")
n = Cells(3, "c")

For i = 0 To n - 1
inr(i) = Cells(i + 2, 6) '実測値取得
Next i
Pi = 3.14159265358979

'計算実行
For i = 0 To n - 1
sr = 0
si = 0
For k = 0 To n - 1
wr = Cos(2 * Pi * k * i / n)
wi = -Sin(2 * Pi * k * i / n)
sr = sr + inr(k) * wr
si = si + inr(k) * wi

Next k

fr(i) = sr '1
fi(i) = si '2

Next i

'Data Outデータ出力
For i = 0 To n - 1
Cells(i + 2, 9) = i / Z / n
Cells(i + 2, 10) = Sqr(fr(i) * fr(i) + fi(i) * fi(i)) / 4800

Next i

MsgBox "計算完了。"

End Sub

よろしくお願いします。

< 使用 Excel:Excel2013、使用 OS:Windows8 >


まず、info表示プロシジャを単独実行すると、バーが徐々に伸びて100%になるところは再現できていますか? Excel標準ではない、VB6のコントロールを貼らないといけなかったり、オブジェクト名を変えていたり、予めプロパティをセットしておく必要があったり、これを動かすまでにいろいろやらないといけなかったはず。 単独実行できるまでは、参照元を良く読んで、ご自分で対応してください。

そして、このプロシジャは、バーが進む様をデモしているだけであり、これを呼び出しても、ご自分の処理は何も進みませんので、これを組み込む、という考えが間違っています。 このコード内で使われている命令を、ご自分のコード内で使用する事になります。 はっきり言って、進捗状態表示に手間をかけると処理時間が延びるので、どうやって実現すればわからないくらいなら、そんな処理は書かない方が良いですよ。背伸びしすぎです。 更には、変数宣言を省略しているような手抜きコードは、他人に見せてはいけません。 普段から「変数の宣言を強制する」オプションをオンにしておくべきです。

 Sub 計算実行()
    Const Pi = 3.14159265358979
    Dim Z
    Dim n
    Dim i
    Dim sr
    Dim si
    Dim k
    Dim wr
    Dim wi

    If MsgBox("計算を実行します。よろしいですか?", vbYesNo Or vbQuestion, "確認") <> vbYes Then
        End
    End If

    info.Show vbModeless
    Sheets("出力先").Select

    'Sample time C2 ※指定数
    'Data size C3  ※指定数
    'データ(F2〜) ※9600固定
    Dim inr(9600)
    Dim fr(9600), fi(9600)
    Z = Cells(2, "c")
    n = Cells(3, "c")

    For i = 0 To n - 1
        inr(i) = Cells(i + 2, 6) '実測値取得
    Next i

    '計算実行
    With info
        .Show vbModeless
        .ProgressBar1.Max = n
        For i = 0 To n - 1
            sr = 0
            si = 0
            For k = 0 To n - 1
                wr = Cos(2 * Pi * k * i / n)
                wi = -Sin(2 * Pi * k * i / n)
                sr = sr + inr(k) * wr
                si = si + inr(k) * wi
            Next k
            fr(i) = sr '1
            fi(i) = si '2

            .ProgressBar1.Value = i + 1
            .パーセント.Caption = Int(i / n * 100) & "%"
            .Repaint
        Next i
    End With

    'Data Outデータ出力
    For i = 0 To n - 1
        Cells(i + 2, 9) = i / Z / n
        Cells(i + 2, 10) = Sqr(fr(i) * fr(i) + fi(i) * fi(i)) / 4800
    Next i

    MsgBox "計算完了。", vbInformation
    Unload info
End Sub

なお、参考元のinfo表示プロシジャですが、表示更新する回数が3万回もあるのが、私は気に入りませんね。パーセントは100回しか変わらないのだから、ラベルに変化があるときだけ表示更新するのがベストだと思います。 余力があるときにでも考えてみてください。
(???) 2018/01/31(水) 09:44


私にはinfoっていうオブジェクトが何かわからないので、代わりにアイデアの提供を。

作戦1
ステータスバーを使って進行状況を表示する。
https://www.moug.net/tech/exvba/0150098.html
http://officetanaka.net/excel/vba/tips/tips13.htm

作戦2
ユーザーフォームをモードレスで表示させて、任意のメッセージ(進行状況)を表示する

という手もあります。
※作戦2のほうは、ユーザーフォームの説明になっちゃうのでurlは省略します。
(もこな2) 2018/01/31(水) 09:51


あっ 作戦2について、マクロ実行中は、他の操作しないんだったらモードレスで開かなくてもよいですね。
ちょっと修正です。
(もこな2) 2018/01/31(水) 09:57

infoとは、ユーザーフォームのオブジェクト名をこの文字列に変えているのでしょう。ラベルなんかも変えてますね。
もこな2さんが書いている、ステータスバーを使った別案も書いておきます。これならコントロールを追加する必要もなく、簡単です。

 Sub 計算実行()
    Const Pi = 3.14159265358979
    Dim Z
    Dim n
    Dim i
    Dim sr
    Dim si
    Dim k
    Dim wr
    Dim wi
    Dim iw As Long

    If MsgBox("計算を実行します。よろしいですか?", vbYesNo Or vbQuestion, "確認") <> vbYes Then
        End
    End If

    Sheets("出力先").Select

    'Sample time C2 ※指定数
    'Data size C3  ※指定数
    'データ(F2〜) ※9600固定
    Dim inr(9600)
    Dim fr(9600), fi(9600)
    Z = Cells(2, "c")
    n = Cells(3, "c")

    For i = 0 To n - 1
        inr(i) = Cells(i + 2, 6) '実測値取得
    Next i

    '計算実行
    With info
        For i = 0 To n - 1
            sr = 0
            si = 0
            For k = 0 To n - 1
                wr = Cos(2 * Pi * k * i / n)
                wi = -Sin(2 * Pi * k * i / n)
                sr = sr + inr(k) * wr
                si = si + inr(k) * wi
            Next k
            fr(i) = sr '1
            fi(i) = si '2

            If iw <> Int((i + 1) / n * 100) Then
                iw = (i + 1) / n * 100
                Application.StatusBar = String(Int(iw / 10), "■") & String(10 - Int(iw / 10), "□") & iw & "% "
            End If
        Next i
    End With

    'Data Outデータ出力
    For i = 0 To n - 1
        Cells(i + 2, 9) = i / Z / n
        Cells(i + 2, 10) = Sqr(fr(i) * fr(i) + fi(i) * fi(i)) / 4800
    Next i

    MsgBox "計算完了。", vbInformation
    Application.StatusBar = ""
 End Sub
(???) 2018/01/31(水) 09:58
(10:16 整数化を忘れていた等、若干変更)

>???さんへ
 さいごの、Application.StatusBar = "" って文字数0の文字列を代入でもいいんでしたっけ?
 自分なら、Application.StatusBar = False ってしますけど・・・
(もこな2) 2018/01/31(水) 11:33

ヘルプでは False を代入しなさい、ということになっていますが、大丈夫ですよ。 "" や vbNullString をセットしても、自動的に False になってくれますから。 文字を消した、ということを表現したくて、"" で書いちゃってます。
(???) 2018/01/31(水) 11:56

なるほど。
フォローありがとうございます。m(_ _)m
(もこな2) 2018/01/31(水) 11:58

???さま
ありがとうございます。おっしゃる通りですね!
まずは自身がもっと深く理解したいと思います。

もこな2さま
その他のアイデア提供していただきありがとうございました。
(ayum i) 2018/01/31(水) 13:45


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.