Excel VBA comboboxへの割り当て方法と引数の渡し方

このQ&Aのポイント
  • Excel VBAを使用して、comboboxに割り当てる方法について説明します。また、どのcomboboxから呼び出されたかを引数で渡す方法も解説します。
  • Excel VBA comboboxの割り当て方法と引数の渡し方について説明します。comboboxにSub Sub1を割り当てる方法や、どのcomboboxから呼び出されたかを引数で渡す方法について詳しく解説します。
  • Excel VBAでcomboboxにSub Sub1を割り当てる方法と、どのcomboboxから呼び出されたかを引数で渡す方法についてご紹介します。comboboxへの割り当て方法や引数の渡し方をわかりやすく解説します。
回答を見る
  • ベストアンサー

Excel VBA comboboxへの割り当て

下記コードにてcomboboxを任意の数作成しました。 このComboboxに Sub Sub1を割り当てたいのですが どうすればいいでしょうか、 (OnChange,Chaneはエラーでした) また、その際どのcomboboxからよばれたか引数で渡したいのですが どうすればいいでしょうか。 '---------------結果こうなるようにしたい Private Sub ComboBox1_Change() call sub1("コンボの名前") End Sub '----------combobox作成 With Worksheets("AAA").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False) .Left = X .Top = Y .Width = 100 .Height = 18 .ListFillRange = "LIST" .OnChange="sub1" ->エラーでした .Change="sub1" ->エラーでした End With

  • obone
  • お礼率51% (111/215)

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

  • ベストアンサー
  • Azzz___
  • ベストアンサー率40% (9/22)
回答No.1

こんにちは。 間違った解釈をしていれば、すみませんが、 多分、実装されたいことをするにはクラスモジュールが便利だと思います。 クラスモジュールで動的にコンボボックスを作成し、それをインスタンスとして参照するやり方です。 この方法では何個作成するかを意識しないで作った分だけ勝手に割り当てるようなイメージでできます。 それ以外の方法としては オブジェクト名に通し番号を付与するようにし、 vba.left(me.combobox1.name,1) 等とするFunction的なプロシージャを入れれば、該当するコンボボックスを発見することができると思います。 ただしこの方法だと、作ったコンボボックスの数だけ、各イベントにコードを書き込む必要があり、数が多いと面倒なのとメンテナンスが大変な気がします。 はずしてたらすみません。

obone
質問者

補足

ありがとうございます。 イメージはつかめるのですが、クラスモジュールが不慣れなためどこかサンプルのあるサイト等ごぞんじでしたらお教えください。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

http://okwave.jp/qa/q5626682.html に同じ質問をしているようだが、どうだったのか。 ーー OnAction(OnChangeなども)はメニューバーやツールバーでのコンボのコードでは出てくるが、シート上に設けた、コンボでは使えないのではないかな。 そのシートでコードの表示ででるVBE画面でGeneral部でComboBoxX、右側イベント部でドロップダウンに出てこない。 フォーム上やシート上やツールバー上などそれぞれコードに違いがあるから、安易に考えないこと。 普通は上記の答えにあるように、コンボボックスのComboBox1_Changeイベントなどで処理するはず。 ーー 上記に会った >Sheet1でComboBoxを何個貼り付けるか決定(1~100) そのあとSheet2に貼り付ける こんなことは、設計からして常軌を逸していませんか? あなた思いついたあなたのやりたい既定の方法でなく、別途質問に文章でどういう場合で、どういうことをやりたいのか、諸氏に聞いてみるべきだ。 素人の思いつきで、思った路線で突っ張って走り、難しい問題を投げているように思えてならない。 VBAではコントロール配列の仕組みもなく、沢山の同種のコントロールを作るとどれが動作したか識別するのに、難しい 仕組みを必要とすると思う。クラスの作成なんてやったこともないレベルではないですか。 場合によってはあきらめざるえないかも。何事も自分の力量に合ったものを考えざるを得ないのが世の常。 ーーー Private Sub ComboBox1_Change() call sub1("コンボの名前") End Sub 結果こうなるようにしたい なら OnChange="sub1" ->エラーでした .Change="sub1" ->エラーでした を書かなければ良いのではないですか。常識だが、何のことを聞いているのか?

obone
質問者

お礼

同じIDを複数で使っているので重複してしまいましたが、それにしても何様?

