📜  userform 启动位置多个监视器 (1)

📅  最后修改于: 2023-12-03 15:35:32.539000             🧑  作者: Mango

UserForm启动位置多个监视器

在编写VBA程序时,用户表单(UserForm)是常用的交互界面。但是,如果用户使用多个监视器(例如笔记本电脑上连接外置显示器),则可能需要调整UserForm的启动位置。

本文将介绍如何在多个监视器上使用VBA代码设置UserForm的启动位置。

使用VBA代码设置UserForm启动位置

在VBA中,您可以使用以下代码设置UserForm的启动位置:

UserForm1.StartUpPosition = 0 'Manual
UserForm1.Left = Application.Left + (Application.Width - UserForm1.Width) / 2
UserForm1.Top = Application.Top + (Application.Height - UserForm1.Height) / 2

这个代码将UserForm的启动位置设置为手动(Manual),并将其位置设置为在应用程序窗口的中心。

但这段代码有一个缺点,它假设您只有一个监视器。如果您使用多个监视器,则UserForm可能会在错误的位置启动。

下面,我们将介绍如何修改这个代码来支持多个监视器。

获取屏幕分辨率

首先,我们需要获取每个监视器的分辨率。这可以通过System.Windows.Forms.Screen类来实现。

以下代码将显示所有监视器的分辨率:

Sub GetScreenResolution()
    Dim i As Integer    
    For i = 0 To Screen.Count - 1
        Debug.Print "Screen " & i
        Debug.Print "    Width: " & Screen(i).Bounds.Width
        Debug.Print "    Height: " & Screen(i).Bounds.Height
    Next i
End Sub
计算UserForm的启动位置

一旦我们获取了每个监视器的分辨率,就可以计算UserForm的启动位置。以下代码将根据当前光标所在的监视器计算UserForm的位置:

Sub SetFormLocationOnCurrentScreen(frm As UserForm)
    Dim scr As Integer
    Dim screenWidth As Long
    Dim formLeft As Long
    Dim formTop As Long
    '获取当前光标所在的屏幕编号(索引从0开始)
    scr = Screen.ActiveForm.CurrentScreen
    '获取当前屏幕的宽度
    screenWidth = Screen(scr).Bounds.Width
    '计算UserForm的左侧位置
    formLeft = Screen(scr).Bounds.Left + (screenWidth - frm.Width) / 2
    '计算UserForm的顶部位置
    formTop = Application.Top + (Application.Height - frm.Height) / 2
    '设置UserForm的位置
    frm.StartUpPosition = 0 'Manual
    frm.Left = formLeft
    frm.Top = formTop
End Sub

如果您希望强制UserForm始终启动在特定屏幕上,则可以使用以下代码:

Sub SetFormLocationOnScreen(frm As UserForm, scr As Integer)
    Dim screenWidth As Long
    Dim formLeft As Long
    Dim formTop As Long
    '获取指定屏幕的宽度
    screenWidth = Screen(scr).Bounds.Width
    '计算UserForm的左侧位置
    formLeft = Screen(scr).Bounds.Left + (screenWidth - frm.Width) / 2
    '计算UserForm的顶部位置
    formTop = Application.Top + (Application.Height - frm.Height) / 2
    '设置UserForm的位置
    frm.StartUpPosition = 0 'Manual
    frm.Left = formLeft
    frm.Top = formTop
End Sub
示例代码

以下示例代码演示了如何在多个监视器上启动UserForm:

Private Sub UserForm_Initialize()
    SetFormLocationOnCurrentScreen Me
End Sub

在这个示例中,UserForm将始终启动在当前光标所在的屏幕上。如果您希望UserForm始终启动在第二个屏幕上,则可以使用以下代码:

Private Sub UserForm_Initialize()
    SetFormLocationOnScreen Me, 1 '第二个屏幕的索引为1
End Sub
结论

在使用多个监视器时,您可以使用上述技巧来调整UserForm的启动位置。请注意,这些代码仅适用于Windows环境。如果您使用Mac OS环境,则需要相应地修改代码。

希望本文对您有所帮助!