
Excelのワークシートでコンボボックスを設定する方法を教えてください。
「フォームコントロール」と「ActiveXコントロール」の違いがわかりません。
添付の画像の通りコンボボックスに西暦を入力(別シートに入力済みの値を表示するように設定)してあるのですが、ファイルを保存しているにも関わらず、再度ファイルを開くとコンボボックスの中のリストは空欄になってしまいます。
今は「ActiveXコントロール」のコンボボックスで設定しています。
コードは以下のように設定してみたのですが、設定内容や設定箇所が違うのでしょうか?
//////////////////////////////////////////////////////
Private Sub ComboBox1_DropButtonClick()
Dim sh As Worksheet
Set sh = Worksheets("マクロ")
Dim i As Integer
Dim lastRow As Integer
lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row
With ComboBox1
For i = 2 To lastRow
If ComboBox1 = "" Then
.AddItem sh.Cells(i, 1).Value
End If
Next i
End With
End Sub
//////////////////////////////////////////////////////
コンボボックスのリストの内容が消えてしまうので、
コードの内容は同じで以下のところにもコードを書いてみました。
//////////////////////////////////////////////////////
Private Sub Worksheet_Activate()
Dim sh As Worksheet
Set sh = Worksheets("マクロ")
Dim i As Integer
Dim lastRow As Integer
lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row
With ComboBox1
For i = 2 To lastRow
If ComboBox1 = "" Then
.AddItem sh.Cells(i, 1).Value
End If
Next i
End With
End Sub
//////////////////////////////////////////////////////
なんだかもう、訳がわからずぐちゃぐちゃです。
コンボボックスの中に値が入っていると、実行ボタンをクリックしたときは正常にやりたい結果を出すことが実現できます。
ファイルを閉じた後に再度開いてもコンボボックスの中に値があるようにするにはどうしたらよいのか、ド素人の私にご教授いただきたくお願いいたします。

