当前位置:  开发笔记 > 编程语言 > 正文

如何在活动单元格旁边正确对齐UserForm?

如何解决《如何在活动单元格旁边正确对齐UserForm?》经验,为你挑选了1个好方法。

我有一个MonthView的UserForm,当我点击指定范围的单元格时成功打开,这个SO线程给了我基本的脚本.它的功能,但似乎并没有把UserForm放在我期望的地方.

以下是当我单击范围内的任何单元格时打开UserForm的当前脚本(我已放置在特定工作表中)B3:C2000:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set oRange = Range("B3:C2000")
    If Not Intersect(Target, oRange) Is Nothing Then
        frmCalendar.Show
        frmCalendar.Top = ActiveCell.Offset(0, 0).Top
        frmCalendar.Left = ActiveCell.Offset(0, 1).Left
    End If
End Sub

问题1:我将UserForm StartUpPosition属性设置为0 - Manual- 这是正确的吗?

问题2:当我单击指定范围内的任何单元格时,在打开工作簿后第一次,UserForm始终在屏幕的最左上角打开.为什么?

问题3:当我单击指定范围内的任何单元格时,对于第一个单元格之后的任何单击,UserForm将相对于上一个处于活动状态的单元格打开,而不是我刚刚单击的单元格.如何让它相对于刚刚单击的单元格打开,而不是相对于之前的活动单元格?

问题4:为什么它似乎与UserForm的底部对齐而不是顶部?

执行以下步骤后:
1 - 单击单元格C15
2 - UserForm打开
3 - 关闭用户窗体
4 - 单击单元格16
5 - 用户窗体打开

这就是我所看到的:

原始结果

编辑:这是在实施J. Garth的解决方案(并将Offset属性更改为(0,2))后的结果:

正确的结果



1> 小智..:

问题1:我将UserForm StartUpPosition属性设置为0-手动-这正确吗?是的,这是正确的。在下面的代码中,我正在代码中设置此属性。

问题2:当我单击指定范围内的任何单元格时,在打开工作簿后的第一次,UserForm总是在屏幕的左上角打开。为什么?我认为答案与问题3有关。这似乎是打开表单的默认位置。现在,您拥有代码的方式尝试在Worksheet_SelectionChange事件中设置表单的顶部和左侧坐标不起作用,因为实际上从未设置过坐标。坐标的设置需要移至用户窗体初始化事件。

问题3:当我单击指定范围内的任何单元格时,对于第一次单击后的任何单击,UserForm相对于活动的上一个单元格都会打开,而不是我刚刚单击的单元格。如何相对于单击的单元格而不是相对于先前的活动单元格打开它? 此问题还与代码放置在错误的位置有关。如上所述,协调设置需要在用户窗体初始化事件中进行。至于为什么要引用先前的活动单元格,我的猜测是直到工作表选择更改事件完成后,活动单元格才真正被更改。因此,由于您尝试在此事件内设置坐标(即-在事件结束之前),因此将获得先前处于活动状态的单元格。同样,将代码移到正确的位置可以解决此问题。

问题4:为什么它看起来对齐用户窗体的底部而不是顶部? 在单元格(范围)与用户表单之间,“顶部”的定义似乎有所不同。单元格的顶部从第一行开始测量,而用户窗体的顶部似乎从Excel应用程序的顶部开始测量。因此,总而言之,如果activecell.top和userform.top都等于144,则它们在屏幕上的位置将不同。这是因为活动单元格的顶部比Excel电子表格的第一行低144点,而用户窗体的顶部比Excel应用程序的顶部(即-Excel窗口的顶部)低144点。在屏幕上显示,因为起点(Excel窗口的顶部)高于activecell.top(电子表格的第一行)的起点。

工作表模块代码

Private Sub Worksheet_SelectionChange(ByVal target As Range)

    Dim oRange As Range

    Set oRange = Range("B3:C2000")
    If Not Intersect(target, oRange) Is Nothing Then
        frmCalendar.Show
    End If

End Sub

用户表单代码

Private Sub UserForm_Initialize()

    With Me
        .StartUpPosition = 0
        .Top = ActiveCell.Top + ActiveCell.Height + .Height
        .Left = ActiveCell.Offset(0, 1).Left
    End With

End Sub

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有