[[20200301170052]] 『VBAの一時中断→再開について』(lost_lamp) ページの最後に飛ぶ

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

 

『VBAの一時中断→再開について』(lost_lamp)

お世話になります。
質問)
マクロを一時中断して他の作業をして再開することは可能でしょうか?
具体的には、以下のコードで#1の後に一時中断→再開をしたいです。

 Sub 説明()
    'データを転記(入力)
    'データ処理(各種計算)
        '->(結果1と結果2を得る)
    '#1 結果1を出力
    '//一時中断//
        '->(確認して問題なければ別ブックにコピペする)
    '//再開//
    '#2 結果2を出力
        '->(確認して問題なければ別ブックにコピペする)
 End Sub

参照登録の(ななし)さんの回答にある「ショートカットキーに登録して続行」
が理想で、いろいろ考えているのですが思いつきません。
補足)
・#1と#2の出力先は同名のCSVファイルです(使い捨て。上書きで運用)
・#1と#2で出力先を変えればいいのですが、次善策と考えています
・現在は、「inputbox」で#1と#2を選択式にして2段階で実行しています

よろしくお願いします。
(参照登録)
[[20190222160513]] 『VBAの一時中断→再開』(T19) 
について...

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 登録参照先のユーザーフォーム案
 がいいと思うんですけどね。
(OK) 2020/03/01(日) 18:06

 >登録参照先

 参照登録先、の間違いでした。
(OK) 2020/03/01(日) 18:08

ありがとうございます。

ユーザーフォーム案を薦められる理由は何でしょうか?
(ユーザーフォームは使用したことがなく、敷居が高いというか…)

ショートカットキー案より確実安全ということでしょうか?

食わず嫌いでは前に進まないのであれば、調べてみます..

取り急ぎ、お礼まで。

(lost_lamp) 2020/03/01(日) 20:54


 こんばんは ^^ 
こぉんな感じではだめなのでしょうね〜。。。
Usedrange、等に影響が有れば。。。iniファイルにまで
しなくても、単純なテキストファイル使用でも。。。。
あまり深く読んでないので、私の勘違いでしたら
無視してくださいませ。
Option Explicit
Sub main()
    With Worksheets("Sheet1")
        If .Cells(1) = 1 Then
            Proc02
        Else
            Proc01
        End If
        ThisWorkbook.Save
    End With
End Sub
Private Sub Proc01()
    With Worksheets("Sheet1")
        .Cells(1) = 1
        MsgBox "1"
    End With
End Sub
Private Sub Proc02()
    With Worksheets("Sheet1")
        MsgBox "2"
        .Cells(1) = ""
    End With
End Sub
(隠居じーさん) 2020/03/01(日) 21:12

ユーザーフォームにボタン等を配置し、マクロの
実行、テキストボックス等に実行結果を表示、
あるいは実行結果により次に実行すらボタンの
表示、非表示切り替え、又はボタンの有効、
無効の切り替え、ということができます。
(OK) 2020/03/02(月) 00:27

明日から会議や出張などでしばらくレスが
出来なくなります。
(OK) 2020/03/02(月) 00:29

(隠居じーさん)さん
コードの意図がわかりません..一時中断〜再開と関係ありますでしょうか?
(理解できずにすみません)

(OK)さん
ヒントをもとにユーザーフォームに挑戦してみます。
手に負えなくなった時はまたお助けください。
(少々時間かかりそうです…)
(lost_lamp) 2020/03/02(月) 13:20


こんにちは ^^
一度目の実行はProc01だけが
二度目の実行はproc02だけが
それぞれ
実行されます。。。m(_ _)m

(隠居じーさん) 2020/03/02(月) 13:44


(隠居じーさん)さん
call文で2回に分けて実行、ということですね?
補足に書きましたが、今も inputbox, selectcase で2回実行しており、
“2回を1回”で、というのが質問の主旨なんですが…
(lost_lamp) 2020/03/02(月) 14:06

 こんにちは ^^
いや〜。。。う。。。そぉなのですね、どうやら私の理解を越えて
いるよ〜なので。。。お騒がせし、大変、済みませんでした。m(_ _)m
私の案は没にしていただいて、これにてお暇いたします。でわでわ
(隠居じーさん) 2020/03/02(月) 15:59

 こんばんは!

 コードを途中で中断して別作業をすることは、多分出来ないと思います。
