2016-05-26 4 views
1

上のコンボボックスの値を設定する(EDIT:明確にするために、Microsoftの日付ピッカーを使用できないので、私は、エクセル2013を実行しているよ。)は、他のコンボボックスの初期化および変更

私はシンプルな日付ピッカーをコーディングしようとしています - それは完了だとき、それは整然とだろう、私はそれを構築しながら、それは簡単にするためにちょうど大きいです - そしてそれが必要としてすべてが移入:

Date picker form

Me.Combo_Year.List = wsLU.Range("Date_Years").Value 
Me.Combo_Month.List = wsLU.Range("Date_Months").Value 
Me.Combo_Day.List = wsLU.Range("Date_Days31").Value 

しかし、私がしたい2つのインスタンスがあります年、月、日のコンボボックスのデフォルト値を設定する。私がスピンボタンを使用している時には、.Valueステートメントが_Initializeの12時に設定されます。しかし、コンボボックスのためにどちら.Value.Text作品:同様

Me.Combo_Year.Text = Year(Now()) ' Doesn't work 
Me.Combo_Month.Text = Month(Now()) ' Doesn't work 
Me.Combo_Day.Text = Day(Now()) ' Doesn't work 
Me.Spin_Hour.Value = 12 ' Works fine 
Me.Spin_Minute.Value = 0 ' Works fine 

Error on initialising

を、私は少数の日と月を選択したときの31日を返す避けるために(低い値に日付を設定しようとすると、 2月には、)例えば、.Value.Textの両方が再び役に立たないことを証明:

Debug line after changing month

は、任意のはあります確実にデフォルト値を設定し、後でコード内のコンボボックスの値を変更する方法?私は何かが大いに明らかに欠けていますか?

EDIT:参考のため、フォームの関連部分の完全なコード(UpdatePreviewちょうどOKボタン上記プレビュー日付を更新)要求に応じて:WOTが働いていない

-------------------------------------------------------------------------------- 

Option Explicit 

-------------------------------------------------------------------------------- 

Private Sub UserForm_Initialize() 
Dim wsLU As Worksheet, wbV As Workbook 
Set wbV = ActiveWorkbook 
Set wsLU = wbV.Worksheets("General Lookups") 

Me.Combo_Year.List = wsLU.Range("Date_Years").Value 
Me.Combo_Month.List = wsLU.Range("Date_Months").Value 
Me.Combo_Day.List = wsLU.Range("Date_Days31").Value 
Me.Combo_Minute.AddItem 0 
Me.Combo_Minute.AddItem 30 

' Tried putting the date numbers via variables instead of direct, with various data types 
Dim TestYear As String, TestMonth As String, TestDay As String 
TestYear = Year(Now()) 
TestMonth = Month(Now()) 
TestDay = Day(Now()) 
Lab_T_Year.Caption = TestYear 
Lab_T_Month.Caption = TestMonth 
Lab_T_Day.Caption = TestDay 
'Me.Combo_Year.Text = TestYear ' If these lines are commented out the form will load, though without the comboboxes prepopulated 
'Me.Combo_Month.Text = TestMonth ' If these lines are commented out the form will load, though without the comboboxes prepopulated 
'Me.Combo_Day.Text = TestDay  ' If these lines are commented out the form will load, though without the comboboxes prepopulated 

' Original code; tried this both with and without various Format types. 
'Me.Combo_Year.Value = Format(Year(Now()), "0000") 
'Me.Combo_Month.Value = Format(Month(Now()), "00") 
'Me.Combo_Day.Value = Format(Day(Now()), "00") 
Me.Spin_Hour.Value = 12 
Me.Combo_Minute.Value = 0 ' Switched the minute spinner to a combobox as the client wanted to just pick half hours (00/30) instead of minutes 

UpdatePreview ' Updates date and time preview, works fine. 
End Sub 

-------------------------------------------------------------------------------- 

Private Sub Combo_Year_Change() ' Combo_Month_Change has an equivalent sub that essentially mirrors this one 
Dim wsLU As Worksheet, wbV As Workbook 
Set wbV = ActiveWorkbook 
Set wsLU = wbV.Worksheets("General Lookups") 

Dim iMonthNo As Integer, iYearNo As Long, iMaxDate As Integer 

