Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Excel VBA最大化特定监视器上的窗口?_Excel_Vba_Multiscreen - Fatal编程技术网

如何使用Excel VBA最大化特定监视器上的窗口?

如何使用Excel VBA最大化特定监视器上的窗口?,excel,vba,multiscreen,Excel,Vba,Multiscreen,我想使用Excel VBA最大化特定屏幕上的窗口 我使用了以下代码: With ActiveWindow .WindowState = xlNormal .Left = 1200 .WindowState = xlMaximized End With 如果监视器2位于监视器1的右侧,则该代码有效。如果是另一种情况,则该方法失败(那么我必须使用-1200) 这个宏应该在不同的PC上工作,我不知道系统是如何配置的。是否有可能检测连接了多少个监视器,并直接寻址我

我想使用Excel VBA最大化特定屏幕上的窗口

我使用了以下代码:

With ActiveWindow
    .WindowState = xlNormal
    .Left = 1200
    .WindowState = xlMaximized       
End With
如果监视器2位于监视器1的右侧,则该代码有效。如果是另一种情况,则该方法失败(那么我必须使用-1200)


这个宏应该在不同的PC上工作,我不知道系统是如何配置的。是否有可能检测连接了多少个监视器,并直接寻址我希望最大化窗口的相应监视器?

如您需要使用Windows API的评论中所述;这是另一个(使用相对简单)API,它帮助我确定用户表单是否已从屏幕的可见区域移出:GetSystemMetricsLib“User32”

要根据Office版本声明函数,请执行以下操作:

#If Win64 Then  'Win64=true, Win32=true, Win16= false
    Private Declare PtrSafe Function apiGetSystemMetrics Lib "User32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function apiGetSystemMetrics32 Lib "User32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#ElseIf Win32 Then  'Win32=true, Win16=false
    Private Declare Function apiGetSystemMetrics Lib "User32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#Else   ' Win16=true
#End If
通用功能:

Public Function dllGetMonitors() As Long
    Const SM_CMONITORS = 80
    dllGetMonitors = apiGetSystemMetrics(SM_CMONITORS)
End Function


'The width of the virtual screen, in pixels.
'The virtual screen is the bounding rectangle of all display monitors

Public Function dllGetHorizontalResolution() As Long
    Const SM_CXVIRTUALSCREEN = 78
    dllGetHorizontalResolution = apiGetSystemMetrics(SM_CXVIRTUALSCREEN)
End Function

Public Function dllGetVerticalResolution() As Long
    Const SM_CYVIRTUALSCREEN = 79
    dllGetVerticalResolution = apiGetSystemMetrics(SM_CYVIRTUALSCREEN)
End Function

更多信息:

用于确定窗体是否在屏幕外的函数:

Private Sub checkOffScreen(ByRef frm)
    Dim maxTop As Long, minLeft As Long, maxLeft As Long
    Dim defaultOffset As Byte, monitors As Byte

    monitors = celTotalMonitors.Value
    defaultOffset = 11
    minLeft = 0 - (frm.Width - defaultOffset)
    If monitors = 1 And celScreenResolutionX.Value > 1280 Then
        maxTop = 1180 - defaultOffset
        maxLeft = 1900 - defaultOffset
    Else
        maxTop = 750 - defaultOffset
        maxLeft = (960 * monitors) - defaultOffset
    End If
    With frm
        'If (celFormTop.Value < 0 Or celFormTop.Value > maxTop) Or _
            (celFormLeft.Value < minLeft Or celFormLeft.Value > maxLeft) Then
        'If .top < 0 Or .top > maxTop Or .Left < minLeft Or .Left > maxLeft Then
        If celFormTop.Value > maxTop Or celFormLeft.Value > maxLeft Then
            celFormTop = defaultOffset
            celFormLeft = defaultOffset
        End If
        If .Top > maxTop Or .left > maxLeft Then
            .Top = defaultOffset
            .left = defaultOffset
        End If
    End With
End Sub
专用子检查屏幕外(ByRef frm)
变暗maxTop为长,minLeft为长,maxLeft为长
Dim defaultOffset作为字节,监视器作为字节
monitors=celTotalMonitors.Value
defaultOffset=11
minLeft=0-(frm.Width-defaultOffset)
如果监视器=1且celScreenResolutionX.Value>1280,则
maxTop=1180-默认偏移量
maxLeft=1900-默认偏移量
其他的
maxTop=750-默认偏移量
maxLeft=(960*监视器)-默认偏移量
如果结束
使用frm
'如果(celFormTop.Value<0或celFormTop.Value>maxTop)或_
(celFormLeft.ValuemaxLeft)然后
'如果.top<0或.top>maxTop或.LeftmaxLeft,则
如果celFormTop.Value>maxTop或celFormLeft.Value>maxLeft,则
celFormTop=defaultOffset
celFormLeft=defaultOffset
如果结束
如果.Top>maxTop或.left>maxLeft,则
.Top=默认偏移量
.left=默认偏移量
如果结束
以
端接头

我不知道Application.Right是否是一个选项,但我用-1200替换了1200,这对我很有效

Application.WindowState = xlNormal
Application.Left = -1200
Application.WindowState = xlMaximized

我认为可以使用Windows API来实现这一点,但没有内置VBA的方法来实现这一点
.WindowState=xlMaximized
始终最大化放置窗口的监视器上的Excel。所以你需要先决定这是一个“很好拥有”的功能还是一个“必须拥有”的功能,因为没有简单的方法。不幸的是,这是一个“必须拥有”的功能。但如果有一个“快而脏”的解决方案就好了。:-)这就是我想说的,没有“快而脏”的。但是看看这个答案,有几个代码片段可以通过Windows API获取监视器信息。