VBA窗体跟随活动单元格【简易版】(2/2)

上一篇博客(文章连接如下)中使用工作表事件Worksheet_SelectionChange实现了窗体跟随活动单元格的动态效果。

VBA窗体跟随活动单元格【简易版】(1/2)

为了在用户滚动工作表窗体之后仍能够实现跟随效果,需要使用Application.Windows(1).VisibleRange对于显示位置进行调整。俗话说,条条大路通罗马,本文将接受另外一个实现方法。

示例代码如下。

vb 复制代码
' -- 普通(标准)模块代码 --
Public bShow As Boolean

' -- ThisWorkbook 模块代码 --
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If bShow Then Unload UserForm1
End Sub

' -- 工作表模块代码 --
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim frm, TopOffset As Single, LeftOffset As Single
    TopOffset = 162
    LeftOffset = -6
    If Not bShow Then UserForm1.Show 0
    Set frm = UserForm1
    With Target
        If .Column = 2 Then
            frm.Show 0
            frm.Top = ExecuteExcel4Macro("GET.CELL(43)") + TopOffset
            frm.Left = ExecuteExcel4Macro("GET.CELL(42)") + .Width + LeftOffset
        Else
            frm.Hide
        End If
    End With
End Sub

【代码解析】

代码框架与上一篇博客相同,这里不再赘述,只讲解变更的部分。

第20行和第21行代码分别设置窗体的Top属性和Left属性,即调整窗体的显示位置。

其中使用了宏表函数GET.CELL(x)获取单元格的位置,42代表垂直偏移,43代码水平偏移。


使用GET.CELL(x)获取单元格的位置,和单元格的Top属性和Left属性是否相同呢?接下来就验证一下。

vb 复制代码
Sub Demo()
    Debug.Print ActiveCell.Top, ActiveCell.Top
    Debug.Print ExecuteExcel4Macro("GET.CELL(43)"), _
                ExecuteExcel4Macro("GET.CELL(42)")
End Sub

同样都是单元格A1为活动单元格,在3种不同状态运行上述代码,结果如下。不难看出:

  • 单元格的Top属性和Left属性在3中场景中都是相同的,也可以说两个属性是以A1单元格左上角为坐标原点的偏移量,两个属性返回值为非负数。

  • GET.CELL(x)返回值是随着显示状态不同而变化,其值可正可负,其坐标原点大致位于图中鼠标箭头所在位置。

    0 0
    17.2 25

    0 0
    -80 -27.8

    0 0
    51.4 25


正是由于GET.CELL(x)具备这个特性,所以在调整自定义窗体显示位置时,无需再使用Application.Windows(1).VisibleRange。由于坐标原点有变化,TopOffsetLeftOffset偏移量也需要进行相应的调整。

相关推荐
晚秋大魔王4 个月前
易语言教程——第二章 IDE介绍以及第一个程序
ide·教程·窗体·易语言
大米粥哥哥6 个月前
Qt 界面上控件自适应窗体大小 - 随窗体缩放
开发语言·qt·控件·窗体·自适应大小
大米粥哥哥6 个月前
Qt 界面上字体自适应控件大小 - 随控件缩放
开发语言·qt·字体·控件·窗体·自适应大小
hqwest10 个月前
C#上位机与欧姆龙PLC的通信12----【再爆肝】上位机应用开发(WPF版)
c#·wpf·上位机·多线程·plc·窗体·mes
全栈小51 年前
【窗体】Winform两个窗体之间通过委托事件进行值传递,基础篇
winform·窗体·事件发布订阅