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