スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Excel VBA コンボボックスに値を格納する

備忘録

エクセルのVBAを使用して、コンボボックスを配置、値を格納する方法


の前に、エクセルの機能で、入力規則ってのを使うと簡単にセルをリストボックス化できる。

1_2013081223242175e.png

入力規則は、格納したい値をセルの範囲指定するか、コンマで区切ることで格納できる。

これは簡単なんだけど、コンボボックスにすると何がいいんだろうか???

オブジェクトとして扱うことで、データを拡張するときにVBAのコードをちょこちょこっと書き換えるだけで良い点だろうか?



コンボボックスは、開発タブの挿入から配置できる。開発タブはデフォルトで非表示のはず。各自設定。

調べりゃいくらでも出てくるので、割愛。

1_201308122331500a3.png

アクティブXコントロールとフォームコントロールがあるけど、

個人的にはアクティブXのが好きかな。

たぶん、違いとしては、具体的にコードを記述できるか、どうか・・・
アクティブXのほうは、クリックされたタイミングで○○させたいとか、値が変わったら□□させるとか、変化に強い感じかなあ?

フォームコントロールは、単にマクロを登録するだけなのかな?

アクティブXは、デザインモードにしてからオブジェクトをダブルクリックでVBEが立ち上がるから便利。
そこにイベントごとのコード記述するだけだもんな。


VBEは Alt+F11でも起動可能。もちろん、開発タブのVisualBasicからでも可能。


1_20130812234435af3.png

こんなの作りたくて、格納するデータがセルにあらかじめ入力されているなら、範囲指定するだけ。

入力規則みたいに、その場で1つずつ設定も可能。こちらも格納したいデータをコンマで区切ってしていするだけ。


コードはこんなの書いたらええねんな。



Private Sub Workbook_Open()
With Sheet3
With .ComboBox1
.Style = fmStyleDropDownList
.Clear

.List = Range("A1:A5").Value
End With
End With

End Sub


シート名指定して、その中のオブジェクト名指定して、やりたいこと書くってのが基本かなあ

Sheet1.ComboBox1.Style = ~
Sheet1.ComboBox1.ClearContents
Sheet1.CpmboBox1.List = Range("A1:A5").Value

何回もシート1って書くのは手間なので、Withで省略!
適当な文字にセットしてもよろし。

ClearContentsのがちゃんと動くかな。

ちなみに、これは、ファイル起動時に処理されるようにしています。というのも、処理されるタイミングを指定できるんですね。


ファイル起動時に処理したかったら、Workbook_Openの中に書けばいい。

Styleってのは、コンボボックスに格納されたデータのみ入力を受け付けるか、それ以外の入力も受け付けるかどうかの設定。

勝手な入力されて困るならfmStyleDropDownList


あと、追加でデータ選択後、消せない、消せない、消せない

これは、BackSpaceキーもしくはDeleteキー押下で、コンボボックスの表示を空にしてやればいい。

1_201308130004214f7.png


KeyDown時、つまり何かキーが押された時に実行するようにしたら良い。キーはキーコードで指定。

1_201308130004597ab.png


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 8 Or KeyCode = 46 Then 'キーコード8はBackSpace、46はDeleteに対応
KeyCode = 46 'KeyCodeを強制的に46(Delete)とすることで対応
ComboBox1.ListIndex = -1 'コンボボックスの表示を空にする
End If
End Sub



理論的には、BackSpaceキーかDeleteキーが押された場合、コンボボックスのリストインデックスをー1に設定することでコンボボックスを空にしたいが、

なんでやろ、バックスペースキーの場合、上手くいかなかったので、ComboBox1.ListIndex = -1 の前にKeyCode = 46と記述すると上手くいった。


以上。



2013/11/03追記
keydownイベントのときにkeycodeを数値指定しているのは、非常にわかりにくいので、以下に修正。

keydownイベント

VBAで用いられる定数を使用して記述すると、可読性が向上する。

→VBA定数一覧


そして、複数のコントロールに対して同じ処理を記述しなければならない場合、共通化しようということで・・・


keysown改シート


こんなときは、こうする。

keydown改

共通関数として、ひとつ処理を記述してしまえば、あとはそいつを引数を指定してCallするだけです。

→引数 ByVal ByRef?




スポンサーサイト
効率よく、要領よく | Home | 半沢直樹オレたちバブル入行組、花のバブル組

Comment

Post comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。