(EDIT:. Чтобы уточнить, я бег Excel 2013, так что выбор даты Microsoft не доступно)значение настройки ComboBox по инициализации и изменениям другого Наримера
Я пытаюсь написать код простого элемента выбора даты - это будет опрятнее, когда это сделано, это просто большой для простоты в то время как я строю - и все заселяет как надо:
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
Точно так же, когда я пытаюсь установить дату на более низкое значение при выборе месяца с меньшим количеством дней (чтобы избежать возвращений 31 Февраль, к примеру), как .Value
и .Text
доказать снова бесполезен:
есть ли способ надежно установить значение по умолчанию, а затем изменить значение 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. Может ли кто-нибудь помочь?
Любые другие мысли? –