我有一个带有多个用户窗体的Excel 2007 VBA项目,其中之一是一个包含Calendar Control 12.0对象的日期选择器。每当用户单击其他窗体之一上的两个文本框控件之一时,就会激活日期选择器。我想控制日期选择器的启动位置,以使其在显示时与单击的任何文本框控件一致。
要做到这一点,日期选择器窗体(frmDatePicker
)公开三公瓦尔:xOffset
,yOffset
和frmParent
。目的是,在frmDatePicker
显示之前,将通过引用这三个变量来设置其.Top
和.Left
属性,这三个变量本身是由调用子初始化的。(用户窗体的.StartUpPosition
属性也设置为零(即“手动”)以允许以这种方式控制其初始位置。)
这是完美的……除了第一次显示日期选择器。第一次.Show
调用该方法时,该方法frmDatePicker
与单击的文本框不对齐。从第二次开始,这个问题就消失了。
frmDatePicker
的代码如下:
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
函数并如上所述设置位置属性之前进行预加载(无效)
我真的不想回到“快速显示然后隐藏表单”的原因,因为……好吧,这只是一个可怕的解决方案!
谢谢阅读!有任何想法吗?
奇怪的是,正如您所说,第一次设置.Left/Top
似乎已重置/被忽略:
不知道为什么。解决此问题似乎可行:
If Not frmParent Is Nothing Then
Me.StartUpPosition = 0
Me.Move frmParent.Left + xOffset, frmParent.Top + yOffset
End If
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句