ツールバーのショートカットを自作して
入力を楽にしようと考えております。
ツールバーには、直接入力するリストを表示させ
そのリストの中から選んで、セルに記入させると
言うマクロを作ろうとしているのですが、
選択された、リストの戻り値を取れないため、
苦戦しております。
戻り値の取得方法とかあるのでしょうか?
宜しくお願いいたします。
コードを以下に記します。
Option Explicit
Option Base 1
Dim myCB As CommandBar
Dim myCBCtrl As CommandBarButton
Dim myData() As String
Dim n As Integer, i As Integer
----------------------------------------------------------------
Sub AddCmdBarBtn()
Call 配列
On Error Resume Next
CommandBars("MyMacro2").Delete
Set myCB = Application.CommandBars.Add(Name:="MyMacro2", _
Position:=msoBarPopup, Temporary:=True)
For i = 1 To 5
Set myCBCtrl = myCB.Controls.Add(Type:=msoControlButton)
With myCBCtrl
.Caption = myData(i)
.OnAction = "ツールバーマクロ"
End With
Next i
myCB.ShowPopup
End Sub
----------------------------------------------------------------
Private Sub ツールバーマクロ()
ActiveCell.Value = myCB.Controls.Item.Caption<<<此処を上手く処理できません(泣)
End Sub
----------------------------------------------------------------
Private Sub 配列()
ReDim myData(5)
For n = 1 To 5
myData(n) = "名前" & n
Next n
End Sub
----------------------------------------------------------------
このマクロを右クリックイベントで使って行きたいと考えている
のですが。
No.2ベストアンサー
- 回答日時:
こんにちは。
なんとなく違和感のあるコードかなって思います。
確かに、マクロのコードとしては十分なのですが。
>Private Sub ツールバーマクロ()
>ActiveCell.Value = myCB.Controls.Item.Caption<<<此処を上手く処理できません(泣)
>End Sub
これは、Application.Caller を使えばよいです。
Private Sub ツールバーマクロ()
Dim i As Integer
i = Application.Caller(1)
ActiveCell.Value = myCB.Controls(i).Caption
End Sub
たぶん、こんな感じでよいかなって思います。
ありがとうございます。
このような事が出来るんですね。
感動です。
違和感が在るコードと言うご指摘なのですが、
やっぱ、使い方が変ですかね~。
確かに、コマンドバーオブジェクトの中にプロシャージを
振り分けるようになっているのに、それを一つの
プロシャージに戻ってくるようにしてるんで、
本来の使い方から外れてるのかな、とか思ったりします。
こんな風にできるなんて。ありがとうございます。
で、お礼と共に、ご回答いただいた
i = Application.Caller(1)
のコードなのですが、
もし、お手数でなければ、補足していただけないでしょうか?
ヘルプを見ますと、呼び出した方法についての情報を返す
とあるのですが、この場合、何が返ってきているのでしょうか?
お手数でなければ、ご指導いただけないでしょうか。
No.5
- 回答日時:
こんばんは。
>配列の件なのですが、運用時のコードでは、2次元配列で格納してあり、このコード以外でも利用するので、
いろいろ、してみるのが良いかと思います。
失敗の数が、上達をさせるような気がします。実際の私のコードは、2次元配列を、グローバル変数にするようなことはしませんが、配列の「元」になるものを、以下のようなグローバル定数にして対応することがあります。
例:
Public Const MOTO As String = "A,B,C,D,E,F,G"
Private myAr As Variant
Sub CheckArray()
Dim i As Integer
If IsArray(myAr) = False Then '配列になっているかチェック
myAr = Split(MOTO, ",")
End If
i = InputBox("Please Enter between 1-7")
If i > 0 And i < 8 Then
MsgBox myAr(i - 1)
Else
MsgBox "invalid number!"
End If
End Sub
前回も書いたように、配列変数のまま、やり取りするよりは安全なのです。例えば、配列の格納が失敗していたら、それを、また、作るようなことをします。
お返事ありがとうございます。
こちらの返事が遅くなってすみません。
こちらのコードも参考にして、今後も勉強させていただきます。
沢山のアドバイスやご回答を頂き、誠にありがとうございます。
No.4
- 回答日時:
Private Sub ツールバーマクロ()
ActiveCell.Value = CommandBars.ActionControl.Caption
End Sub
だけでよろしいかと思います。
No.3
- 回答日時:
こんにちは。
>呼び出した方法についての情報を返すとあるのですが、この場合、何が返ってきているのでしょうか?
返ってきているのは、そのControlsインデックスですが、他は、あまり良く意味が分からないです。4105 というのは、ボタンのイベントの種類かなって思いますが。
自分が投稿した時点では、自分の中で整理させていませんでしたが、後に、いろいろ考えてみました。
>振り分けるようになっているのに、それを一つの
>プロシャージに戻ってくるようにしてるんで、
>本来の使い方から外れてるのかな、とか思ったりします。
いいえ、マクロ全体としては、問題はないと思います。
もうマクロとしても、出来上がっている内容ですので、もう少し、私のつたない経験的なことなので、話半分でも構いません。
一般的に、#1さんのご指摘が正答ですが、この場合のマクロは、一段高いレベルの方法です。実際、クラス設定をする場合に、そのように一元管理しますから、そういう使い方はあります。その場合は、オブジェクトを配列ではなくて、Collection化してしまうのです。しかし、今回の場合は、幸運にもインデックスが取れるので、あえてクラス設定の必要性がありません。
例:自作メニューのクラス設定のサンプル(私の作-今回には、参考にはなりません。)
http://oshiete1.goo.ne.jp/kotaeru.php3?qid=2899966
#12,#13 (カプセル化させています)
擬似コントロール配列の作成
http://www.moug.net/skillup/opm/opm08-05.htm
(これ自体は単にテクニックだけです。実用にはいまひとつです。)
私が思うのは、VBとか、専用のプログラミング言語と違って、マクロは、割り込みが入りやすい欠陥を持っているので、グローバル変数(ここでは、モジュールレベルですが)は、サブルーチンの中で働いていくのならよいのですが、OnAction として、独立して使うとなると、ちょっと弱いのです。実際に使って、他のマクロも使ったりすると、エラーが出やすくなるのです。
他のマクロでエラーが発生すると、それだけで、他のグローバル変数にも影響受けます。
ActiveCell.Value = myCB.Controls(i).Caption
この[myCB]のオブジェクトが弱いように思うのです。それと、配列による設定は、あまり意味がありません。以下のようにして、出来てしまいますね。
Sub AddCmdBarBtnR()
Dim myCB As CommandBar
Dim myCBCtrl As CommandBarButton
Dim i As Integer 'Variant でも可-そういう場合は、以下のCStr(i)で、文字列化は要らない
On Error Resume Next
CommandBars("MyMacro2").Delete
On Error GoTo 0 'ここでエラートラップは締めます。
Set myCB = Application.CommandBars.Add _
(Name:="MyMacro2", _
Position:=msoBarPopup, _
Temporary:=True)
For i = 1 To 5
Set myCBCtrl = myCB.Controls.Add(Type:=msoControlButton)
With myCBCtrl
.Caption = "名前" & CStr(i)
.OnAction = "ツールバーマクロ"
End With
Next i
myCB.ShowPopup
End Sub
Private Sub ツールバーマクロ()
'このOnActionマクロは、モジュール上では独立しています。
Dim i As Integer
i = Application.Caller(1)
ActiveCell.Value = CommandBars("MyMacro2").Controls(i).Caption
End Sub
それと、
>このマクロを右クリックイベントで使って行きたいと考えているのですが。
Worksheet_BeforeRightClick
ということだと思いますが、できれば、
CommandBars("CELL").Controls.Add
に入れたほうがよいと思います。右クリックイベントに入れると、右クリックメニューを占有してしまいます。
ご解説頂き、誠にありがとうございます。
まだまだ、解説いただいた言葉の中にも理解しきれないところが
ありますが、この内容、キーワードを基に、いろいろと調べたり
試したりして勉強していきたいと思います。
配列の件なのですが、運用時のコードでは、2次元配列で格納して
あり、このコード以外でも利用するので、質問時には別プロシャージ
で質問させていただきました。
このように、ご丁寧に補足していただき誠にありがとうございます。
No.1
- 回答日時:
でけへんと思う (ツールバーにもマクロ指定はできるけど
引数がないのしか選択できないでしょ?)
.OnAction = "ツールバーマクロ" を
.OnAction = "ツールバーマクロ"&i として
Sub ツールバーマクロ1()
Sub ツールバーマクロ2()
Sub ツールバーマクロ3()
Sub ツールバーマクロ4() の様なハンドリングをします。
お返事ありがとうございます。
通常、やっぱりそう言う使い方ですよね。
No2さんのご回答でなんとかなりそうです。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) userformでSheetを選択して開くコード 1 2023/05/15 16:27
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
Excel マクロ VBA プロシー...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
メッセージボックスのOKボタ...
-
マクロの連続実行
-
一つのTeratermのマクロで複数...
-
TERA TERMを隠す方法
-
エクセルで別のセルにあるふり...
-
エクセルに張り付けた写真のフ...
-
ExcelのVBA。public変数の値が...
-
VBAでカタカナ→ローマ字の変換...
-
EXCELのVBAでRange("A1:C4")を...
-
特定文字のある行の前に空白行...
-
Excel 改ページのVBAうまくい...
-
ExcelVBAでPDFを閉じるソース
-
ExcelVBA 図形をクリックした...
-
VBAのIF分で時間指定の条件式の...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
他人が作ったマクロの理解
-
ExcelVBAでPDFを閉じるソース
-
TERA TERMを隠す方法
-
エクセルで別のセルにあるふり...
-
マクロ実行時、ユーザーフォー...
-
Excel VBAからAccessマクロを実...
-
EXCELのVBAでRange("A1:C4")を...
-
TeraTermマクロの文字列結合
-
PDF出力マクロについて。マクロ...
-
#defineの定数を文字列として読...
-
エクセルのマクロをセルの値に...
-
wordを起動した際に特定のペー...
おすすめ情報