Excelワークシートでのコンボボックス設定方法と値保存の問題解決方法

このQ&Aのポイント
  • Excelのワークシートでコンボボックスを設定する方法と値保存の問題解決方法について詳しく教えます。
  • フォームコントロールとActiveXコントロールの違いについても解説します。
  • コンボボックスのリストがファイルを閉じて再度開くと空欄になる問題に対する解決方法を紹介します。
回答を見る
  • ベストアンサー

Excelのワークシートでのコンボボックスについて

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 ////////////////////////////////////////////////////// なんだかもう、訳がわからずぐちゃぐちゃです。 コンボボックスの中に値が入っていると、実行ボタンをクリックしたときは正常にやりたい結果を出すことが実現できます。 ファイルを閉じた後に再度開いてもコンボボックスの中に値があるようにするにはどうしたらよいのか、ド素人の私にご教授いただきたくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答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 ' ' /// 以上です。

minminwamidori
質問者

お礼

ありがとうございました。無事に解決しました。もう一つの質問の方にも回答いただきましてありがとうございました。本当に心より感謝申し上げます。

minminwamidori
質問者

補足

ご回答ありがとうございました。ワークシート上でのコンボボックスの扱いは解決しそうです。頂いたアドバイスを拝読致しまして、ユーザーフォームのコンボボックスの扱いについて不安になって参りました。【http://okwave.jp/qa/q8501720.html】にて質問を新たにさせていただきましたのでアドバイスを頂戴いたしましてもよろしいでしょうか?お忙しい中申し訳ございませんが、何卒よろしくお願い申し上げます。