関連するQ&A

  • VBAで作成したComboboxにVBAでマクロを割り当てたい。

    下記コードでcomboboxをつくったのですが 作成されたCombobox1のComboBox1_Changeエベントに 標準モジュール内のSub cal をVBAで割り当てたいのですが可能でしょうか。 コンボボックス作成マクロ x=0 y=0 With Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False) .Left = X .Top = Y .Width = 53.25 .HEIGHT = 18 .ListFillRange = "AAA" End With これで作成したコンボボックスに標準モジュール内マクロをVBAで割りあてしたい。 標準モジュール sub cal ・ ・ end sub

  • VBAで任意の数のComboboxにListFillRange追加

    VBAで任意の数分Comboboxを作ります。 そのComboboxすべてのプロパティにListFillRangeを追加したいのですがうまくいきません。 お教え下さい。 コード X=0 Y=100 '------- for i=1 to mmm '<-mmmは変動 '------- '//コンボボックス作成 Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=X, Top:=Y, Width:=53.25, HEIGHT _ :=9.75).Select Selection.ShapeRange.ScaleHeight 1.15, msoFalse, msoScaleFromTopLeft Selection.ShapeRange.ScaleHeight 1.07, msoFalse, msoScaleFromBottomRight X=X+10 '------- next i '------- '//ここから下がエラーになる。 dim cmd as object For i = 1 To Worksheets("Sheet1").Shapes.Count cmb = ActiveSheet.Shapes(i).Name With Worksheets("Sheet1").cmb .ListFillRange = "AAA" End With Next i 環境Windows XP,Office 2003

  • ご教授ください。

    こんにちは。 MS Office (Excel)で、下記のソースがネット上で公開されていたのですが、細かいコマンドの意味がわからないので、解説頂けないでしょうか? <以下がソースです> Sub コンボボックス作成() Dim i As Integer For i = 1 To 20 Cells(i, 1) = "リスト" & i Next ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=Cells(1, 4).Left, Top:=0, _ Width:=120, Height:=24).Select With Selection .ListFillRange = "A1:A20" .Object.ListRows = 20 .Object.Font.Size = 32 End With Application.CommandBars("Control Toolbox").Visible = False Range("C1").Select End Sub 出来れば1行ずつ解説頂けるとありがたいです。 宜しくお願い致します。

  • オブジェクト名をVBAで指定する方法を教えてくださ

    VBAでワークシートにOLEObjectsのコマンドボタンを設置してるのですが ボタンのオブジェクト名をVBAで指定するにはどうすればいいでしょうか? Private Sub CommandButton1_Click() With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False) .Object.Name = "ボタン1" .Object.Caption = "ボタン" .Object.Font.Size = 9 .Width = ActiveCell.Width .Height = ActiveCell.Height End With End Sub を実行すると、 .Object.Name = "ボタン1" の部分で 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)」というエラーになります。 他のコードは大丈夫です。 オブジェクト名をVBAで指定する方法を教えてください。 当方エクセル2003です。

  • エクセルーマクローコマンドボタン表示を消す方法

    エクセルーマクローコマンドボタン表示を消す方法 下記マクロを書いて実行したところ、シートにコマンドボタンというのが付着しました。ファイルを上書きしたので、取れなくなりました。ボタンを消す操作はどうすればいいか。 Sub Macro2() ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _ , DisplayAsIcon:=False, Left:=300, Top:=200, Width:=94.5, Height:=25).Select End Sub

  • VBA オプションボタンの分類について

    http://okweb.jp/kotaeru.php3?q=1424026 でオプションボタンの表示に関して質問をした者です。 ボタンを自動作成する事はできたのですが例えば1日と15日に 休暇を取得した場合、ボタンが6つ表示されるのですが(1日分が3コ、15日分が3コ)、 この6つのボタンのうち1つしか選択ができません。 (2つ目を選択すると、前に入力していたものはチェックが外れる。) 日にちごとに、1つずつボタンを選択するようにするにはどうしたら良いのでしょうか? ちなみに、当該処理の今記述しているソースは以下のとおりです。 休暇情報の書き出しが終了するまでループで回しています。 ご教授ください。宜しくお願い致します。 '当日ボタン作成 Set objOLEToday = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=565, Top:=100 + objCnt, Width:=45.5, Height:=15.5) objOLEToday.Object.Caption = "当日" '事前ボタン作成 Set objOLEBefore = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=750, Top:=100 + objCnt, Width:=45.5, Height:=15.5) objOLEBefore.Object.Caption = "事前" '無断ボタン作成 Set objOLENotice = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=920, Top:=100 + objCnt, Width:=45.5, Height:=15.5) objOLENotice.Object.Caption = "無断" '表示位置設定 objCnt = 405.4 + objCnt

  • エクセルVBAで動的にコンボボックスを作成

    一枚のシートに動的に複数のコンボボックスとコマンドボタンを生成しようとしています。 標準モジュールのループでコントロールを生成していますが、一周は上手く回るのですが、2週目から コンボボックス作成MakeComboの中のここでおちると記載している部分でエクセルのアプリケーションエラーに なってしまい、エクセルが落ちてしまいます。 With clsExcel.objWs 'コンボボックスの位置を指定 Dim cmbPos As Range Set cmbPos = .Range(.Cells(k, 4), .Cells(k, 4)) 'コンボボックスを作成 Set m_objOLE_C = .OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False,DisplayAsIcon:=False, _ Left:=cmbPos.Left, Top:=cmbPos.Top, Width:=63, Height:=15) End With Dim objCmb As ComboBox Set objCmb = clsExcel.objWs.OLEObjects(m_objOLE_C.name).Object objCmb.Locked = False With objCmb '--コンボボックスに初期値をセット .AddItem "計", 0 .AddItem "推", 1 .AddItem "確", 2 .AddItem "積", 3 '-------------------------------------------- ' For j = 0 To 3 ' If strData = .List(j) Then ' .ListIndex = j '<-----ここでおちる ' Exit For ' End If ' Next j '-------------------------------------------- End With Set cmbPos = Nothing Set objCmb = Nothing Set m_objOLE_C = Nothing End Sub

  • イメージコントロールに画像をセット

    イメージコントロールに画像をセットしたいのですが、下記ではうまく動きません。 どうしたらよいでしょうか。 Private Sub Workbook_Open() ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _ DisplayAsIcon:=False, Left:=137.25, Top:=20.25, Width:=270, Height:= _ 154.5).Select Worksheets("Sheet1").Image1.Picture = LoadPicture("D:\My doc\My Pictures\11.jpg") End Sub

  • (VBA)スピンボタンの大量コピー(相対参照)

    お世話になります。質問させていただきます。 表題件ですが、EXCELにて 「A列にコントロールツールの"スピンボタン"をリンクセルを相対参照にして縦に大量にコピー(さらに増減値をデフォルトの1から10に変更)」したいと考えています。 以下に記載したVBAコードは、こちらと同様のQ&Aサイトにて見つけてきた「A列にコントロールツールの"チェックボックス"をリンクセルを相対参照にして縦に大量にコピー」するコードです。 先ずは参考までにご確認ください。 ----------------------------------------------------------------- Sub Checkbox連続作成() Dim myChk As Object Dim i As Long Dim Sakuseisuu As Long Dim StartCell As Range '--------↓ここを変更--------- Sakuseisuu = 20 'チェックボックスの作成数 Set StartCell = Range("A1") 'スタートする位置 '--------↑ここを変更--------- For i = 0 To Sakuseisuu - 1 With StartCell.Offset(i) Set myChk = ActiveSheet _ .OLEObjects.Add(classtype:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False, _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height) End With With myChk .LinkedCell = StartCell.Offset(i, 1).Address .Object.Caption = "" .Object.Value = False End With Next End Sub ------------------------------------------------------------------ 上記コードを参考に、「A列にコントロールツールの"スピンボタン"をリンクセルを相対参照にして縦に大量にコピー」すべく、コードを以下のように短絡的に書き換えてみましたが、エラーとなってしまいます。 ------------------------------------------------------------------ Sub SpinButton連続作成() Dim myspin As Object Dim i As Long Dim Sakuseisuu As Long Dim StartCell As Range '--------↓ここを変更--------- Sakuseisuu = 20 'チェックボックスの作成数 Set StartCell = Range("A1") 'スタートする位置 '--------↑ここを変更--------- For i = 0 To Sakuseisuu - 1 With StartCell.Offset(i) Set myspin = ActiveSheet _ .OLEObjects.Add(classtype:="Forms.SpinButton1.", _ Link:=False, DisplayAsIcon:=False, _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height) End With With myspin .LinkedCell = StartCell.Offset(i).Address .Object.Caption = "" .Object.Value = False End With Next End Sub ------------------------------------------------------------------ お詳しいかたがおられましたら、是非ともアドバイスを頂戴したく存じます。 さらにわがままを述べると、増減値をデフォルトの1から10に変更したく考えております。 何卒よろしくお願い申し上げます。

  • ComboBox1_Changeについて

    Private Sub ComboBox1_Change() Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox1.ListIndex ' ComboBox1 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容をC列から作成する .ComboBox2.RowSource = "Sheet1!C1" Case 1 .ComboBox2.RowSource = "Sheet1!C2" End Select End With End Sub コンボボックス1で選択された値に対して『Sheet1!C1』が 表示されるようにするには、『.RowSource』の部分に 適切な言語がありますでしょうか。 また、『.RowSource』は、こういう効果がある等 紹介しているサイトをご存知あれば教えてください。 (探してみたのですが、めぐり合えず)

専門家に質問してみよう