• ベストアンサー

エクセル2003 自作ツールバー(コマンドバー)の選択戻り値取得方法

ツールバーのショートカットを自作して 入力を楽にしようと考えております。 ツールバーには、直接入力するリストを表示させ そのリストの中から選んで、セルに記入させると 言うマクロを作ろうとしているのですが、 選択された、リストの戻り値を取れないため、 苦戦しております。 戻り値の取得方法とかあるのでしょうか? 宜しくお願いいたします。 コードを以下に記します。 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 ---------------------------------------------------------------- このマクロを右クリックイベントで使って行きたいと考えている のですが。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 たぶん、こんな感じでよいかなって思います。

tmgolf
質問者

お礼

ありがとうございます。 このような事が出来るんですね。 感動です。 違和感が在るコードと言うご指摘なのですが、 やっぱ、使い方が変ですかね~。 確かに、コマンドバーオブジェクトの中にプロシャージを 振り分けるようになっているのに、それを一つの プロシャージに戻ってくるようにしてるんで、 本来の使い方から外れてるのかな、とか思ったりします。 こんな風にできるなんて。ありがとうございます。 で、お礼と共に、ご回答いただいた i = Application.Caller(1) のコードなのですが、 もし、お手数でなければ、補足していただけないでしょうか? ヘルプを見ますと、呼び出した方法についての情報を返す とあるのですが、この場合、何が返ってきているのでしょうか? お手数でなければ、ご指導いただけないでしょうか。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 前回も書いたように、配列変数のまま、やり取りするよりは安全なのです。例えば、配列の格納が失敗していたら、それを、また、作るようなことをします。

tmgolf
質問者

お礼

お返事ありがとうございます。 こちらの返事が遅くなってすみません。 こちらのコードも参考にして、今後も勉強させていただきます。 沢山のアドバイスやご回答を頂き、誠にありがとうございます。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

Private Sub ツールバーマクロ()   ActiveCell.Value = CommandBars.ActionControl.Caption End Sub だけでよろしいかと思います。

tmgolf
質問者

お礼

お返事ありがとうございます。 このような形で出来るのですね。 またまた、一つ勉強になりました。 誠にありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 に入れたほうがよいと思います。右クリックイベントに入れると、右クリックメニューを占有してしまいます。

tmgolf
質問者

お礼

ご解説頂き、誠にありがとうございます。 まだまだ、解説いただいた言葉の中にも理解しきれないところが ありますが、この内容、キーワードを基に、いろいろと調べたり 試したりして勉強していきたいと思います。 配列の件なのですが、運用時のコードでは、2次元配列で格納して あり、このコード以外でも利用するので、質問時には別プロシャージ で質問させていただきました。 このように、ご丁寧に補足していただき誠にありがとうございます。

  • deecyan
  • ベストアンサー率38% (89/233)
回答No.1

でけへんと思う (ツールバーにもマクロ指定はできるけど 引数がないのしか選択できないでしょ?) .OnAction = "ツールバーマクロ" を .OnAction = "ツールバーマクロ"&i として Sub ツールバーマクロ1() Sub ツールバーマクロ2() Sub ツールバーマクロ3() Sub ツールバーマクロ4() の様なハンドリングをします。  

tmgolf
質問者

お礼

お返事ありがとうございます。 通常、やっぱりそう言う使い方ですよね。 No2さんのご回答でなんとかなりそうです。 ありがとうございます。