' Set number of days based on month 
iMonthNo = Me.Combo_Month.ListIndex + 1 
iYearNo = Me.Combo_Year.Value 
If iMonthNo = 1 Or iMonthNo = 3 Or iMonthNo = 5 Or iMonthNo = 7 Or iMonthNo = 8 Or iMonthNo = 10 Or iMonthNo = 12 Then 
    Me.Combo_Day.List = wsLU.Range("Date_Days31").Value 
    iMaxDate = 31 
ElseIf iMonthNo = 4 Or iMonthNo = 6 Or iMonthNo = 9 Or iMonthNo = 11 Then 
    Me.Combo_Day.List = wsLU.Range("Date_Days30").Value 
    iMaxDate = 30 
ElseIf iMonthNo = 2 Then 
    Me.Combo_Day.List = wsLU.Range("Date_Days28").Value 
    iMaxDate = 28 
    ' Leap year div by 4 
     If iYearNo/4 = Int(iYearNo/4) And Not (iYearNo/100 = Int(iYearNo/100)) Then Me.Combo_Day.List = wsLU.Range("Date_Days29").Value 
     If iYearNo/4 = Int(iYearNo/4) And Not (iYearNo/100 = Int(iYearNo/100)) Then iMaxDate = 29 
    ' Leap year div by 400 
     If iYearNo/4 = Int(iYearNo/4) And iYearNo/400 = Int(iYearNo/400) Then Me.Combo_Day.List = wsLU.Range("Date_Days29").Value 
     If iYearNo/4 = Int(iYearNo/4) And iYearNo/400 = Int(iYearNo/400) Then iMaxDate = 29 
End If 

' Code to attempt to change the date down if Month is switched to one with fewer days. It doesn't work. 
If Me.Combo_Day.Value > iMaxDate And iMonthNo > 0 And Not Me.Combo_Day.Value = "" Then Me.Combo_Day.Value = iMaxDate 

UpdatePreview ' Updates date and time preview, works fine. 
End Sub 

もの:マイクロソフト(できませんassumにより示唆されるように補足的な日付ピッカーをインストールする(エクセル2013で利用できません)Microsoft自身の日付ピッカー

  • を追加

    • コンボボックスの.Textまたはプロパティは、使用するデータタイプに関係なく、VBAを介して直接設定しようとします。
    • 日付(=Month(Now()))、変数(=sNowMonth)、またはリストインデックス(Me.Combo_Month.Text=Me.Combo_Month.List(Month(Now())-1))による直接の試行。

    私は先週以来、この解決策を模索してきました。私が見つけたすべての可能性は、以前のバージョンのOfficeにありました。誰も助けることができますか?

  • +0

    他の考えはありますか? –

    答えて

    1

    、あなたは日付変数を作成し、テキスト文字列にそれを変換することができ、直接あなたの質問に答えるために:

    Dim txtNowYear As String 
    Dim txtNowMonth As String 
    Dim txtNowDay As String 
    
    txtNowYear = Year(Now()) 
    txtNowMonth = Month(Now()) 
    txtNowDay = Day(Now()) 
    
    Me.Combo_Year.Text = txtNowYear 
    Me.Combo_Month.Text = txtNowMonth 
    Me.Combo_Day.Text = txtNowDay 
    

    しかし、あなたはそれを使用するつもり内容に応じて、それだけに賢くかもしれません.Dateに入力形式を変更します。

    ツール、追加のコントロールに移動し、Microsoft Monthview Control 6.0(SP6)を選択し、日付ピッカーをフォームに挿入します。

    PS:同様のアプローチで、2番目の問題を処理できるはずです。

    +0

    もちろん、Year()は日付を出力しているため、2012年の日付は* value * 2012と一致しません。 –

    +0

    残念ながら、MonthviewコントロールとそのilkはExcel 2013には存在しません。それは最も不愉快です。このブックは、インストールするために頼ることができない人に配布されることを意図しているため、アドオンの日付ピッカーを使用することはできません。 :-( –

    +0

    まだ動作していません、私は恐れています。私は変数を 'String'、' Integer'、 'Date'として使用しようとしました。 (Text/Value)プロパティを設定できませんでした。プロパティ値が無効です。 "*私はうんざりしています。:-( –

    関連する問題