在工作表的右上角显示用户表单

时间:2017-02-05 00:19:11

标签: excel vba excel-vba userform

我需要在工作表的右上角显示用户窗体。我想我可以手动设置位置,但是当工作簿在具有不同屏幕分辨率的另一台计算机上打开时,用户窗体几乎完全不在屏幕上。我的VBA代码有什么问题,这意味着使用户形式的位置本身,以便整个事情显示,但在屏幕的右上角?它只是没有做任何事情,我认为这是因为代码不对。

感谢您的帮助

Private Sub UserForm_Activate()

    Me.StartUpPosition = 0
    Me.Top = Application.Top + 25
    Me.Left = Application.Left + Application.Width - Me.Width - 25

End Sub

2 个答案:

答案 0 :(得分:0)

我担心我会让你感到困惑而不是帮助你。您必须了解“Application.Width”是Excel窗口的整个宽度。我认为下面的代码可以帮助您理解这些数字。将它放入常规模块,而不是表单模块,而不是表单模块。当你运行它时,它会调试你的计算机分辨率,你的分辨率最大化时的excel总宽度,你的分辨率最小化时的Excel总宽度,以及你的用户形式的总宽度。 (如果您为其提供了不同的名称,请将其从Userform1更改。)

运行表单的每台计算机可能具有不同的分辨率,并且它们的屏幕可能会最大化或最小化,我们不知道这些事情。但它们都是影响总可用宽度的变量,以确定表单的位置。想想个别像素。如果您的表单宽度为300像素并且您将其放置在具有1000像素的屏幕上,那么将表单放在屏幕的最右边的命令将是me.left = 1000 - 300.(或应用程序) .width - me.width)但如果只有700个可用像素可以使用,那么命令将是me.left = 700-300或400。

命令me.left告诉计算机在某个位置绘制表单最左边的像素。所以,如果你的出现在左侧(屏幕的同一侧是“开始”或Windows按钮),那么你告诉它将最左边的像素绘制在0.我不知道如何更好地解释它。

但是把它放在一个模块中并运行它。查看命令中的实际数字可能会有所帮助。

Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long
Const SM_CXSCREEN = 0
Const SM_CYSCREEN = 1
Sub VerifyScreenResolution2()

    Dim x  As Long
    Dim y  As Long

    x = GetSystemMetrics(SM_CXSCREEN)
    y = GetSystemMetrics(SM_CYSCREEN)

    Debug.Print "This Computer Resolution Width:  " & x, "Resolution Height:  "; y
    ActiveWindow.WindowState = xlMaximized
    Debug.Print "Application.Width Maximized:  " & Application.Width
    ActiveWindow.WindowState = xlMinimized
    Debug.Print "Application.Width Minimized:  " & Application.Width
    Debug.Print "Userform1 Width:  " & UserForm1.Width

End Sub

以下是我的计算机和表格的打印输出。

此计算机分辨率宽度:1366
分辨率高度:768
Application.Width最大化:1036.5
Application.Width最小化:120
Userform1宽度:240

答案 1 :(得分:0)

它应该在userform模块中。它适用于我,但我运行1366分辨率。有趣的是,Excel的applicaabovtion.width对我来说显示为1033.5。我在debug.print的另一个答案中编辑了子程序,你的值是什么。尝试再次在userform模块中替换它。然后返回VBA编辑器,查看即时窗口中打印的内容。这样,您可以测试具有不同分辨率的不同工作站,并可能找到出错的地方。只需确保设置视图 - 立即窗口以查看打印出来的内容。

如果所有其他方法都失败了,您可能需要根据每个用户的分辨率进行调整。请记住,1600分辨率中的25分将是800分辨率中的50分。

Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long
Const SM_CXSCREEN = 0
Const SM_CYSCREEN = 1

Sub VerifyScreenResolution()

    Dim x  As Long
    Dim y  As Long

    x = GetSystemMetrics(SM_CXSCREEN)
    y = GetSystemMetrics(SM_CYSCREEN)

    Debug.Print x, y

End Sub