Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Excel 2016)
UserForm1中で別の3択用UserForm2を使用しない実行方法は?
投稿日時: 24/04/18 15:54:09
投稿者: taichi

600人ほどのデータがあり、Template用のシート(20人/頁)に転記して、
 
For n = 1 to 終頁
  (1)順次 20人ごとにデータ転記の作業
    UserForm2.show
 (2)上の作業が終わった時点でページごとに「印刷して次頁、見るだけで次頁、中止」を
    UserForm1から三択用UserForm2を呼び出して作業を1つ選択
    Unload UserForm2
  (3) (2)の3択を実行して(1)に戻る
Next
   のような感じの作業をしています。
 
 (2) ではMsgBoxではvbYesNoCancelの3択の用語が自由にならないようなので、使っていません。
 三択用UserForm2 を使わないでUserForm1の上に「印刷して次頁、見るだけで次頁、中止」の
 ボタンを配置して、作業(1)完了後に、(2)3択用ボタンで選択後、(3)三択の作業に移り
 また次の作業(1)に順次進むようにしてみたいのですが何か良い方法があるでしようか?
 
  三択用UserForm2を使用すると画面があまり美しくありません。
 
 よろしくお願い致します
 
 
 
 

回答
投稿日時: 24/04/18 18:50:54
投稿者: WinArrow

Userform1の中に三択用ボタンを配置するのでは、ダメなんですか?
三択用ボタンは、条件で非表示/表示を切り替えればよいでしょう
三択用ボタンを「フレーム」コントロール内に配置して
「フレーム」コントロールを非表示/表示する方法を提案します。
 
 
>画面があまり美しくありません
は、個人差があるので、アドバイスできません。

投稿日時: 24/04/18 22:51:58
投稿者: taichi

 WinArrow さんいつもありがとうございます。
 
作業(1)終了後、MsgBox(vbYesNoCancel)や UserForm2.Show なら一度作業を止め
3択後作業を分岐して、また(1)に戻すことはできるのですが、
UserForm1に3択用のOptionBoxを配置しても、そこで一旦作業を止める方法が
思いつかないのです。

回答
投稿日時: 24/04/18 23:10:10
投稿者: WinArrow

>(1)順次 20人ごとにデータ転記の作業
この作業は、Userfom1の中で実行しているですよね?
  
処理を止めたいのでしたら、
フレームを表示し、MSGBOXを使って(三択ボタン操作のアナウンスだけ)
止めれば、よいのでは?

回答
投稿日時: 24/04/19 01:26:43
投稿者: hatena
投稿者のウェブサイトに移動

For ... Nextループでは無理っぽいので、
転記処理をに別ルーチンして呼び出す方法はどうでしょう。
 
 
ユーザーフォーム上に[印刷作業開始]コマンドボタンがあるとします。
 
フレーム上(Frame1)に下記の3つのコマンドボタンを配置します。
[印刷して次頁] [見るだけで次頁] [中止]
 
ユーザーフォームに下記のコードを記述します。
 

Option Explicit
Private 処理頁 As Long
Private 終頁 As Long

Private Sub 転記作業()
    If 処理頁 > 終頁 Then
        MsgBox "最終頁まで作業完了しました。"
        Exit Sub
    End If

    MsgBox 処理頁 & "頁の転記作業実行"
    '実際の転記処理を記述
    
    Me.Frame1.Visible = True
End Sub

Private Sub 印刷作業開始_Click()
    処理頁 = 1
    終頁 = 20
    Call 転記作業
End Sub

Private Sub 印刷して次頁_Click()
    Me.Frame1.Visible = False
    
    MsgBox 処理頁 & "頁の印刷実行"
    '実際の印刷処理を記述
    
    処理頁 = 処理頁 + 1
    Call 転記作業
End Sub

Private Sub 見るだけで次頁_Click()
    Me.Frame1.Visible = False
    処理頁 = 処理頁 + 1
    Call 転記作業
End Sub

Private Sub 中止_Click()
    Me.Frame1.Visible = False
    MsgBox "作業を中止します。"
End Sub

 
上記のサンプルでは実際の処理の代わりにMsgboxを表示させてますが、
その部分に実際の処理コードを記述してください。

投稿日時: 24/04/19 09:19:40
投稿者: taichi

hatena さん 懇切丁寧なコードありがとうございます。
もう少し色々調べてみると、Do Until と DoEvents を
利用すればMsgbox や UserForm2 を使わなくても、一旦作業を
中止して、3択に分岐してまた元に戻ることができました。
 
大雑把には次のようなコードです。
Private Sub 作成開始()
   Dim choice As Integer,n As Integer
  
   For n = 1 To 終頁
        ' ここで転機作業(コードは省略)
        Do Until choice <> 0
            DoEvents
        Loop
         
        Select Case choice
            Case 1 ' ComandButton1
                作業1 を実行
            Case 2 ' ComandButton2
                作業2 を実行
            Case 3 ' ComandButton2
                作業3 を実行
        End Select
 
      If n > 終頁 Then
    MsgBox "最終頁まで作業完了しました。"
       Exit Sub
      End If
        choice = 0 ' ユーザーの選択をリセットする
    Next n
End Sub
 
 
Private Sub CommandButton1_Click()
    choice = 1
End Sub
 
Private Sub CommandButton2_Click()
    choice = 2
End Sub
 
Private Sub CommandButton3_Click()
    choice = 3
End Sub
 
2日ほどしたら閉めさせていただきます。

回答
投稿日時: 24/04/19 09:40:24
投稿者: hatena
投稿者のウェブサイトに移動

taichi さんの引用:

もう少し色々調べてみると、Do Until と DoEvents を
利用すればMsgbox や UserForm2 を使わなくても、一旦作業を
中止して、3択に分岐してまた元に戻ることができました。

 
Do ... Loop で待機する方法ですね。
この方法ですと、VBAがずっと実行中になりますので、CPU使用率が高くなります。
 
現在のCPU性能なら、それで動作が重くなることが体感できることはないかも知れませんが、エコではないと思うので、私はこの方法は可能なら使いません。
 
余談
大昔のシングルスレッドのCPUだとCPU使用率が100%近くなり、CPUファンがうなってました。
今でも、CPUモニターなどでみると一つのスレッドが100%近くなります。

回答
投稿日時: 24/04/19 09:55:53
投稿者: hatena
投稿者のウェブサイトに移動

Do ... Loop と DoEventsの待機でCPUの使用率を下げる方法はありますが、パフォーマンスは落ちます。
 
Office TANAKA - Excel VBA Tips[CPUの使用率を抑える方法]
http://officetanaka.net/excel/vba/tips/tips116.htm
 
下記の方法だと改善はされますが、やはりパフォーマンスは落ちます。
 
Access Tips #114 DoEventsをパフォーマンスを下げずに使う方法 | T'sWare
https://tsware.jp/tips/tips_114.htm
 
私の回答の方法だとパフォーマンスが落ちることはありません。

投稿日時: 24/04/27 14:35:27
投稿者: taichi

WinArrow さん hatena さん ありがとうございました。
これで解決とさせていただきます。