[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
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.