如何使用vba excel在特定的显示器上最大化窗口

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

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

如果监视器2是右手来监视1,那么这个代码工作得很好。但是如果是相反的方法,那么这个方法就会失败(比我必须使用-1200)。 不幸的是,这个macros应该在不同的PC上工作,我不知道系统是如何configuration的。 是否有可能检测到连接了多less个显示器,并直接寻址我想要最大化窗口的相应显示器?

谢谢你的帮助。

正如在评论中提到的,您需要使用Windows API; 这是另一个(相对简单易用的)API,帮助我确定用户窗体是否从屏幕的可见区域移开: GetSystemMetrics Lib“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 

通用function:

 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

我用来确定表单是否在屏幕外的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