コメントに記載されているとおり、Windows APIを使用する必要があります。 GetSystemMetrics関数のLib「がUser32」
バージョンに基づいて関数を宣言する:これは、ユーザーフォームがスクリーン(単数または複数)の表示領域を離れて移動された場合、私が決定する助け別の(使用するのが比較的簡単)APIであります
#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
私は、フォームが画面オフになっているかどうかを判断するために使用される関数:私はそれはこれが行わ取得するにはWindowsのAPIを使用して可能になると思います
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
が、何のVBAが構築されていませんこれを行うには。 '.WindowState = xlMaximized'は、ウィンドウが置かれているモニタ上のExcelを常に最大にします。だから、もし簡単な方法がないので、これが「持っているのがいい」か、「必要がある」かを最初に決める必要があります。 –
残念ながら、それは "必需品"です。しかし、何とか「迅速かつ汚れた」解決策でうまくいくでしょう:-) – Stefan
私は「迅速かつ汚れていません」とは言いませんでした。しかし、この答えを見てくださいhttp://stackoverflow.com/a/7241038/3219613 Windows APIを介してモニタ情報を取得するためのいくつかのコードスニペットがあります。 –