関連するQ&A

  • ExcelVBAでのユーザーフォームについて

    ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() 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 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 ComboBox1_Change()   Dim vTgYear As Variant   vTgYear = ComboBox1.Value   Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。

  • オプションボタン選択でコンボボックス有効

    ExcelVBAでユーザーフォームを作成しているのですが、昨日までうまく動作していたことが、突然動かなくなりました。 オプション1を選択 ↓ コンボボックス1有効  ※他のコンボボックスは無効 ↓ オプション2を選択 ↓ コンボボックス2有効  ※コンボボックス1も含め他のコンボボックスは無効 という感じで動作させたいです。 書いたコードはこんな感じです。 Private Sub OptionButton1_Click () Dim i As Long Dim lastRow As Integer lastRow = Cells(Row.Count, 1).End(xlUp).Row If OptionButton1.Value = True Then OptionButton1.Enabled = True With ComboBox1 If ComboBox1 = "" Then For i = 2 To lastRow .AddItem Worksheets("sheet1").Cells(i, 1).Value Next i End If End With ComboBox1.ListIndex = 0 ComboBox2.Enabled = False ComboBox3.Enabled = False End If End Sub コードの間違いや改善点などありましたら教えて下さい。 よろしくお願いします。

  • ExcelVBAコンボボックス選択時の処理

    ExcelVBAで教えて下さい。 ユーザーフォームを作成しているのですがその中の機能の一部で、「コンボボックスを選択した内容に応じてラベルに表示させる」ということをしたいのですがうまくいきません。 コンボボックスにはSheet2の内容を表示するようにさせています。 Private Sub ComboBox_DropButtonClick() Dim i As Integer Dim LastRow As Integer With ComboBox LastRow = Cells(Row.Count, 1).End(xlUp).Row For i = 3 To LastRow .AddItem Worksheets("Sheet2").Cells(i, 1).Value Next i End With End Sub Sheet2の1列目には「2002年_H14」「2003年_H15」という書式で「2012年_H24」まで入力されています。 For i = 3 To LastRow としたのは、コンボボックスから選択した結果をラベルに表示させるとき、選択した年の前後2年を合わせた合計五年間を「2002~2006年」と表示したいためです。 <例> ・コンボボックスで「2004年_H16」選択   ↓ ・ラベルに「2002~2006年」と表示 コンボボックスのChangeコードはコンボボックスに入っている値が数字だったのみしか書けませんでした。 Private Sub ComboBox_Change() Dim i As Integer With ComboBox If .ListIndex = 0 Then i = .List(ListIndex, 0) Label.Caption = (i - 2) & "~" & (i + 2) & "年" End If End With End Sub もしくは Label.Caption = ComboBox.Value - 2 & "~" & ComboBox + 2 & "年" これだと「2002年_H14」というようにコンボボックスに入っていた場合はえらいになってしまい、どうにもなりません。うまくいったとしても「_H14」の取り除き方が分かりません。 実際に実現している画面を見せてもらったのですがコードまでは見てなく、仕組みが分からないのと、作成者不明という感じのものなので聞くに聞けずここに頼った次第です。 ご存じの方いらっしゃいましたらお知恵を拝借したく、何卒よろしくお願い致します。

  • ExcelVBAコンボボックスの値の入力

    ExcelVBAでマルチページでユーザーフォームを作っています。 マルチページを作製しているシートのシート2とシート3にそれぞれコンボボックスに当てはめる値を入れてあります。 コンボボックス1には「シート2のA2から最後」まで。 コンボボックス2には「シート3のA1から最後」まで。 というように設定してあります。 コードの記述としてはこんな感じでしました。 Private Sub ComboBox1_DropButtonClick() Dim i As Integer Dim lastRow As Integer lastRow = Cells(Row.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem Worksheets("Sheet2").Cells(i, 1).Value End If Next i End With End Sub これはコンボボックス1の場合なのですが、2は一部を変えています。 コンボボックスを選択時にシートに記載してある内容は表示されるのですが、行が多い方に引っ張られる感じになっています。 コンボボックス1の方は今のところ30行ちょっとなので、その分のデータが表示されます。コンボボックス2の方は今のところ10行程度なので、全てを表示した後に空白が表示されています。見た感じで、シート3のデータと空白分を合わせて、シート2つまりは、コンボボックス1と同じ分だけ表示しようとしているみたいなのです。 よく分からないエラーなのですが、これを回避する方法はありますでしょうか?

  • エクセルVBAのコンボボックス

    エクセル2002使用です。 生年月日とかを入力できるコンボボックスを作っているのですが、同じコンボボックスを5つ作ろうとしています。例えば和暦を入力するには Private Sub userform_initialize() With ComboBox(1) .AddItem "昭和" .AddItem "平成" End sub でうまくいくのですが、2個目から5つ目まで同じものを作成する場合、 With ComboBox(2) ・・・ With ComboBox(3) ・・・ と、コードを記述していかないと駄目なのでしょうか? できれば With ComboBox(1: 5) とか、 変数を使って Private Sub userform_initialize() Dim i As Integer For i = 1 To 5 With ComboBox(i) .AddItem "昭和" .AddItem "平成" End With Next End sub といった具合にまとめたいのですが、コンパイルエラーとなってしまいます。 初歩的な質問で申し訳ないのですが、よろしくお願いします。

  • ExcelVBAでコンボボックスに初期値設定

    ExcelVBAでユーザーフォームを作成しています。 表示したときにコンボボックスに「選択して下さい」と表示させる方法を教えて下さい。 コンボボックスで「2003年_H15」~「2012年_H24」が選択できて、選択するとラベルに「2002~2004年」のように表示されます。 【コンボボックス:選択】2003年_H15 【ラベル:表示】2002~2004年 コンボボックスの値はSheetから設定しています。 ユーザーフォームを表示させたときにコンボボックスに「選択して下さい」と初期値として設定するにはどうしたらよいか教えて下さい。 Sheetに追加するとかんたんなのですが、ラベルに表示させるために、以下のようなコードを書いていたりするので、うまく動きません。 Private Sub ComboBox_Change() Dim sh As Worksheet Set sh = Worksheets("Sheet1") With ComboBox If .ListIndex >= 0 Then Label.Caption = Left(sh.Cells(.ListIndex + 1, 1), 4) _ & "~" & Left(sh.Cells(.ListIndex + 3, 1), 4) & "年" End If End With End Sub よろしくお願い致します。

  • Excel VBAのコンボボックス

    お世話になります。 コンボボックス1と2と3は選択されますが コンボボックス4には何の表示もされません。 選択して条件設定は4つ以上できないのでしょうか? Dim ITE As Variant Dim flg As Variant Private Sub ComboBox3_Change() 'ComboBox4セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text KEY3 = Me.ComboBox3.Text Me.ComboBox4.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 Then ITE = .Cells(ico, 4).Value flg = 0 For I = 0 To Me.ComboBox4.ListCount - 1 If ITE = Me.ComboBox4.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox4.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox4.SetFocus End Sub

  • エクセル2010 シート上のコンボボックス

    エクセル2010を使用しております。 シート1にコンボボックス1(アクティブXコントロール)を設置しており、 コードは下記です。 Private Sub ComboBox1_DropButtonClick() Dim i As Long With Worksheets("シート操作").OLEObjects("ComboBox1").Object .Clear    For i = 1 To 100 .AddItem i Next i End With End Sub コンボボックス1のドロップボタンで リスト1~100の数字の中から、任意の数字を選び テキスト表示部分に表示させたいだけなのですが、 上記コードではリストから選択しても何も表示されません。 コードの誤りと詳しい説明を希望します。 よろしくお願いいたします。

  • 同じコンボボックス、リストボックスを使うには?

    よろしくお願いします。 今、ユーザーフォームを使って製造計画表を作っています。 コンボボックスで会社名、リストボックスで会社ごとの製品名を選択させるとこまで出来ました。 1日に3つの製品を作ることが出来るので、同じ中身のコンボボックス、リストボックスを使って3つ作りたいと思っています。 ユーザーフォームの形的にはこのような感じですが。 1. コンボボックス  リストボックス 2. コンボボックス  リストボックス 3. コンボボックス  リストボックス 今は、1.のとこだけは出来たのですが、2.3.は1.と同じコードをコピーして必要と思われるとこだけをコンボボックス2と変えたりしてみたのですが、上手くいきませんでした。こんなコードですが。 Private Sub UserForm_initialize() 'ComboBox1セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("Sheet1") Do While .Cells(1, ico) <> "" Me.ComboBox1.AddItem .Cells(1, ico).Value ico = ico + 1 Loop End With Me.ComboBox1.SetFocus End Sub Private Sub ComboBox1_Change() 'ListBox1セット Dim ico As Long 'Me.ListBox1.Clear ico = Me.ComboBox1.ListIndex + 1 With ThisWorkbook.Worksheets("Sheet1") Me.ListBox1.List = .Range(.Cells(2, ico), _ .Cells(.Cells(Rows.Count, ico).End(xlUp).Row, ico)).Value End With End Sub VBAも初めたばかりで質問の内容もわかりづらいとも思いますが、よろしくお願いします。

  • ユーザーフォームで使うコンボボックスの変数について

    ユーザーフォームで使うコンボボックスの変数について お世話になります。 エクセル2003で、ユーザーフォームを使った入力を考えています。 vbaのコードを作成中なのですが、 素人ながらFor Next とWithをつかった構文で 作り始めています。 作成中にふと思い、質問させていただきました。 ---------------------------------------------- Private Sub UserForm_Initialize() Dim i1 As Single Dim i2 As Integer With ComboBox101 For i1 = 5 To 40 Step 2.5 .AddItem i1 Next End With With ComboBox102 For i2 = 1 To 10 .AddItem i2 Next End With With ComboBox103 For i2 = 1 To 6 .AddItem i2 Next End With With ComboBox104 For i2 = 1 To 10 .AddItem i2 Next End With End Sub ---------------------------------------------- 上記コードにおいて、 ComboBox101については、小数以下の値が必要なため、変数はSingle 他のものについては、整数のため、Integerとなります。 ComboBox103から、変数の条件が同じため、そのまま同じ変数を使用しております。 個々のコンボボックスがWithで囲まれており、なおかつその中にFor Nextが含まれていますので、 問題はないのかなぁと思っていますが、はっきりとした確信が持てません。 コンボボックスでのドロップダウンリストを作成する際、この変数の再利用については 問題ありませんでしょうか? ご存知の方がいましたら、教えてください。よろしくお願いします。