2016-08-15 3 views
0

Я нашел этот замечательный сборщик дат из группы людей, сделанных для пользовательского использования в версии excel, которые не поддерживают управление календарем. Я добавил это к другому WB, так что каждый раз, когда пользователь нажимает на столбец, для которого требуется дата, появляется форму пользователя datepicker, а затем введите выбранную дату в ячейке.custom picker popup excel 2010

Теперь я пытаюсь использовать это с пользовательской формой, которую я создал. Я добавил текстовое поле, которое автоматически заполняет сегодняшнюю дату, когда открывается пользовательская форма, но я хочу каким-то образом получить всплывающее окно datepickerform при щелчке по текстовому полю даты. Я добавил private sub textbox_change() datepickerform.show, но получаю ошибку времени «переменная объекта или с переменной блока не установлена».

Отладчик возвращает меня в эту часть кода DatePickerForm с выделенной первой строкой.

Private Sub UserForm_Activate() 

If IsDate(Target.Value) Then 
    Calendar1.Value = Target.Value 
End If 

Call MoveToTarget 

End Sub 

Является ли это помеченным, потому что в моем текстовом поле нет формата даты? Я могу предоставить полный код по запросу, это просто, что это alot, и я не хотел добавлять к моему уже длинному сообщению.

вот код datepickerform:

Option Explicit 


Private WithEvents Calendar1 As cCalendar 

Public Target As Range 

Private Sub Calendar1_Click() 
    Call CloseDatePicker(True) 
End Sub 

Private Sub Calendar1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 
    If KeyCode = vbKeyEscape Then 
     Call CloseDatePicker(False) 
    End If 
End Sub 

Private Sub UserForm_Initialize() 
    If Calendar1 Is Nothing Then 
     Set Calendar1 = New cCalendar 
     With Calendar1 
      .Add_Calendar_into_Frame Me.Frame1 
      .UseDefaultBackColors = False 
      .DayLength = 3 
      .MonthLength = mlENShort 
      .Height = 120 
      .Width = 180 
      .GridFont.Size = 7 
      .DayFont.Size = 7 
      .Refresh 
     End With 
     Me.Height = 153 'Win7 Aero 
     Me.Width = 197 
    End If 
End Sub 



Public Sub MoveToTarget() 
    Dim dLeft As Double, dTop As Double 

    dLeft = Target.Left - ActiveWindow.VisibleRange.Left + ActiveWindow.Left 
    If dLeft > Application.Width - Me.Width Then 
     dLeft = Application.Width - Me.Width 
    End If 
    dLeft = dLeft + Application.Left 

    dTop = Target.Top - ActiveWindow.VisibleRange.Top + ActiveWindow.Top 
    If dTop > Application.Height - Me.Height Then 
     dTop = Application.Height - Me.Height 
    End If 
    dTop = dTop + Application.Top 

    Me.Left = IIf(dLeft > 0, dLeft, 0) 
    Me.Top = IIf(dTop > 0, dTop, 0) 
End Sub 


Sub CloseDatePicker(Save As Boolean) 
    If Save And Not Target Is Nothing And IsDate(Calendar1.Value) Then 
     Target.Value = Calendar1.Value 
    End If 
    Set Target = Nothing 

    Me.Hide 
End Sub 
+0

Сборщик календарей - это собственный объект и должен быть создан в вашей пользовательской форме. Код инициализации вашей пользовательской формы может создать этот объект выбора даты и отобразить его, когда в вашей пользовательской форме выбран элемент управления датой. Ошибка времени выполнения жалуется, потому что вы не создали объект выбора даты нигде. Если вы хотите создать объект выбора даты вне вашей пользовательской формы, тогда создайте свойство userform, чтобы «позволить» объекту выбора даты назначить переменной пользовательской формы. – PeterT

+0

По прошествии некоторого времени игры я получил специальную форму выбора даты, когда я выбираю назначенное текстовое поле в моей основной форме пользователя, однако, когда я выбираю дату, она не меняет значение текстового поля , Я действительно покончил с вышеупомянутой пользовательской формой, полностью активированной, и она всплывает и закрывается должным образом, она просто не обновляет значение текстового поля. – Awill

+0

Не видя кода для сборщика дат или не зная об этом, я не могу сказать, как/что обновляет объект выбора даты, т. Е.как связать сборщик дат с текстовым полем (или ячейкой рабочего листа или что-нибудь еще). – PeterT

ответ

0

Это было гораздо проще, чем я думал, я думаю, я просто думаю над сложностью кода часто раз, как я новичок в VBA и вряд ли Знаю много.

Я изменил строчку и не имел никаких проблем с ней.

Sub CloseDatePicker(Save As Boolean) 

myUserForm.myTextBox.Text = Calendar1.Value 

    Me.Hide 
End Sub 

Если кому-то это интересно, я думаю, что у меня есть мой конечный продукт. Я вытаскиваю свой основной пользовательский форму нажатием кнопки и использую это кодирование, чтобы центрировать его в активном окне excel (я использую двойной монитор, а пользовательские формы отображаются неправильно, используя основные настройки, они появляются на неактивном экране)

Sub ShowForm() 

With Audit_Criteria 
    .StartUpPosition = 0 
    .Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width) 
    .Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height) 
    .Show 
End With 
End Sub 

Затем, когда пользователь выбирает текстовое поле «date» в пользовательской форме, отображает форму datepickerform, перекрывая текстовое поле, расположенное в правом верхнем углу пользовательской формы.

Private Sub tbDOS_Enter() 
With DatePickerForm 
    .StartUpPosition = 0 
    .Left = Application.Left + (0.5 * Application.Width) - (0.01 * .Width) 
    .Top = Application.Top + (0.5 * Application.Height) - (1.5 * .Height) 
    .Show 
End With 
End Sub 

Я не уверен, если есть более простой способ сделать это путем определения местоположения текстового поля и компенсируя DatePicker от него, но это то, что я пришел в и с моим отсутствием опыта, не знаю другой подход.