でも、Staticを使って値を保持すれば、同じコードでも分岐することが出来ます。
結果的にいつもコードは最初から実行されているのですが、値によって分岐されるので
中断したような格好にはなるかと思います。
この仕組みを利用してみてはどうでしょうか?

 Option Explicit
Sub 説明()
Static x As Long
Select Case x
    Case 0
        'データを転記(入力)
        'データ処理(各種計算)
        '->(結果1と結果2を得る)
        '#1 結果1を出力
        x = Application.InputBox("判定を入力してください", Type:=1)
    Case 1
        '//一時中断//
        x = Application.InputBox("判定を入力してください", Type:=1)
        '->(確認して問題なければ別ブックにコピペする)
    Case 2
        '//再開//
        x = Application.InputBox("判定を入力してください", Type:=1)
        '#2 結果2を出力
        '->(確認して問題なければ別ブックにコピペする)
End Select
End Sub
(SoulMan) 2020/03/02(月) 21:14

みなさん、手を差し伸べていただきありがとうございます。

(SoulMan)さんの「Static」ステートメント(静的変数というんですか)、
まったく知りませんでしたがいろいろ応用できそうで覚えておこうと思います。
コードを“繰返す”という意味では今の方法と似ている、と理解しています。

 >コードを途中で中断して別作業をすることは、多分出来ない..

コードの再開を何のアクションもなしに実行することは、やはり無理スジでは
ないかと私にも思えてきました。

ユーザーフォームもなかなか奥が深そうで、現段階では私には
使いこなせそうにありません。

これに割ける時間も限られており、一旦クローズさせていただいて、
進めるうちに不明点が出てきましたら別途投稿させていただきます…
(lost_lamp) 2020/03/03(火) 11:50


書いてたら話おわってましたが、投稿しておきます。

状況がちょっと理解できてないけど
>「ショートカットキーに登録して続行」が理想
>“2回を1回”で、というのが質問の主旨なんですが…
矛盾してませんか?ショートカットに登録できる時点で別プロシージャだとおもうのですが・・・

今回は"1つ"のプロシージャで【中断】したいのですよね?
それなら、やはり提案されているとおりユーザーフォームを使って、メッセージボックスもどきを自作してみてはどうでしょうか。
(モードレスでユーザーフォームを表示させている場合は、ある程度の操作が可能。)

「確認」というユーザーフォームに「はい」と「いいえ」ボタンを作成した例。

【確認のモジュール】

    '================================
    Private Sub はい_Click()
        変数 = vbYes
        Unload Me
    End Sub
    '================================
    Private Sub いいえ_Click()
        変数 = vbNo
        Unload Me
    End Sub
    '================================

【標準モジュール】

    Option Explicit
    Public 変数 As Long
    '================================
    Sub test()
        Dim 押したボタン As String

        変数 = 0
        確認.Show vbModeless

        Do Until 変数 > 0
            DoEvents
        Loop

        Select Case 変数
            Case Is = vbYes: 押したボタン = "はい"
            Case Is = vbNo: 押したボタン = "いいえ"
        End Select

        MsgBox 押したボタン & " が押されました"

    End Sub
    '================================

(もこな2 ) 2020/03/03(火) 11:52


↑の補足。

結局、擬似コードのみで出来ている部分の提示がないため、【どうやって確認】するのかわかりませんが、
組み合わせるとこんな感じになるんじゃないですかね。

    Sub テキトー()
        Dim Mytime As Date

        'データを転記(入力)
        'データ処理(各種計算)
            '->(結果1と結果2を得る)
        '#1 結果1を出力

        Mytime = Now()
        変数 = 0
        確認.Show vbModeless

        Do Until 変数 > 0
            確認.Label1 = "貼付してよろしければ「はい」を押してください" & vbLf & "経過時間:" & Format(Now() - Mytime, "nn:ss")
            DoEvents
        Loop

        If 変数 = vbYes Then
            '別ブックに結果1をコピペする
        End If

        '#2 結果2を出力
        Mytime = Now()
        変数 = 0
        確認.Show vbModeless

        Do Until 変数 > 0
            確認.Label1 = "貼付してよろしければ「はい」を押してください" & vbLf & "経過時間:" & Format(Now() - Mytime, "nn:ss")
            DoEvents
        Loop

        If 変数 = vbYes Then
            '別ブックに結果2をコピペする
        End If

     End Sub