No.1ベストアンサー
- 回答日時:
こんにちは。
> ファイルを閉じた後に再度開いてもコンボボックスの中に値があるようにするにはどうしたらよいのか、
真っ先に解決に向かいましょう。
ご提示の2つのプロシージャは使いません。無効にする必要があります。
(資料として残すなら、コメントブロックしておきます)
その他にもComboBox1のリストを設定するプロシージャがある場合はすべて無効にします。
ComboBox1 のListFillRangeを指定します。
◆手順◆
1)Excelをデザインモードに切り替え。
VBE画面のメニューバー[Sub/ユーザーフォームの実行ボタン]の右横辺りに、
三角定規みたいなアイコンの[デザインモード]ボタンがあるので、これをクリックして凹んだ状態にします。
2)(ComboBox1が配置された)シートを表示し、(ComboBox1)を右クリック
表示されたポップアップの中から
3)[プロパティ]を選択
表示されたプロパティウィンドウの中の
4)[ListFillRange]というプロパティ(項目)の右横の値を入力する欄(空欄)に
リストの元になるデータ(テーブル)のアドレスをExcel数式のセル参照の要領で
「マクロ!A1:A14」とか「マクロ!A2:A15」のように"A1形式"で指定してEnterキーで確定します。
(例は、リストの元データのシート名が"マクロ"、1999から2012(14件)の例です。)
今の時点で必要なだけの大きさで指定しておきます。
5)Excelのデザインモードを解除。
手順1)で凹ませた[デザインモード]ボタンを再度クリックして元に戻します。
6)実際にComboBox1のリストを選択してComboBox1の値をしていします。
7)ブックを上書き保存。
手順、以上です。
あとは、年に1回、年次を増やす時に、上述の手順で、ListFillRangeを指定し直します。
///////
少しアドバイス。
通常は、リストの変更を忙しく繰り返すようなことはしません。
何か特別な事情があってのことなら、その事情についてよく考えて、相談すればいいと思います。
リストを変更する、ということは、選択した値も変えることになり兼ねないですし、
リストをクリア(ComboBox1.Clear)しないで.AddItemするのは、リストの重複を招くことになります。
それと、Private Sub ComboBox1_DropButtonClick() というイベントプロシージャですが、
「選択項目のリストをドロップダウンで表示するか、または非表示にすると発生します。」
と、こちらも随分忙しいイベントなので、扱いは難しいですし、用途も限られます。
多分、このイベントに手を付けたことが今回一番の間違いです。
ComboBox1については、Private Sub ComboBox1_Change() ぐらいで済ませられる内容のようにお見受けします。
///////
今回の回答では、ActiveXのComboBoxコントロールについて、
固定のリストと指定した値を保持するように
ListFillRangeプロパティの扱いを説明しました。
他にも方法は色々ありますが、こちらに伝えられている限りの"必要"
に対しては、この方法で"十分"かと考えます。
つまり。一番簡単な(そして保守的な)解決策です。
リストの設定に関して、都度都度.AddItemしなければならない"必要"
があるということでしたら、補足欄にでも書いてみてください。
理由がこちらにも理解出来内容でしたら、改めて対応します。
オマケ。
' ' ///
Private Sub ComboBox1_Change()
Dim vTgYear As Variant
vTgYear = ComboBox1.Value
Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年"
End Sub
' ' ///
以上です。
この回答への補足
ご回答ありがとうございました。ワークシート上でのコンボボックスの扱いは解決しそうです。頂いたアドバイスを拝読致しまして、ユーザーフォームのコンボボックスの扱いについて不安になって参りました。【http://okwave.jp/qa/q8501720.html】にて質問を新たにさせていただきましたのでアドバイスを頂戴いたしましてもよろしいでしょうか?お忙しい中申し訳ございませんが、何卒よろしくお願い申し上げます。
補足日時:2014/03/05 23:14ありがとうございました。無事に解決しました。もう一つの質問の方にも回答いただきましてありがとうございました。本当に心より感謝申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) Excel VBA ユーザーフォーム1のコンボボックスに別ブックの値を反映させたいです。 6 2023/03/21 16:12
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DataGridViewで行の展開みたい...
-
Wordテキストコントロールが未...
-
テキストボックス(VBA)でEnter...
-
C# TEXTが空白であるLABELは何...
-
エクセル VBA ユーザーフォーム...
-
ユーザーフォームに日付を表示...
-
ListViewでのリスト表示(初歩...
-
カスタムコントロールInputMan...
-
リストコントロールのデータの...
-
エクセル入力規制リスト行数
-
checkbox付きListViewで デフ...
-
ADOのCursorLocationプロパティ
-
Enabled=Falseのテキストボック...
-
ListViewで1つを選択して詳細...
-
VB6でPNGファイルを扱うには?
-
デザインモードを解除すると消...
-
TreeViewでToolTipTextを表示し...
-
VBで、tableの列を動的に増やす...
-
VC++でエクセルのような表
-
VBのデータグリッドが表示され...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックス(VBA)でEnter...
-
Wordテキストコントロールが未...
-
エクセルの画像にツールチップ...
-
ユーザーフォームに日付を表示...
-
C# TEXTが空白であるLABELは何...
-
エクセル入力規制リスト行数
-
MSFlexGrid
-
コンボボックスの高さを変更し...
-
ACCESS2010 ActiveXコントロー...
-
Enabled=Falseのテキストボック...
-
VB6でLabelの最前面にText Box...
-
ADOのCursorLocationプロパティ
-
DataGridViewで行の展開みたい...
-
checkbox付きListViewで デフ...
-
VB2005 コードでのコントロー...
-
チェックボックスの文字色の変え方
-
VB6でPNGファイルを扱うには?
-
PictureBoxの背景色変更(VB.NET)
-
VB.NETで縦書表示をしたいので...
-
MFCでbitmapを背景にしてstatic...
おすすめ情報