[[20180313142008]] 『OnAction レンジオブジェクトを引数として渡す?』(隠居じーさん) ページの最後に飛ぶ

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

 

『OnAction レンジオブジェクトを引数として渡す?』(隠居じーさん)

 こんにちは ^^
お世話になります。下記コードでコマンドボタン
(フォームコントロールだと思います)から
呼び出すプロシジャーにRange rr を引数として渡せません、
何か方法をご存じでしたらお教えください。
対象シート名はAです。
rrは選択した、任意のRangeオブジェクトです。

 Option Explicit
Sub main()
    Dim sh01 As Worksheet, rr As Range
    Dim BTN As Object, br1 As Range, br2 As Range
    Set sh01 = ThisWorkbook.Worksheets("A")
    With sh01
        On Error Resume Next
        Set rr = Application.InputBox("選択", Type:=8)
        On Error GoTo 0
        If rr Is Nothing Then
           MsgBox "Nothing"
           Exit Sub
        End If
        Set br1 = .Range("F3"): Set br2 = .Range("F3:G4")
        Set BTN = .Buttons.Add(br1.Left, br1.Top, br2.Width, br2.Height)
        With BTN
            .OnAction = "'Module3.test(rr)'"
            .Characters.Text = "BTN"
        End With
    End With
End Sub
Private Sub test(ByVal myr As Range)
    MsgBox myr.Address
    Call btn_del
End Sub
Private Sub btn_del()
    Dim BTN As Object
    For Each BTN In ActiveSheet.Buttons
        BTN.Delete
    Next
End Sub

 OnAction = "'Module3.test(""rr"")'" 文字列ならOKのようです。

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


 思い付きレベルだが。
 rrをPublic変数としてはどうだろうか?
(ねむねむ) 2018/03/13(火) 15:12

OnActionに指定できるのは文字列であり、オブジェクトそのままでは渡せないのではないでしょうか? 例えば以下のように、アドレスを表現する文字列を渡すなら動作しますよ。

 Sub main()
    Dim rr As Range
    Dim br As Range

    With ThisWorkbook.Worksheets("A")
        On Error Resume Next
        Set rr = Application.InputBox("選択", Type:=8)
        On Error GoTo 0
        If rr Is Nothing Then
           MsgBox "Nothing"
           Exit Sub
        End If
        Set br = .Range("F3:G4")
        With .Buttons.Add(br.Left, br.Top, br.Width, br.Height)
            .OnAction = "'Module3.test(""" & rr.Address & """)'"
            .Characters.Text = "BTN"
        End With
    End With
 End Sub
 Private Sub test(ByVal myr As String)
    MsgBox myr
    Call btn_del
 End Sub
 Private Sub btn_del()
    Dim BTN As Object
    For Each BTN In ActiveSheet.Buttons
        BTN.Delete
    Next
 End Sub
(???) 2018/03/13(火) 15:51

 あるいは変数じゃなく、名前定義を経由してブックに覚えさせるとか・・・

    Private Property Get myR() As Range
        Dim n As Name
        For Each n In ThisWorkbook.Names
            If n.Name = "myRange" Then Set myR = n.RefersToRange
        Next
    End Property
    Private Property Set myR(newR As Range)
        Dim n As Name
        For Each n In ThisWorkbook.Names
            If n.Name = "myRange" Then n.Delete
        Next
        ThisWorkbook.Names.Add "myRange", newR
    End Property

    Sub main()
        Dim sh01 As Worksheet, rr As Range
        Dim BTN As Object, br1 As Range, br2 As Range
        Set sh01 = ThisWorkbook.Worksheets("A")
        With sh01
            On Error Resume Next
            Set rr = Application.InputBox("選択", Type:=8)
            On Error GoTo 0
            If rr Is Nothing Then
               MsgBox "Nothing"
               Exit Sub
            End If
            Set br1 = .Range("F3"): Set br2 = .Range("F3:G4")
            Set BTN = .Buttons.Add(br1.Left, br1.Top, br2.Width, br2.Height)
            Set myR = rr 'ココでmyRに設定
            With BTN
                .OnAction = "Module1.test"
                .Characters.Text = "BTN"
            End With
        End With
    End Sub
    Private Sub test() '引数は除去
        MsgBox myR.Address
        Call btn_del
    End Sub
    Private Sub btn_del()
        Dim BTN As Object
        For Each BTN In ActiveSheet.Buttons
            BTN.Delete 'ボタンは消えるけどmyRはまだ覚えている
        Next
    End Sub

(白茶) 2018/03/13(火) 16:06


 ねむねむ さん 有難うございます。
試してみましたが、同じ結果のようです。お手数をおかけし申し訳ありません。
??? さん
白茶  さん
有難うございます。
ようするに、変数は渡せないという事でしょうね。
ご提案いただいた、代替案、でいけそうなので。頑張ってみます。
貴重なご意見有難うございました。

 m(__)m

(隠居じーさん) 2018/03/13(火) 16:18


 失礼しました
>ようするに、変数は渡せないという事でしょうね。
???さんがご教示の通り
文字列変数は大丈夫みたいですね。
??? さん
ありがとうございます〜 ^^v 成功です。

 白茶 さん 感激です!

 Property get set って class作成の時しか
使わないとか思っていました ^^;;;
大変勉強になりました。

 m(__)m

(隠居じーさん) 2018/03/13(火) 17:04


 ねむねむ さん

 大変失礼いたしました。
m(__)m

 >rrをPublic変数としてはどうだろうか?
で
十分対応可能だと存じます。
確認いたしました。

 いや〜 ^^:;; 大変な勘違いを。。。。。
申し訳ありませんでした。
取り急ぎお礼、かたがたお詫びまで

 << _ _ >>

(隠居じーさん) 2018/03/13(火) 20:02


 >十分対応可能だと存じます。
 >確認いたしました。

 そう単純でもないです。

 ボタンをクリックするのは随時ですよね?

 [VBA] Public 宣言された変数の有効期間
http://support.microsoft.com/kb/408871/ja

 >『モジュール内での変数について』(ゆき夫)
[[20100731000846]]
 その最後にあるichinoseさんのアイデアは使えるのかも知れません。

 今やってみると、Book2の変数はPrivateではダメなので、
 Publicの間違いなのかなと思っていますけども。

(半平太) 2018/03/13(火) 20:30


半平太 さん
こんばんは ^^
何時もお世話になります。マイクロソフト様のページ、有難うございます。
。。。幻のパブリック変数みたいなお話で。
消えて無くなる危険性をはらんでいるのですね。。。 . .
いや〜確かに、今回の私のコードだと文字列にしてセルに書き込みも出来ますが
オブジェクトだとそうもいかないですね。

>Publicの間違いなのかなと思っていますけども。
素朴な疑問が。。。
そのpublicは消えて無くなる危険性は?無いのでしょうか。
私には分かりません。
いづれにいたしましても本当に有難うございます。
留意いたします。とても勉強になります。
m(__)m

(隠居じーさん) 2018/03/13(火) 22:19


 > いまところ、変数を別ブックに配置し、そのブックは、非表示又は、専用アドインブックにしておく
 > ことで値を保持してくれています。
 >
 > これで大丈夫という結論ではありませんが、別ブックに変数を配置する方法も試してみてください。
          ↑
 ichinoseさんは、こう言っています。

 多分、自社での運用でトラブったことが無く、自信があるんだと思います。

 私は暇つぶしでやっているので、こういう問題について何も経験値を持っていないです。m(__)m

(半平太) 2018/03/13(火) 22:36


コメント返信:

[ 一覧(最新更新順) ]


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