要は、無制限というわけにはいきませんが、他シートや他ブックを【目視確認】するくらいなら自作メッセージボックス(ユーザーフォーム)をモードレスにしておけば可能じゃないですかという話です。

(もこな2 ) 2020/03/03(火) 12:52


 >今回は"1つ"のプロシージャで【中断】したいのですよね?

そのとおりです。実行ボタンを押した後は勝手に一時中断し、「別作業」の
後は勝手に再開して終了する..が理想の流れです。
(要は実行ボタンを押したらできるだけ別作業以外のアクションは控えたい、です)

参照登録先のご回答にあった「ショートカットキー」が別プロシージャを
意味するとは思っていませんでしたし、“2回を1回に”というのは、理想の
流れを表現したかったものです。
「別作業」は【手作業】で、CSV形式で出力後に「名前を付けて保存」、あるいは
別ブックにコピペする、を行っています。

説明がヘタですみませんでした。
(提示いただいたコードは未だ試せていません)
(lost_lamp) 2020/03/03(火) 14:37


◆1
>「ショートカットキー」が別プロシージャを意味するとは思っていませんでした
理想や条件が変わっていっているように思いますが、当初のように「ショートカットキー」が理想なら

 (1)(ボタンを押すなどして)マクロ1を実行
          ↓
 (2)  一時停止(といいつつ、この時点でマクロ1は終了)
          ↓
 (3) 再開(といいつつ、「ショートカットキー」でマクロ2を”新たに”実行)

でよかったんじゃないでしょうか。

