午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

エクセルVBAのコンボボックスに画像を表示したかったお話

コンボボックス(ComboBox1)に画像を表示したかったお話

結果はコンボボックスに画像は表示できなかったので
Frameコントロールと、Lavelコントロールを組み合わせて
擬似的なコンボボックスを作成して解決 
 
線の種類を選ぶときに文字ではなく図から選びたかった

f:id:gogowaten:20191018113034p:plain

↑こんなふうにしたかった
 
できあがったのは

f:id:gogowaten:20191018113046p:plain

これ
 
イメージ 13
 

f:id:gogowaten:20191018113105p:plain

エクセルVBAにはコンボボックスっていう便利なコントロールがあるけど
文字だけで図、画像は表示できない
 
ググって
画像も表示するには
VBA全般:「画像付のコンボボックス表示」 - 意の中のカワズ(35歳の壁 別館)
ここを見ると
ImageListとImageComboboxっていうコントロールを使えばいいみたいなんだけど
僕の環境のWindows8.1とエクセル2007では使えない

f:id:gogowaten:20191018113117p:plain

こんなエラーが出てImageListに画像が登録できない
次のクラスは登録されていません。 次の CLSID オブジェクトを参照してください。:{7EBDAAE1-8120-11CF-899F-00AA00688B10} 
ググって
[PRB] プロパティ ページを開くと "クラスは登録されていません" と表示される
を見ると
Msstkprp.dllっていうファイルが必要みたいなんだけど無いよ
どうやら昔のエクセル、エクセル2000とかには入っていたらしい
今更昔のエクセルがないと動かないようなアドインは作りたくない!
ってことでImageListを使うことは諦めて(諦める力発動)
別の方法
Private Sub CommandButton1_Click()
    Me.Frame1.Visible = Not Me.Frame1.Visible 'フレームの表示のオンオフ
End Sub

Private Sub Label項目1_Click()
    Me.Label選択した画像.Picture = Me.Label項目1.Picture 'Label選択した画像の画像を自分と同じにする
    Me.Frame1.Visible = False 'フレーム1の非表示
End Sub

Private Sub Label項目2_Click()
    Me.Label選択した画像.Picture = Me.Label項目2.Picture
    Me.Frame1.Visible = False
End Sub

Private Sub UserForm_Initialize()
    Me.Frame1.Visible = False
    'Sheet1にあるImageコントロールの画像をLabel項目1と2に割り当てる
    Me.Label項目1.Picture = ThisWorkbook.Sheets("Sheet1").ImageLine直線.Picture
    Me.Label項目2.Picture = ThisWorkbook.Sheets("Sheet1").ImageLineダッシュ.Picture
End Sub
 
 

f:id:gogowaten:20191018113144p:plain

プロシージャはこんな感じ

デザイン画面はだいたいこう

f:id:gogowaten:20191018113153p:plain

フレームとコマンドボタンとラベルまたはイメージを組み合わせて作ることにした
画像のリストにするからイメージコントロールでいいかと思ったけど
文字も載せられるラベルの方がいいってのは作り終わってから気づいた
 

f:id:gogowaten:20191018113206p:plain

それぞれのコントロールの名前はこうした
フレームの中にラベルを移動して、ラベルには枠を付けたところ
フレームがリストの一覧表示になってラベルが項目になる
ラベルを一個増やしたのは表示用

リストに表示する画像の登録は

f:id:gogowaten:20191018113217p:plain

ワークシート上にある画像をユーザーフォームで使うには ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
メモしておいてよかった、ほんとすぐ忘れるw
 
 
アドインにしないならLabelコントロールへの画像の登録はもっと簡単で

f:id:gogowaten:20191018113228p:plain

LabelコントロールのPictureプロパティにそのまま画像を指定すればいい
 
イメージ 12
できあがり
リストを表示したらリストかボタンを押さないとリストが出たままになるとか
細かい点は気になるけど気にしない

 
リスト項目に文字も表示したい時は
イメージ 11
LabelプロパティのCaptionに表示したい適当な文字を入れて
PicturePositionを1にして実行してみると
イメージ 10
文字列の長さで画像の位置が揃わないな…
どうしても揃えたかったら文字も画像で登録するしか無いかな
 
ダウンロード
ファイル名:コンボボックスに画像を表示したかったお話_バックアップ用.xlsm