2017-02-22 52 views
3

我目前正在寻找一种方法来使用VBA Excel在特定屏幕上最大化窗口。到目前为止,我在这里用这个代码:如何使用vba excel在特定监视器上最大化窗口

With ActiveWindow 
     .WindowState = xlNormal 
     .Left = 1200 
     .WindowState = xlMaximized  
End With 

代码莫名其妙的伟大工程,如果监视器2是右手监测1.但如果它是周围的其他方法,这个方法失败(比我所用-1200)。不幸的是,这个宏应该在不同的PC上工作,我不知道系统是如何配置的。是否有可能检测出连接了多少个显示器,并直接寻址我想要最大化窗口的相应显示器?

感谢您的帮助。

+0

我认为它会使用Windows API来完成这件事是可能的,但没有VBA内置在这样做的方式。 '.WindowState = xlMaximized'总是在放置窗口的监视器上最大化Excel。因此,您需要首先决定这是“很好有”功能还是“必须拥有”,因为没有简单的方法。 –

+0

不幸的是,这是一个“必须拥有”。但以某种方式“快速和肮脏”的解决方案将罚款。:-) – Stefan

+1

这就是我试图说,没有“快速和肮脏”。但看看这个答案http://stackoverflow.com/a/7241038/3219613有几个代码片段通过Windows API获取监视器信息。 –

回答

1

正如评论中提到的那样,您需要使用Windows API;这是另外一个(使用比较简单)API,帮助我确定如果用户形式离开屏幕(S)的可视区域:基于版本GetSystemMetrics的库“USER32”

声明函数

#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 

更多信息:http://msdn.microsoft.com/en-us/library/ms724385(VS.85).aspx

我用来确定形式是关闭屏幕的功能:

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 
相关问题