[[20220816082203]] 『vba ボタン分岐処理のF8確認方法 』(お盆) ページの最後に飛ぶ

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

 

『vba ボタン分岐処理のF8確認方法 』(お盆)

	お世話になります。	
	押したボタンによって分岐処理しています。
	下記のコードで動くのですが
	これをF8で一行ずつ確認していくと ↓で「実行時エラー」となります。
	  Button_Name = Application.Caller    '押されたボタンを判定

	このエラーを回避してF8確認を続けるにはどうすればいいのでしょう?

	Sub ボタン名分岐1()
	Dim Button_Name As String
	Range("G1:G10").Select
	Selection.Clear

	Button_Name = Application.Caller    '押されたボタンを判定
	    If Button_Name = "図1" Then
	        MsgBox "ボタン 1が押されました。"
	        Range("F2:F3").Select
	        Selection.Copy
	        Range("G2").PasteSpecial xlPasteValues

	        ElseIf Button_Name = "図2" Then
	        MsgBox "ボタン 2が押されました。"
	        Range("F5:F7").Select
	        Selection.Copy
	        Range("G5").PasteSpecial xlPasteValues

	        ElseIf Button_Name = "図3" Then
	        MsgBox "ボタン 3が押されました。"
	        Range("F9:F10").Select
	        Selection.Copy
	        Range("G9").PasteSpecial xlPasteValues

	    End If
	Application.CutCopyMode = False
	Range("F1").Select
	End Sub

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


ボタンを押していないから
エラーが返っているのでは
先頭にSTOP
いれて、ボタンから実行して、F8
押せば、実行できるのでは。。。ないでせうか。。。← 多分。。。^^;
m(__)m
(隠居Z) 2022/08/16(火) 08:35

 Stop
    MsgBox TypeName(Application.Caller)
(隠居Z) 2022/08/16(火) 08:37

 vbaエディタの左の灰色の枠の部分をクリックすると
 茶色の線?とか引かれませんか?
 そこがブレークポイントになりマクロが実行されれば
 そこで止まります。
 後は、F8キーで進む。
 (これ設定とかが必要なのか覚えてない)
(プレビュー) 2022/08/16(火) 09:31

ありがとうございました。
うまくいきました。

(お盆) 2022/08/16(火) 09:46


質問自体は解決していると思いますが何点か。

■1
VBAの世界では基本的にシートやセル(オブジェクトと言います)を明示すればいちいちアクティブにしたり選択したりする必要はありません。
また、標準モジュールでシートの指定を省略した場合ActiveSheetが指定されたものみなされるルールです。
したがって対象のオブジェクトを明示するようにされたほうがよいとおもいます。

■2
一見するとインデントが付いているように見えますがちょっと変な感じもします。
最終的にはご本人の判断というか好みになるでしょうが、余裕があれば再考されてはどうでしょうか?

■3
>F8で一行ずつ確認していくと
既にあるように、エディタから直接ステップ実行するのではなく、一旦ブレークポイントを設定してボタンを押した後、そこからステップ実行すればよいですね。

■4
余談になりますが↓だとすれば、以下のようなアプローチでもOKだとおもいます。

 誤 Range("F5:F7").Select
 正 Range("F5:F6").Select

    Sub ボタン名分岐1()
        Dim Button_Name As String
        Dim 行 As Long

        Stop 'ブレークポイントの代わり

        With ActiveSheet
            .Range("G1:G10").Clear

            Select Case Application.Calle
                Case "図1"
                    Button_Name = "ボタン 1"
                    行 = 2

                Case "図2"
                    Button_Name = "ボタン 2"
                    行 = 5

                Case "図3"
                    Button_Name = "ボタン 3"
                    行 = 9

                Case Else
                    MsgBox "想定以外のボタンが押されました" & vbLf & "処理を中止します"
                    Exit Sub
            End Select

            MsgBox Button_Name & "が押されました。"
            .Cells(行, "F").Resize(2).Copy
            .Cells(行, "G").PasteSpecial xlPasteValues

            Application.CutCopyMode = False
            .Range("F1").Select
        End With
    End Sub

さらにセル範囲は間違っていない(必ずしも2行ではない)ということであれば↓のような方法もありますね。

    Sub ボタン名分岐1()
        Dim Button_Name As String
        Dim セル範囲 As String

        Stop 'ブレークポイントの代わり

        With ActiveSheet
            .Range("G1:G10").Clear

            Select Case Application.Calle
                Case "図1"
                    Button_Name = "ボタン 1"
                    セル範囲 = "F2:F3"

                Case "図2"
                    Button_Name = "ボタン 2"
                    セル範囲 = "F5:F7"

                Case "図3"
                    Button_Name = "ボタン 3"
                    セル範囲 = "F9:F10"

                Case Else
                    MsgBox "想定以外のボタンが押されました" & vbLf & "処理を中止します"
                    Exit Sub
            End Select

            MsgBox Button_Name & "が押されました。"
            With .Range(セル範囲)
                .Copy
                .Offset(, 1).PasteSpecial xlPasteValues
            End With

            Application.CutCopyMode = False
            .Range("F1").Select
        End With
    End Sub

(もこな2) 2022/08/16(火) 20:29


>一見するとインデントが付いているように見えますがちょっと変な感じもします。
うるせーやつだなー。

(うるせー) 2022/08/16(火) 21:26


コメント返信:

[ 一覧(最新更新順) ]


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