[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コンボボックスに表示させる日付型のリスト』(hata2)
また教えて頂きたいことがあり書き込みさせていただきます。
ユーザーフォームのコンボボックスにシートの既入力データ を With ComboBox3 .RowSource = Range("C8:C65536").Address End With でリスト表示させるようにしています。
参照するC列のデータは日付型のデータをシートに格納する際に NumberFormatLocalを使ってH17.09.16などと表示させています。
リストに表示されたH17.09.16を選択してコンボボックスに格納すると 2005/09/16ではなく38611とシリアル値の状態で格納されてしまいます。
リストではなく,個別に no = Text1.Value ComboBox3.Value = Cells(7 + no, 3) で戻すとコンボボックス内には2005/09/16の状態で格納されます。
シリアル値のままシートにデータを戻そうとすると"型が一致しません" と表示されてしまい,データを戻す(登録)することができません。
なぜこのような事が起こるのでしょうか? また,改善策を御教授いただけませんでしょうか? よろしくお願いいたします。 (hata2)
ComboBoxなどのリストはテキストを処理するものですから 日付のようなものはテキストとして取り込んだほうがいいのかもしれません。
With ComboBox3 .RowSource = Range("C8:C65536").Address End With
というようにセルとリンクした場合、ComboBoxのリストにあるうちは セルの表示形式のままのようですが、 選択するとシリアルに戻ってしまうみたいですね。
ComboBoxのチェンジイベントで ComboBox3.value = Format(ComboBox3.value, "ge.mm.dd") などとすれば、とりあえず対応できます。
ですが、そのあとに Range("B1").Value = ComboBox3.Value とすると、テキストとしてセルに日付が出力されます。
元通り日付(シリアル値)として戻すためには CDateを使いたいところですが、CDateは/で区切られた日付リテラルでないと 型の不一致を訴えます。
H17.09.16はNG H17/09/16はOK
その場合.を/に置き換えるのも面倒なので、ControlSourceを使うとよさそうです。 ↓を参考にしてください。(ramrun)
Private Sub ComboBox1_Change() ComboBox1.Value = Format(ComboBox1.Value, "ge.mm.dd") End Sub
Private Sub CommandButton1_Click() ComboBox1.ControlSource = "B1" End Sub
Private Sub UserForm_Initialize() With ComboBox1 .RowSource = Range("A1:A10").Address .ControlSource = "B1" End With End Sub
ramrun様ありがとうございます!! 大変参考になりました。
コンボボックスのクリックイベントを
Private Sub CommandButton1_Click() dy = DateValue(StrConv(ComboBox3.Value, vbNarrow)) Cells(7 + no, 3).NumberFormatLocal = "gee.mm.dd" Worksheets("Sheet1").Cells(7 + no, 3).Value = dy End Sub ※ noはTextBox1に入力する番号の変数です。
としていますので
Private Sub UserForm_Initialize() With ComboBox3 .RowSource = Range("C8:C65536").Address End With End Sub Private Sub ComboBox3_Change() ComboBox3.Value = Format(ComboBox3.Value, "yyyy/mm/dd") End Sub
とすることで対応できそうな気がします。 コンボボックスのチェンジイベントを利用するという発想が私に全くありませんでした。 こう言うのを目からウロコと言うんじゃないだろうか?^^と思っています。 今日は休日で実際に確認してみるのは休み明けとなりますが,また結果をご報告させていただきます。 本当にありがとうございました。 (hata2)
結論から言うと、Rowsourceでは無くて、AddItemを使いました。
以下、こんな感じです。
Option Base 1
Private Sub UserForm_Initialize()
Dim myCount(10) As Date’必要に応じてRowの数だけRedimすればよいです
For I = 1 To Worksheets("Sheet1").Range("A1").End(xlDown).Row
myCount(I) = Worksheets("Temp").Cells(I, 1) ’配列に入れる Next I
For I = 1 To Worksheets("Sheet1").Range("A1").End(xlDown).Row
comboBox3.AddItem myCount(I) ’配列のデータをAddItemする。 Next I
End Sub
わざわざ配列に格納しなくても、同じFor〜Nextの中に入れてもいいですけど、
こんな感じでという事で…
こんな方法も・・・ ということで、新規ブックで試してください。
ユーザーフォームを一つ作成してください(UserForm1) このUserForm1に配置するコントロールは、 コンボボックスを一つ作成して下さい ----- ComboBox1 コマンドボタンを一つ作成して下さい ----- CommandButton1
上記、UserForm1のモジュール
'=================================== Option Explicit Private Sub CommandButton1_Click() With Range("a8") .Formula = "=datevalue(""" & ComboBox1.Value & """)" .NumberFormatLocal = "ge.m.d" .Value = .Value End With End Sub '======================================================================== Private Sub UserForm_Initialize() Me.Caption = "コマンドボタンクリックで選択した日付をA8に設定します" With ComboBox1 .List() = Evaluate("transpose(text(c8:c300,""ge.m.d""))") End With End Sub
標準モジュールに '====================================================================== Option Explicit Sub test1() Call mk_sample_date MsgBox "C8:C300のセル範囲の日付を" & vbCrLf _ & "ユーザーフォームのコンボボックスに登録します" UserForm1.Show End Sub '====================================================================== Sub mk_sample_date() With Range("c8:c300") .NumberFormatLocal = "ge.m.d" .Formula = "=c7+1" .Cells(1).Value = Date .Value = .Value End With End Sub
以上です。test1を実行してみてください。
ichinose
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.