[[20050916214730]] 『コンボボックスに表示させる日付型のリスト』(hata2) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コンボボックスに表示させる日付型のリスト』(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.