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件)
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示
どのように上手くいかないのかを具体的に説明しましょう
このコードだと 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
といった具合になるっともいます
この回答へのお礼
ご回答ありがとうございました。
No.3ベストアンサー20pt
> 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
といった具合でしょう
この回答への補足
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
No.2ベストアンサー10pt
これ実験するには、初心者には、相当難しいが、質問者は出来ているのですね。念のため解説と注意点を書きます。
エクセル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
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"を追加する。
よろしくお願いします。
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示












