我有一个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:我将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