1

我试图在 Excel 中放置一个用户表单(名为 UserForm1)以与 Excel 中的单元格引用对齐。如果我使用下面的第一个代码初始化表单,则用户表单的大小正确,位于 Excel 屏幕的中心。

Private Sub UserForm_Initialize()

With Me
  .Width = 200
  .Height = 170
End With

End Sub

但是,我想调整大小以对齐用户窗体,使其覆盖单元格 B3:D15。我试过了

Private Sub UserForm_Initialize()

With Me
.Top = Sheet1.Range("B3").Top
.Left = Sheet1.Range("B3").Left
.Width = Sheet1.Range("B3").Offset(0, 4).Left - Sheet1.Range("B3").Left
.Height = Sheet1.Range("B3").Offset(12, 0).Top - Sheet1.Range("B3").Top
End With

End Sub

但用户窗体出现在功能区上(Excel 缩放为 100%。)

考虑到屏幕分辨率/缩放大小,有没有办法正确执行此操作?

4

1 回答 1

2

首先,我为让这个旧线程起死回生而道歉,但其他人对这个问题的回答要么不能完美工作,要么只能在特定情况下(全屏等)工作。
在许多论坛和其他与此相关的问题上寻找这个问题的答案后,我在一个法语论坛上找到了一些简单的代码,它适用于 32 位版本的 excel(office 365)。

在一个模块中:

Option Explicit
 
Private Declare Function GetDC& Lib _
"user32.dll" (ByVal hwnd&)
Private Declare Function GetDeviceCaps& _
Lib "gdi32" (ByVal hDC&, ByVal nIndex&)
 
Sub UserFormAlign()
    ' 1 inch = 72 points for usually 96 or 120 dpi
    Dim x#, y#, w#, h#
    x = GetDeviceCaps(GetDC(0), 88) / 72
    y = GetDeviceCaps(GetDC(0), 90) / 72
    With UserForm1
        .StartUpPosition = 0
        .Left = (ActiveWindow.PointsToScreenPixelsX(ActiveCell.Left * x) * 1 / x) + ActiveCell.Width
        .Top = (ActiveWindow.PointsToScreenPixelsY(ActiveCell.Top * y) * 1 / y) + ActiveCell.Height
        .Show 'if not already shown
    End With
End Sub

上面的代码可以很容易地适应从 启动UserForm通过替换With UserForm1,如果需要With Me也可以删除.Show(没有必要尝试显示自己,因为它有可能已经在屏幕上)。

于 2020-09-07T09:51:10.703 回答