У меня есть проект Excel 2007 VBA с несколькими пользовательскими формами, один из которых - сборщик дат, содержащий объект Calendar Control 12.0. Сборщик событий активируется всякий раз, когда пользователь нажимает одно из двух элементов управления текстовыми полями в одной из других форм. Я хочу управлять стартовой позицией выбора даты таким образом, чтобы при показании она отображалась в соответствии с тем, какой из элементов управления текстовым полем был нажат.XL VBA Как я могу предотвратить игнорирование свойств .Top и .Left UserForm при первом .Show?
Чтобы сделать это, выбор даты UserForm (frmDatePicker
) предоставляет три открытых ВАР: xOffset
, yOffset
и frmParent
. Цель состоит в том, чтобы до frmDatePicker
свойства .Top
и .Left
будут заданы по ссылке на эти три vars, которые сами инициализируются вызывающим суб. (Свойство userform .StartUpPosition
также установлено на ноль (т. Е. «Руководство»), чтобы можно было контролировать его начальное положение таким образом.)
Это отлично работает, за исключением случаев, когда отображается первый таймер выбора даты. В первый раз вызывается метод .Show
, frmDatePicker
не выравнивается с текстовым полем с щелчком. Со второго раза эта проблема исчезает. Код
frmDatePicker
«S выглядит следующим образом:
Option Explicit
Public InitialDate As Variant
Public xOffset As Double
Public yOffset As Double
Public frmParent As Object
Private DateSelected As Boolean
Function Execute() As Boolean
If Not frmParent Is Nothing Then
Me.StartUpPosition = 0
Me.Left = frmParent.Left + xOffset
Me.Top = frmParent.Top + yOffset
End If
If Not IsDate(InitialDate) Then InitialDate = DateSerial(Year(Now), Month(Now), 1)
calPickDate.Value = InitialDate
calPickDate.ValueIsNull = True
btnCancel.SetFocus
DateSelected = False
Me.Show
Execute = DateSelected
End Function
Private Sub btnCancel_Click()
DateSelected = False
Me.Hide
End Sub
Private Sub calPickDate_Click()
DateSelected = True
Me.Hide
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True
DateSelected = False
Me.Hide
End If
End Sub
И призвание к югу выглядит следующим образом:
Private Sub GetDate(Target As MSForms.TextBox)
With frmDatePicker
.Caption = IIf(Target Is txtDstart, "Start date", "End date")
Set .frmParent = frmAnalysis
.xOffset = Target.Left
.yOffset = Target.Top
.InitialDate = Target.Value
If .Execute() Then Target.Value = Format(.calPickDate, "dd/mm/yyyy")
End With
End Sub
То, что я пытался до сих пор:
Протестировано свежую пользовательскую форму в пустой книге, чтобы убедиться, что это поведение не из-за каких-то крутых или коррумпированных в моем проекте (это не так)
Установка
.Top
и.Left
свойства вUserForm_Initialise
иUserForm_Activate
событийfrmDatePicker
- как индивидуально, так и в (без разницы)Предзагрузка
frmDatePicker
перед вызовом моего.Execute
функция и не устанавливая позиционные свойства, как описано выше (никакого эффекта)
Я действительно не хочу, чтобы упасть обратно на «быстро показывая то скрывает форму» becau se ... ну, это просто ужасное решение!
Спасибо за чтение! Есть идеи?
Спасибо Alex! Я забыл о «Переместить» ... Как бы то ни было, я только что вернулся сюда, чтобы опубликовать собственное исправление (которое я все равно сделаю в любом случае для полноты), но у вас меньше kludgey, чтобы вы получили голосование! – blackworx