2016-05-26 3 views
1

(EDIT:. Чтобы уточнить, я бег Excel 2013, так что выбор даты Microsoft не доступно)значение настройки ComboBox по инициализации и изменениям другого Наримера

Я пытаюсь написать код простого элемента выбора даты - это будет опрятнее, когда это сделано, это просто большой для простоты в то время как я строю - и все заселяет как надо:

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 

Однако, есть два случая, когда я хотел бы для установки значений по умолчанию для комбинированных ящиков года, месяца и дня , В течение времени я использую кнопки со стрелками, где простой оператор .Value устанавливает их в 12 часов в _Initialize. Но ни .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 Февраль, к примеру), как .Value и .Text доказать снова бесполезен:

Debug line after changing month

есть ли способ надежно установить значение по умолчанию, а затем изменить значение combobox в коде? Я пропустил что-то чрезвычайно очевидное?

EDIT: Для справки, полный код для соответствующих частей формы (UpdatePreview просто обновляет дату предварительного просмотра над кнопкой ОК) с просьбой:

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

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 

ВЕЩЬ WOT не подействовала:

  • Добавление собственного сборщика от Microsoft даты (не доступна в Excel 2013)
  • Установка дополнительного выбора даты в соответствии с предложением Microsoft (не Assum e он будет доступен на компьютерах пользователей)
  • Попытка напрямую установить свойства .Text или .Value с помощью 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 

Но в зависимости от того, что вы собираетесь использовать его для, это может быть умнее, просто измените формат ввода на. Дате

Перейти к разделу «Инструменты», «Дополнительный контроль», выберите «Microsoft Monthview Control 6.0» (SP6). Вставьте форму выбора даты в вашу форму.

PS: Аналогичный подход должен быть в состоянии справиться со своей второй проблемой.

+0

Ooooh, конечно - Year() выводит дату, поэтому дата 2012 не будет соответствовать * значению * 2012. –

+0

Элемент управления Monthview и его аналоги не существуют в Excel 2013, к сожалению. Это очень неприятно. Я даже не могу использовать средство выбора даты добавления, так как эта книга предназначена для распространения среди людей, на которых нельзя полагаться, чтобы они были установлены. :-( –

+0

Все еще не работает, я боюсь. Я пытался использовать переменные как 'String',' Integer' и 'Date', и я пробовал писать их (в разных формах) .Text' и '.Value', и я продолжаю получать *« Не удалось установить свойство (Text/Value). Недопустимое значение свойства. »* Я смущен. :-( –

 Смежные вопросы

  • Нет связанных вопросов^_^