◆2、
「確認」だったのが、【手作業】に変わっちゃってますけど、そうなると、

 マクロ(#1 結果1を得る)
   ↓
 手作業(結果1を保存or別ブックにコピペ)
   ↓
 マクロ(#2 結果2を得る)
   ↓
 手作業(結果2を保存or別ブックにコピペ)

でしょうか?それなら、

 マクロ(#1 結果1を得る)
 マクロ(#2 結果2を得る)
   ↓
 手作業(結果1を保存or別ブックにコピペ)
 手作業(結果2を保存or別ブックにコピペ)

でも大差ないような気がしますが、結果1を保存するか、コピペするかで、結果2の取り扱いがかわるんでしょうか?
繰り返しになりますが、擬似コードのみで、そもそもどんな処理をしているか提示がないのでやりたいことが、さっぱりわかりません。
一時停止の部分を抜きにしたら(とりあえず考えずにいたら)どんなコードになるのでしょうか?

(もこな2) 2020/03/04(水) 08:33


 >(3) ...「ショートカットキー」でマクロ2を“新たに”実行でよかった...

上で書きましたように、ショートカットキーがマクロ2を必要とするとは
思っておらず、何かのキーを押して再開…程度のつもりでした。

やりたい事は、概ね◆2の最初に書いていただいたとおりです。
もちろん、後で書いていただいた方法でも大差ありませんが、補足)で
書きましたように結果1と結果2で同名のCSVファイルに出力するため、
今回の質問になっています。
(使い捨てファイルを2つ用意するのもどうか..という程度ですが)

「確認」とは、文字通りの“確認”です。
【出力結果が思わしくなければ、保存やコピペはしません】
この確認作業が「不要」、と判断できる段階になったら、手作業の部分は
マクロ化を考えています。
尚、結果1を保存するかコピペするかで、結果2の取り扱いは変わりません。

VBAで「何ができて何ができない」かがわからず、舌足らずで稚拙な説明で
すみません…

(lost_lamp) 2020/03/04(水) 14:47


再三いってますが、【疑似コード】のみなのでやりたいこと(および現状できている部分)がわかりません。

◆3
繰り返しになりますが、

 (1)(ボタンを押すなどして)マクロ1を実行
          ↓
 (2)  一時停止(といいつつ、この時点でマクロ1は終了)
          ↓
 (3) 再開(といいつつ、「ショートカットキー」でマクロ2を”新たに”実行)

これで困らないならそれでいいじゃないですか。
どうしてもマクロを【一時停止】じゃないと困るんですか?
変数などを引き継ぎたいとかいう理由があって困っているなら、アドバイスのしようもありますが、
コードが提示されてないのでそれもわかりません。

現状ではご自身が一時停止だとおもっていれば、それで済むようにおもってなりません。

◆4
>(使い捨てファイルを2つ用意するのもどうか..という程度ですが)
意味がわかりません。
作業用シート1、作業用シート2にそれぞれ出力して、それぞれシートごと別ブックにmoveして保存すればいいでしょう。(要らなきゃ削除すればいいだけ。)
こちらも、コードが提示されないので、実際にどのように出力しているかはわかりませんので、アドバイスのしようがありません。

◆5
>「確認」とは、文字通りの“確認”です。
>【出力結果が思わしくなければ、保存やコピペはしません】
>尚、結果1を保存するかコピペするかで、結果2の取り扱いは変わりません。
それなら、

 マクロ(#1 結果1を得る)
 マクロ(#2 結果2を得る)
   ↓
 手作業(結果1を保存or別ブックにコピペ)
 手作業(結果2を保存or別ブックにコピペ)

でいいじゃないですか。なんで(というかどこで)一時停止したいんですか?

◆6
>手作業の部分はマクロ化を考えています。
仮に、↑を見据えて質問しているのだとしたら、既に一時停止案は示していますよ。
(ユーザーフォームをモードレスにしているなら、シートやブックの切り替え程度は可能)

試したり研究したりする気はないならもう知りませんが・・・

(もこな2) 2020/03/04(水) 15:22


(もこな2 )さん、ありがとうございます。

一時停止以外にいろいろな手順があるのは承知いたしました。
本件ではユーザーフォームを使う必要性はなく、◆4,5でいいかと
思いますが後学のため学習中です。
が、細切れでしか時間がとれず、またなかなか理解が進まず現状では
やはりハードルが高い、と感じています。

これからもよろしくお願いします…
(lost_lamp) 2020/03/05(木) 17:14


こちらにタマは無いと思ってますが、一応コメントしておきます。

◆7
>一時停止以外にいろいろな手順があるのは承知いたしました。
>本件ではユーザーフォームを使う必要性はなく、◆4,5でいいかと
>思いますが後学のため学習中です。

いや、そこじゃなくて、【なんで】【一時停止】に拘りたいかです。

 マクロ1(結果1、結果2を得る)
   ↓
 手作業(結果1、結果2を保存or別ブックにコピペ)

↑↓どちらもマクロを一時停止させる余地ないですよね?

 マクロ1(結果1、結果2を得る)
   ↓
 目視確認が終わったら【Excelに合図を出す(ショートカットキーでマクロ2を実行)】
   ↓
 マクロ2(結果1と結果2を保存)

そのうえで、後者は(実際には一時停止じゃないけど)本人が【一連の作業を一時停止】して【確認したあと】ショートカットキー押して【再開】だと【思っていれば】済む問題じゃないかと言っています。

要は、【何のために】一時停止させたいかです。
ちなみに、一定時間待機している間に確認を行って,時間経過したら勝手に続きを処理という話であれば、ユーザーフォームを使わなくても可能ではありますが、確認が終わってないのに進まれても困ると思いますし、逆に確認済んだのにぼーっと時間経過を待つなんて馬鹿らしいとおもうのでお勧めはしません。

◆8
>これからもよろしくお願いします…
なにをお願いしたいのかピンと来てませんし、現状だと再三再四書いているようにコード提示がなく現状がわからないのでアドバイス出来ることがありません。

丸ごとコードを作成してほしいということならお断りしますし、私がレスを付けていると遠慮して書き込みを止めている回答者さんもいらっしゃるかもしれませんから、とりえず私はROMに戻ります。

(もこな2) 2020/03/07(土) 10:03


つくづく自分の説明力のなさ?にガッカリしつつ一応お答えします。

 >いや、そこじゃなくて、【なんで】【一時停止】に拘りたいか・・

⇒いや、「一時停止以外にいろいろな手順があるのは承知いたしました」と書いた時点で、
 既に【一時停止】には拘っていません(もこな2さんのコメントを受けてのことです)

 >確認が終わってないのに進まれても困る・・逆にに確認済んだのにぼーっと時間経過を待つなんて馬鹿らしい・・

⇒そうなんです。まさにこれが今回の質問の動機なんです。
 ただ、先に書きましたように私はVBAで「何ができて何ができないか」がわかりません。
 実行ボタンを押して出力1をした後に別作業(出力の確認と保存かコピペ)をした後にそのまま次に進みたい..
 ただそれだけのことです。
 参照登録先の「ショートカットキー」に思わず食いついてしまいましたが、これもまさか別のマクロ2が必要、
 なんて思ってもいませんでした。
 VBAの関数かメソッド?なんかで、ちょっとしたアクションでマクロを再開できるのでは..と考えてのことです。
 (SoulMan)さんのコメントやその後の調べで、そんなムシのいいことはできない、と今は認識しています。

 >コード提示がなく現状がわからないのでアドバイス出来ることがありません
 >丸ごとコードを作成してほしいということならお断りします

⇒これはお叱りを覚悟で書きますが、ご回答に応える時間帯がコードを提示できる環境になかったのが主原因ですが、
 そもそも今回の質問で必ずしもコード提示が必要とは思っていませんでした。
 考え方を示して欲しかった故ですが、これは質問の仕方が悪かったと反省しております。

上記もご納得いただける自信はありませんが、ケジメとして書かせていただきました。

因みに、今は「inputbox -> select case」も止めて、直接結果1と2を「別名で保存」するマクロにしています。
(確認作業をする必要がなくなった、と判断できた為です)

以上です…
(lost_lamp) 2020/03/07(土) 18:07


 こんばんは!
最初にStaticとInputBoxのコードを提示しましたが、↓の様にすれば
同じボタンでも開始される位置が変わります。
考え方ですけど、、再開とも取れます。

 Option Explicit
Sub てすと()
Static x As Long
x = x + 1
Select Case x
    Case 1
        MsgBox x & "回目"
    Case 2
        MsgBox x & "回目"
    Case 3
        MsgBox x & "回目"
End Select
If x > 2 Then x = 0
End Sub

 代案ですけど、、応用出来れば、、と思います。。。

 どんなコードでも停止→再開するには何かトリガーをひかないといけないと思うのです。
考え方ですよね。。。いいんじゃないんですか?コードなんて所詮トピ主さんが納得されればいいのですから。。。
頑張って下さいね。。。
では、、では、、、
(SoulMan) 2020/03/07(土) 19:05

 >どんなコードでも停止→再開するには何かトリガーをひかないといけない..

と、いう事すらわからないレベルの為、不適切な質問の仕方でした。

「Static」面白そうですねぇ〜。
でも、なんで今まで知らなかったのだろう..、という感じです…
(単に“情報オンチ”なんですかね)

私のコードよりはるかに“スマート”です。

これもお叱り覚悟ですが、実は“スマート”には結構拘っていまして、
(VBAにはまったく素人ですが)以下が私にとって最重要の項目です。

◆処理速度重視
 ※所詮、結果責任は“我にあり”です
 ※もちろん、最低限の検証を得た上での話です
 ※10万件を超えるデータを処理した時、数十秒以内には結果を欲しい為
 (扱う計算式が自分の実力レベルにならざるを得ないのと、PC性能です)
 ※会社ではもちろん、「Q・C・D」です
  (↑とはいえ、実際は“天秤”でやってますが(笑))
 ※これは笑えない事実ですが、商品開発で品質面の対策で外部のある高名な方に
  助言を求めたところ、とても筐体に入らない部品を推奨されました。
  理論的にはそうなのですが(おそらく)、実用上では採用できませんでした

◆自分が理解できないものは採用できない
 ※当たり前ですよね、“次に”ができませんから

◆関数式やコードは短いのに限る
 ※私の“アタマ”のキャパしだいなので(涙)

新型コロナの影響で外出もできず、駄文失礼しました…
(lost_lamp) 2020/03/08(日) 14:47


コメント返信:

[ 一覧(最新更新順) ]


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