- ベストアンサー
ExcelVBAでのユーザーフォームについて
- ExcelVBAでのユーザーフォームの作成方法についてアドバイスをいただきたいです。
- ユーザーフォームでのマルチページやコンボボックスの記述方法に問題があります。
- ラベルに結果を表示させる際のコードに誤りがあるかどうか確認したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 前スレ(http://okwave.jp/qa/q8500168.html)に続き回答します。 とりあえず、 Private Sub ComboBox1_DropButtonClick() については、削除した方が、要求に合っている筈です。 Private Sub UserForm_Initialize() Private Sub ComboBox1_Change() は、そのままでも問題なく動作することを確認しました。 UserForm_Initializeイベントは、 UserFormを最初に読み込むタイミング、 平たく言うと、UserFormを最初に作成する(呼び出す)タイミング、に発生します。 その後でUserFormが表示されます。 UserForm_InitializeイベントでComboBoxのリストを設定したならば、 UserFormを閉じたり、UnLoadするか、VBAプロジェクトがリセットされる (UserFormの閉じるボタン、UnLoad UserForm1 を実行、VBEのリセットボタンを押したりエラー発生時にそのまま終了した場合等) までは、リストの内容が保持されます。 なので通常は、UserForm_InitializeイベントでComboBoxのリストを設定したならば、 UserFormが開いている間にリストを再設定する必要はない筈です。 もし必要あるとすれば、UserFormが開いている間に、 リストの元になる"対象年"のセル範囲データを編集・更新している場合が考えられますが、 設問からして、UserFormが開いている間に"対象年"を増やす、なんてことはないでしょうから、 リストの設定についてはUserForm_Initializeイベントで完結しているものと考えて、 他のプロシージャで余計なことをしない様に頭の中を切り替えた方が良いのだと思います。 > クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 この問題は、ComboBox1_DropButtonClickイベントを削除することで解決します。 ComboBoxのリスト設定、と、 ComboBoxの値が変更されたタイミングでLabel1のキャプションを変更する、 ということについて、必要最低限の記述は、こんな感じです。 ' ' /// 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 sh.Cells(i, 1) <> "" Then .AddItem sh.Cells(i, 1) End If Next i End With End Sub ' ' /// Private Sub ComboBox1_Change() Dim vTgYear As Variant vTgYear = ComboBox1.Value If vTgYear = "" Then Label1.Caption = "" Else Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End If End Sub ' ' /// 以上、ご提示の記述を元に、一部削除、一部修正しています。 /////// 前スレとの関連で気になっているのですが、 大前提として、UserFormの中身はUserFormが開いている間しか保持されません。 例えば、ComboBoxのリストから 2007 を選択したとして、 その状態をComboBoxが記憶してくれるようなことはありません。 無論、ブックを上書き保存しても同じことです。 この点、前スレで説明した、シート上に配置したActiveXコントロールとは、 全く勝手が違いますので、少しフォローしておきます。 一番解り易く簡単そうな方法は、ComboBoxの値が更新される度に、どこかのセルに記録しておく方法です。 例えば、仮に、"対象年"シートのセルB1を割り当てて例を示すと、以下のようになります。 ' ' /// 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 sh.Cells(i, 1) <> "" Then .AddItem sh.Cells(i, 1) End If Next i .Value = sh.Cells(2, "B") End With End Sub ' ' /// Private Sub ComboBox1_Change() Dim vTgYear As Variant vTgYear = ComboBox1.Value With Worksheets("対象年").Cells(2, "B") If .Value <> Val(vTgYear) Then .Value = vTgYear End With If vTgYear = "" Then Label1.Caption = "" Else Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End If End Sub ' ' /// 以上です。
その他の回答 (1)
- nofx35
- ベストアンサー率82% (14/17)
こんばんは。 DropDownClick()はまるっといらないと思います。 既にInitializeでコンボボックスにAddItemしていますから。 DropButtonをクリックすると、未入力・未選択だとご提示のコードでは AddItemされてしまいます。 ラベルへの表示は、コンボボックスが未選択、または未入力の場合を考慮すると Private Sub ComboBox1_Change() Dim vTgYear As Variant If ComboBox1.Value <> "" Then vTgYear = ComboBox1.Value Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" Else Label1.Caption = "" End If End Sub でしょうか。 * 綺麗なフォームですね。頑張って下さい。
お礼
ありがとうございました。また、フォームもほめていただきありがとうございました。がんばりたいと思います。
お礼
ありがとうございました。また、コンボボックスの値をセルに反映させて保存するというアドバイスもありがとうございました。ずっと気になっていたことが解決しました。本当にありがとうございます。心から感謝致します。