- ベストアンサー
VBA ユーザーフォームのコードについて
下記の2つのコードの意味について教えて下さい。 Private Sub CommandButton1_Click() If ComboBox1 = "" Then ComboBox1.SetFocus・・・・・1 Exit Sub End If Application.Run (ComboBox1.List(ComboBox1.ListIndex))・・・2 End Sub 1と2がわかりません。 Private Sub UserForm_Initialize() TB = Array("マクロ1", "マクロ2", "マクロ3") Me.ComboBox1.List = TB End Sub 「Private Sub UserForm_Initialize()」と「Array」がわかりません。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> ComboBox2.List = TB2でコンボボックスに"マクロ4"、"マクロ5"、"マクロ6"を追加する の部分は Dim TB2 TB2 = Array("マクロ4","マクロ5","マクロ6") ComboBox2.List = TB2 を UserForm_Initializeイベントに追加します フォームに このマクロ起動用の新たなボタンを作成するか 既存のCommmandButton1を流用するかはご自身の判断になるかと思います 新規に作るのであれば CommandButton1_Clickとほぼ同様の記述になります 違うのは 検査対象が ComboBox2になる点です Private Sub CommandButton2_Click() If ComboBox2 = "" Then ComboBox2.SetFocus Exit Sub End If Application.Run (ComboBox2.List(ComboBox2.ListIndex)) End Sub といった具合でしょう
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
どのように上手くいかないのかを具体的に説明しましょう このコードだと ComboBox1で何も選択されていないとさいしょのIf文でComboBox1にフォーカスが設定されてイベントが終了になります この点はご理解いただけますか? どちらかのコンボで項目が選択されていたらマクロを実行したいということでしょうか となると 最初のif文を見直さないといけないですね dim n1 as integer, n2 as intger ' コンボボックスの選択項目を取得 n1 = ComboBox1.text n2 = ComboBox2.text if n1 = -1 and n2 = -1 then ' 両方とも未選択の場合 comboBox1.Setfocus exit sub else if n1 <> -1 then ' ComboBox1が選択 application.run Combobox2.list( n1 ) if n2<>-1 then ' comboBox2も選択されていた場合 application.run Combobox2.list( n2 ) end if else ' ComboBox1が未選択の場合 ' つまりComboBox2のみが選択 application.run Combobox2.list( n2 ) end if end if といった具合になるっともいます
お礼
ご回答ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
これ実験するには、初心者には、相当難しいが、質問者は出来ているのですね。念のため解説と注意点を書きます。 エクセルVBAでやってます (1)UserFoem1を挿入 (2)UserFoem1の上にテキストボクッスなど1つ以上張り付け フォーカス移動を実験するため (3)UserFoem1の上にコンボボックスを1つ張り付け (4)UserFoem1の上にコマンドボタンを1つ張り付け -- (5)標準モジュールに Sub マクロ2() MsgBox "マクロ2実行" End Sub などのようにマクロ○○に応じた,ダミーでも良いので、ルーチンを作る。採ったことが判るようにMsgBoxを入れる. マクロ1", "マクロ2", "マクロ3"・・の数に応じて作る。 -- (A)ユザーフォームの実行をクリックすると 自動的に、フォームを表示する前に Private Sub UserForm_Initialize()のルーチンを実行する TB = Array("マクロ1", "マクロ2", "マクロ3") Me.ComboBox1.List = TB は配列にマクロ1, マクロ2, マクロ3を納めて その順序で一括で、コンボのアイテムにこの順にAddする。 そしてフォームを表示する。 (B)フォームのコンボのアイテムを選択する。 例えば、マクロ2をクリックしておく。 (C)コマンドボタンをクリック 瞬間的にコンボにセットが無ければ、コンボにフォーカスが移る。 選択済みなので Application.Run (ComboBox1.List(ComboBox1.ListIndex)) が実行される。 (D)その中身は ComboBox1.ListIndexデ決まる。 マクロ2は2番目なので1がセットされ コンボの選択肢の中身はComboBox1.List(X) で表され、xは1なので2番目の、マクロ2という文字列が決まり Application.Run マクロ2 が実行され 実行されるとマクロ2を実行が出る。 -ー標準モジュール Sub マクロ2() MsgBox "マクロ2実行" End Sub 以下同類でマクロ1を作っておくこと。 ーーーフォームのイベントのコードに Private Sub CommandButton1_Click() If ComboBox1 = "" Then ComboBox1.SetFocus Exit Sub End If MsgBox ComboBox1.ListIndex Application.Run (ComboBox1.List(ComboBox1.ListIndex)) End Sub Private Sub UserForm_Initialize() TB = Array("マクロ1", "マクロ2", "マクロ3") Me.ComboBox1.List = TB End Sub
- redfox63
- ベストアンサー率71% (1325/1856)
1は コンボボックスが何も選択されていない状態の場合に コンボボックスにフォーカスをセットするということです フォーカスとは入力可能状態にするということ … ドロップダウンリストとか表示させて何かを選択させるため 2は コンボボックスで選択された名前のマクロを実行しなさい という命令です Arrayは配列をプログラムで作成するためのものです この場合 TBが TB(1),TB(2),TB(3)といった具合に"マクロ1"、"マクロ2"、"マクロ3"が格納されます ComboBox1.List = TBでコンボボックスに"マクロ1"、"マクロ2"、"マクロ3"が追加されます UserForm_Initializeは ユーザーフォームを呼び出す際の初期設定を行うプロシージャです これは決まりごとなので覚えるしかありません VBAのエディタ VBEで分からない項目にカーソル(キャレット) |を置き F1キーでヘルプを参照してみましょう
補足
ご回答ありがとうございます。 丁寧に解説していただいたので、良くわかりました。 恐れ入りますが下記の点についてもご教授いただければ幸いです。 上記コードの2の部分に以下を加えたいのです。 Application.Run (ComboBox2.List(ComboBox2.ListIndex)) また、ComboBox2は以下のようにしたいのです。 ComboBox2.List = TB2でコンボボックスに"マクロ4"、"マクロ5"、"マクロ6"を追加する。 よろしくお願いします。
補足
redfox63様、度々のご回答ありがとうございます。 >既存のCommmandButton1を流用するかはご自身の判断になるかと思います 今回、既存のCommmandButton1を流用したく下記の通りコードを追加しましたがうまく反応しません。 どこが誤っているのでしょうか? よろしくお願いします。 Private Sub CommandButton1_Click() If ComboBox1 = "" Then ComboBox1.SetFocus Exit Sub End If Application.Run (ComboBox1.List(ComboBox1.ListIndex)) If ComboBox2 = "" Then ComboBox2.SetFocus Exit Sub End If Application.Run (ComboBox2.List(ComboBox2.ListIndex)) End Sub