- ベストアンサー
コントロールの記憶
環境 WindowsXP_SP3 Excel2003 現在VBAでプログラムを作成しています。 下の内容を完成したくて質問させて頂きます。 TextBoxが10個あります。 (txtText0~txtText9) いずれかのtxtTextをMouseDownすると、カレンダーを表示する様にしています。 そのカレンダーの日にちをシングルクリックすると、MouseDownしたtxtTextに 年月日を入力したいのですが、どうすればいいのでしょうか? どうぞ宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 当方、自作の土日の色分け機能しかないカレンダーを使ってきており(おかげで2010でカレンダーコントロールが使えなくなっても困らなかったのですが)、2003環境で試してみました。スケルトンだけ示します。 次のテキストボックスにフォーカスを当てるところはコーディング済みかもしれませんが、最も単純な方法だけ、ご参考までに載せてあります。 Dim currentControl As Control Private Sub Calendar1_Click() Dim textBoxNo As Long currentControl.Object.Value = Me.Calendar1.Value Me.Calendar1.Visible = False textBoxNo = CLng(Right(currentControl.Name, 1)) If textBoxNo < 9 Then Me.Controls("TextBox" & CStr(textBoxNo + 1)).SetFocus End Sub Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Set currentControl = Me.ActiveControl Me.Calendar1.Visible = True End Sub Private Sub UserForm_Initialize() Me.Calendar1.Visible = False End Sub
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
>いずれかのtxtTextをMouseDownすると、カレンダーを表示する様にしています。 そもそも、どういう仕組のカレンダーなのですか? VB6 RuntimeのDateTimePickerとか、OfficeのCalender コントロールなら分かるけれども、それ以外は見当つかないですね。 まあ、私だけが分からないのかもしれませんから、無視していただいて構いませんが、MouseDownすると、カレンダーを表示というのも、意味がはっきりしないですね。 ふつう、Officeのカレンダーコントロールは、ワークシートやUserForm上に出しておくものだと思います。カレンダーコントロールを非表示にさせてあるのですか?
補足
説明不足ですみませんでした。 カレンダーは参照設定で「Microsoft Calendar Control 11.0」にチェックしたカレンダーです。 オブジェクト名は「msCalendar」で、初期状態はVisibleをFalseにしています。 そして、txtText0の場合 Private Sub txtText0_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) msCalendar.Visible = True End Sub と記述してあります。
- mitarashi
- ベストアンサー率59% (574/965)
ワークシートに置いた、コントロールツールボックスのテキストボックスでしょうか? テキストボックスに個々にイベントコードを書いて良いなら、下記で直前にクリックしたテキストボックスを記憶できます。 カレンダーから戻る際に、モジュールレベルの変数に保存した直前のテキストボックスに書き込めば良いでしょう。 UserFormの場合は、Me.ActiveControlで容易に取得できます。 10個のテキストボックス個々にコードを書くのは嫌だという場合は、下記等をご参考にご研究下さい。 http://okwave.jp/qa/q8276008.html (#6) http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm Private Type POINTAPI X As Long Y As Long End Type Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINTAPI) As Long Dim currentOLEobj As Object Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim C As POINTAPI Dim obj As OLEObject Call GetCursorPos(C) Set currentOLEobj = ActiveWindow.RangeFromPoint(C.X, C.Y) '下記はテスト用 MsgBox currentOLEobj.Name currentOLEobj.Object.Value = "Hello World!" End Sub
補足
>> ワークシートに置いた、コントロールツールボックスのテキストボックスでしょうか? VBEで作ったUserFormに貼り付けたテキストボックスです。 テキストボックスには(txtText0の場合) Private Sub txtText0_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) msCalendar.Visible = True End Sub そしてカレンダーには Private Sub msCalendar_Click() clndYear = msCalendar.Year clndMonth = msCalendar.Month clndDay = msCalendar.Day msCalendar.Visible = False End Sub と記述してあります。(clndYear~clndDayはPublic変数) カレンダーが.Visible = Falseで隠れた後は、MouseDownしたテキストボックス(今の場合txtText0)ではなく 別のテキストボックスにフォーカスがあたります。
お礼
mitarashi様 どうもコーディングサンプルありがとうございました。 見事に私の意図するところ答えて頂き感謝致します。 お忙しい貴重な時間を費やしてもらいありがとうございました。