関連するQ&A

  • Excel VBAでツールバーにマクロを登録したい

    自作のツールバーをブックに添付し、 スタートアップにマクロを書いたブックを保存し(起動して非表示にしてあります)、 そのマクロをツールバーの各ボタンに登録しようとしています。 下記のようなコードを書いたのですが、ツールバーに作成したボタンにはマクロが登録できるのですが、 サブメニュー内のボタンには登録できません。 Dim MyWB, NBar MyWB = "stampB.xls" NBar = "stampB1.0" For i = 1 To Application.CommandBars(NBar).Controls.Count  'ボタンのキャプションと同じ名前のマクロを登録  With Application.CommandBars(NBar).Controls.Item(i)   .OnAction = MyWB & "!" & .Caption  End With Next i これをどのように改良したら、サブメニュー内のボタンにもマクロを登録できるようになりますでしょうか? ご存知の方どうぞよろしくお願いします。

  • エクセル2007で自前のツールバーを作る方法

    エクセル2000です。 以下のマクロで自前の新しいツールバーが作れ、作動します。 ところがエクセル2007ではうんともすんとも言ってくれません。 エクセル2007で使う場合はどのようにしたらよいでしょうか? ユーザーフォームで似たようなものを作る方法はわかるのですが、できれば以下の方法を使いたいのです。 Sub 三択メニュー() On Error Resume Next Application.CommandBars("選択します").Delete On Error GoTo 0 Application.CommandBars.Add Name:="選択します", Position:=msoBarFloating With Application.CommandBars("選択します") .Visible = True .Controls.Add Type:=msoControlButton With .Controls(1) .Style = msoButtonCaption .Caption = "⇒メニュー1 " .OnAction = "Msg_1" End With .Controls.Add Type:=msoControlButton With .Controls(2) .Style = msoButtonCaption .Caption = "⇒メニュー2 " .OnAction = "Msg_2" End With .Controls.Add Type:=msoControlButton With .Controls(3) .Style = msoButtonCaption .Caption = "⇒メニュー3 " .OnAction = "Msg_3" End With End With End Sub Sub Msg_1() Application.CommandBars("選択します").Delete MsgBox "追加コマンド1を処理しました。" End Sub Sub Msg_2() Application.CommandBars("選択します").Delete MsgBox "追加コマンド2を処理しました。" End Sub Sub Msg_3() Application.CommandBars("選択します").Delete MsgBox "追加コマンド3を処理しました。" End Sub

  • Excelのマクロが動きません。

    エクセルのマクロを使っていたのですが2003から2010にバージョンを変えたところ、 マクロが動かなくなってしまいました。プログラムは下記です。 Sub AvailableFonts() Dim Ctrl As CommandBarComboBox Dim i As Integer Set Ctrl = Application.CommandBars("Formatting"). _ Controls("フォント(&F):") For i = 1 To Ctrl.ListCount ActiveSheet.Cells(i, 1).Value = Ctrl.List(i) Next i End Sub 「Set Ctrl = Application.CommandBars("Formatting"). _ Controls("フォント(&F):")」 の部分で「プロシージャの呼び出し、または引数が不正です。」とエラーが出てしまいます。 エクセル2010で動かすにはどう変えたらいいのでしょうか。 ご教授お願いします。

  • エクセル2007にコマンドバーはないのですか?

    Sub コマンドバー作成() Dim myBar As CommandBar Set myBar = CommandBars.Add(Name:="test") myBar.Visible = True End Sub これをしても何も起きないのですが、2007はコマンドバーがないのでしょうか? 2003の時はコマンドバーが作成されました。

  • VBAで縦一列に数字を入力したい

    Private Sub CommandButton1_Click() Dim n As Integer Dim i As Integer Dim x As Integer For i = 1 To n x = i + 3 n = InputBox("層数の値を入力してください") Cells(3, 1).Value = ("基板") Cells(x, 1).Value = i x = x + 1 Next End Sub 上記のようなマクロを組んだのですが、4行目に1が入ってとまってしまいました。 これを完成させるにはどうしたらいいでしょうか?

  • エクセルVBAでセル範囲のデータをクリップボードに

    セル範囲のデータをテキストとしてクリップボードに取り込みたいのです。 http://okwave.jp/qa/q5650002.html#16327676 の回答ANo2を見て Sub test01() Dim myData As DataObject Dim myCb As Variant Dim x x = "TESTデータです。" Set myData = New DataObject myData.SetText x myCb = myData.GetText myData.PutInClipboard End Sub は出来ました。 そこで、セル範囲A1:B3をクリップボードに貼ろうといろいろやってみました。 一応、下記でできましたが、実際にはもっと広い範囲を取り込みたいので、もっと簡単な方法はないでしょうか? Sub Clip() Dim myStr As String Dim myData As DataObject Dim myCb As Variant Set myData = New DataObject With Sheets(1) myStr = .Range("A1").Value & ":" & .Range("B1").Value & _ vbNewLine & .Range("A2").Value & ":" & .Range("B2").Value & _ vbNewLine & .Range("A3").Value & ":" & .Range("B3").Value End With myData.SetText myStr ', 1 myCb = myData.GetText If MsgBox("データ" & vbNewLine & myCb & " をクリップボードに送りますか? ", vbYesNo + vbQuestion, "確認") = vbNo Then Exit Sub End If myData.PutInClipboard End Sub

  • Excelのマクロについて

    文字列から数値だけを抽出するマクロを見つけたのですが、抽出するデータを選択してから実行しなければなりませんでした。 抽出するデータはAセル以下にしかないので、データを選択しないでも実行できるようにするにはどうしたら良いのでしょうか? 宜しくお願いします。 以下見つけたマクロです。  Sub test()  Dim mydata As String  Dim c As Range  Dim i As Integer  For Each c In Selection   mydata = ""  For i = 1 To Len(c)   If Mid(c, i, 1) >= 0 And Mid(c, i, 1) <= 9 Then   mydata = mydata & Mid(c, i, 1)    End If   Next   c.Offset(0, 1) = mydata   Next  End Sub

  • ListBoxで表示されたデータの取得方法は

    お世話になります。 標準フォーム から以下のリストボックスを表示して、無事シートの一覧が表示されています。 Private Sub UserForm_Initialize() Dim lastRow As Long Dim myData Worksheets("Sheet1").Range("a1:C35").Value = "" With Worksheets(Sheet) myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 3).End(xlUp)).Value End With With ListBox1 .ColumnCount = 3 .ColumnWidths = "20;70;100" .List = myData End With End Sub このリストボックスにはボタンが二つありボタン1を押したときに標準フォームへ[hinban] という変数にリストボックスでフォーカスしているデータを取り込みたいのですが以下の方法でうまくいきません。 Private Sub CommandButton1_Click() Dim lastRow As Long Dim i As Integer hinban = ListBox1.Column(pvargColumn:=1) End Sub もう一つのボタンは何もせずにリストボックスを閉じたいのですがこれで問題ないですか。 Private Sub CommandButton2_Click() Unload Me End Sub プログラム初心者でインターネットから寄せ集めのプログラムです。 どなたかお力をお貸しください。

  • 値渡しについて

    UserForm1で以下のように求めた値「R」を UserForm2に渡すにはどのようにすればよいのでしょうか。 **************************************** <UserForm1(コード)> Public R As Integer ----------------------------------- Private Sub CommandButton1_Click()    Dim N As Integer        :    N = TextBox1.Text    R= N * 2 + 3        : End Sub **************************************** <UserForm2(コード)> Private Sub CommandButton1_Click()   Dim i As Integer       :   For i = 4 To R       :   Next i       : End Sub **************************************** どなたか教えて下さい。

  • エクセルのマクロで複数セル指定は?

    以前(7月22日 質問No.936181)の質問でご回答を頂いたマクロなんですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim MyData As String Dim i As Integer Dim ImaNanji As String Dim SakkiNanji As String Dim ImaNanpun As String Dim SakkiNanpun As String SakkiNanpun = Cells(2, 3).Value ImaNanji = Cells(1, 3).Value ImaNanpun = Mid(ImaNanji, Len(ImaNanji) - 4, 2) If ImaNanpun <> SakkiNanpun Then Application.EnableEvents = False For i = 10 To 2 Step -1 MyData = Cells(i - 1, 2).Value Cells(i, 2).Value = MyData Next i MyData = Cells(1, 1).Value Cells(1, 2).Value = MyData Cells(2, 3).Value = ImaNanpun Application.EnableEvents = True End If End Sub A1のデータをB1からB10に一分おきにつぎつぎに書き込むというものなんですが、ひとつのセルではなく複数のセル(例えばA1からA30の30個のセル)をいっぺんに書き込むようにしたいのですが可能でしょうか? よろしくお願いします。

専門家に質問してみよう