XL VBA如何防止在第一个.Show上忽略用户窗体的.Top和.Left属性?

黑狼

我有一个带有多个用户窗体的Excel 2007 VBA项目,其中之一是一个包含Calendar Control 12.0对象的日期选择器。每当用户单击其他窗体之一上的两个文本框控件之一时,就会激活日期选择器。我想控制日期选择器的启动位置,以使其在显示时与单击的任何文本框控件一致。

要做到这一点,日期选择器窗体(frmDatePicker)公开三公瓦尔:xOffsetyOffsetfrmParent目的是,在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.LeftUserForm_InitialiseUserForm_Activate事件中设置属性,并且frmDatePicker两者都设置(没有区别)

  • frmDatePicker在调用我的.Execute函数并如上所述设置位置属性之前进行预加载(无效)

我真的不想回到“快速显示然后隐藏表单”的原因,因为……好吧,这只是一个可怕的解决方案!

谢谢阅读!有任何想法吗?

亚历克斯·K。

奇怪的是,正如您所说,第一次设置.Left/Top似乎已重置/被忽略:

党卫军

不知道为什么。解决此问题似乎可行:

If Not frmParent Is Nothing Then
    Me.StartUpPosition = 0
    Me.Move frmParent.Left + xOffset, frmParent.Top + yOffset
End If

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Selenium和Python在Google上单击第一个Google搜索结果

UIStackView中的第一个基准和最后一个基准属性

Linux上的第一个top命令结果可信吗?

如何防止测试在第一个失败的测试用例上停止?

在mongo查询的第一个和最后一个地方进行属性声明?

如何使用BS4和urllib在imgur上提取第一个图库的链接

每天选择第一个和最后一个事件用户user

如果第一个用户已经登录,如何防止第二个用户在另一个选项卡上登录

如何在每个对象上防止Default?只有第一个起作用

从Prolog中读取文本文件时,如何忽略每行的第一个和最后一个元素?

如何编写表明用户在文本输入中的第一个位置违反回文属性的代码?

根据第一个属性获取项目和后续项目

垂直滚动,第一个和最后一个孩子在屏幕上居中

PySpark在分区上的第一个和最后一个功能

如何使用Selenium和Python提取第一个搜索结果的href属性

如何在PostgreSQL中的一行上获取第一个和最后一个值

显示组中的第一个和最后一个mysql记录以及其他属性

如何在第一个和最后一个div上删除左边距和右边距

在具有匹配属性的列表中查找第一个和最后一个列表

如何获取offsetParent div的top和left属性?

阅读PHP5上XML文件的第一个元素+属性和第二个元素+属性

Flot Chart-如何使用minTickSize在x轴上显示第一个和最后一个月:[2,“ month”]

实体框架代码类的第一个属性和同一类的列表

如何在收到的第一个事件上订阅和取消订阅 EventStream?

Pixel XL 和小米米 6 上的损坏图形

忽略数组中的第一个和最后一个数字

计算每个用户的第一个和最后一个日期之间的差异时如何解决错误?

Oracle SQL - 在 LEFT JOIN 子句上重用第一个表中的列

如何使用 Top 和 Left CSS 属性将元素定位在图像上非常精确的像素处