- 締切済み
エクセルVBAのカレンダーコントロールの件で
エクセルVBAを使用して リストボックスかコンボボックスかテキストボックスかを クリックするとカレンダーコントロールが呼び出されて カレンダーコントロールの日付をクリックすると カレンダーコントロールは閉じその値が上記2行目いずれかに 入力されるようにすることは可能なのでしょうか いろいろ文献を探してみたのですがよくわからずじまいでした よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- zap35
- ベストアンサー率44% (1383/3079)
#02です。 ユーザフォームに二つのテキストボックスと、一つのカレンダーコントロールを配置し、クリックしたテキストボックスに日付を返す方法です。変数を使ってテキストボックス名を引き渡しています Dim tBox As String Private Sub UserForm_Activate() UserForm1.Calendar1.Visible = False End Sub Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) tBox = "TextBox1" UserForm1.Calendar1.Visible = True End Sub Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) tBox = "TextBox2" UserForm1.Calendar1.Visible = True End Sub Private Sub Calendar1_Click() UserForm1.Controls(tBox).Text = Calendar1.Value Calendar1.Visible = False End Sub
- misatoanna
- ベストアンサー率58% (528/896)
#1です。 > テキストボックスが多数あるとき、カレンダーのフォームを1つで > 済ます方法 コントロールツールボックスやフォームのテキストボックスの場合は わかりませんが、一般のテキストボックスを使用するなら、 1.標準モジュールに以下を記述します。 Public TB Sub ShowCalendar() TB = ActiveSheet.Shapes.Range(Application.Caller).Name UserForm1.Show End Sub Sub WriteData() ActiveSheet.Shapes(TB).Select Selection.Characters.Text = _ UserForm1.Calendar1.Month & "月 " _ & UserForm1.Calendar1.Day & "日" End Sub 2.カレンダーコントロールを作成したユーザーフォームのコードとし て以下を記述します。 Private Sub Calendar1_Click() Application.Run "WriteData" Unload Me End Sub 3.それぞれのテキストボックスを右クリックし、"マクロの登録"から ShowCalendar を指定します。 で、 テキストボックスをシングルクリックするとカレンダーが表示されま すので、日付を選択します。
- zap35
- ベストアンサー率44% (1383/3079)
ユーザフォームに適すとボックスとカレンダーコントロールを配置します。カレンダーコントロールは「ユーザフォームシートを開く」→「ツール」→「その他のコントロール」→「カレンダーコントロールにチェック」しないと表示されませんが、そこまではできていますか? 後はユーザフォームのモジュールシートに以下のマクロを貼り付けます。UserForm1.Show でフォームを呼び出して、テキストボックスをクリック(正確にはMouseDown)して見てください。 Private Sub UserForm_Activate() UserForm1.Calendar1.Visible = False End Sub Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) UserForm1.Calendar1.Visible = True End Sub Private Sub Calendar1_Click() TextBox1.Text = Calendar1.Value Calendar1.Visible = False End Sub TextBoxを経由すると日付は文字列型になりますので注意してください
- misatoanna
- ベストアンサー率58% (528/896)
適当に操作してみた結果ですが、とりあえず参考まで―― <案1> 1.コントロールツールボックスのテキストボックスをシート上に作成。 2.ユーザーフォーム上にカレンダーコントロールを作成。 3.以下のモジュールを作成。 4.テキストボックスのダブルクリックで表示される画面に以下を記述。 Private Sub TextBox1_DblClick(ByVal Cancel _ As MSForms.ReturnBoolean) UserForm1.Show End Sub 5.ユーザーフォームのコードとして以下を記述。 Private Sub Calendar1_Click() ActiveSheet.TextBox1 = Calendar1.Month & "月 " _ & Calendar1.Day & "日" Unload Me End Sub <案2> 1.コントロールツールボックスのテキストボックスとカレンダーコン トロールをシート上に作成。 2.シートモジュールとして以下を記述。 Private Sub TextBox1_DblClick(ByVal Cancel _ As MSForms.ReturnBoolean) ActiveSheet.OLEObjects.Add(ClassType:="MSCAL.Calendar.7", _ Left:=200, Top:=20, Width:=200, Height:=150).Select End Sub ' Private Sub Calendar1_Click() TextBox1 = Calendar1.Month & "月 " & Calendar1.Day & "日" Calendar1.Cut End Sub いずれも、テキストボックスのダブルクリックでカレンダーコントロ ールが表示されます。 ただし、案2の場合は、コントロールツールボックスを表示させてお き、デザインモードをいったんオンにしてからオフにしないと、カレ ンダーコントロールがクリックできないようです。
お礼
回答ありがとうございます 案1でやってみたところうまくいきました 案2も試して見たいと思います
補足
>misatoannaさん 回答ありがとうございます 案1でやってみたところうまくいきました テキストボックスがたくさんあるとき カレンダーのフォームもたくさん作ってみたのですが 1つで済ます方法とかもあるのでしょうか?
お礼
VBAをはじめて2日目なので変数がちょっと難しいですが 勉強して実践してみたいと思います このやり方も試してみたいと思います どうもありがとうございます
補足
カレンダーコントロール表示まではできています >後はユーザフォームのモジュールシートに以下のマクロを貼り付けます。 >UserForm1.Show でフォームを呼び出して、テキストボックスをクリック >(正確にはMouseDown)して見てください。 このやり方も試してみたいと思います どうもありがとうございます