3 つのケースを区別する必要があります。
- インライン リスト要素によるデータ検証 (例: Source = "1;2;3;4;5")
- 範囲内のリスト要素によるデータ検証
- リスト/コンボボックス
ケース 1 はおそらく最も困難です。なぜなら、リスト要素に文字列でしかアクセスできず、それらを配列に分割し、現在の選択のインデックスを取得し、必要な結果を得るために 2 つのボタンでインデックスを移動する必要があるためです。
ケース 2 は少し単純ですが、ここでも、日付を定義する範囲内で現在の位置を追跡する必要があります。
ケース 3 はおそらく実装が最も簡単ですが、次のような特定のコーディング作業が必要です。
- 最初に表示する前に日付のリストをリスト/コンボ ボックスにロードします (OnLoad または OnActivate)
- UP ボタンと DOWN ボタンのコードを作成して、自動ラップアラウンドでリスト ボックスのインデックスをインクリメント/デクリメントします。
4番目のケースを提案します... ActiveXスピンボタンを使用します...これは、1つの要素で上下の機能を提供します:
- 垂直の名前付き範囲DateListで日付のリストを作成します
- スピン ボタンのインデックス用にもう 1 つのセルを予約し、DateIndexという名前を付けます。
- 開発者リボンを使用して、ActiveX スピン ボタンを挿入します (デフォルト名はSpinButton1です) 。
- SpinButton1の LinkedCell プロパティを DateIndex に設定します(開発者/デザイン モードであることを確認してください。スピン ボタンを右クリックし、[プロパティ] を選択します) 。
- 次のコードを作成します (まだデザイン モードで、SpinButton を右クリックして [コードの表示] を選択します)。
コード
Private Sub SpinButton1_SpinDown()
If SpinButton1 = 0 Then
SpinButton1 = Range("DateList").Rows.Count
End If
End Sub
Private Sub SpinButton1_SpinUp()
If SpinButton1 = Range("DateList").Rows.Count + 1 Then
SpinButton1 = 1
End If
End Sub
- 選択した日付を表示するセルに数式を入力します
=INDEX(DateList,DateIndex)
- 名前付き範囲で作業しているため、DateList と DateIndex は、ユーザー シートとは別のシート (非表示のシートであっても) にある場合があります。
- ユーザーが現在カーソルを置いているセルに現在選択されている日付のコピーを作成する場合は、次のステートメントを SpinDown/Up Sub の最後 ( の後
End If
:Selection = Range("DateList").Cells(SpinButton1, 1)