VBAでアプリケーションの位置情報を取得・設定する方法

# VBAでアプリケーションの位置情報を取得・設定する方法

## 機能1：アプリケーションの位置情報の登録

### 概要
- **起動中のアプリケーションを取得**: 現在起動しているアプリケーションのリストを取得します。
- **アプリケーションの位置情報を取得**: 各アプリケーションのウィンドウ位置を取得します。
- **取得したアプリケーションと位置情報をシートに書き出し**: 取得した情報をExcelシートに保存します。

### コード
```vba
Declare PtrSafe Function EnumWindows Lib "user32" (ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long
Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As Long

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Dim appList As Collection

Function EnumWindowProc(ByVal hwnd As LongPtr, ByVal lParam As LongPtr) As Long
    Dim windowTitle As String * 256
    If IsWindowVisible(hwnd) Then
        GetWindowText hwnd, windowTitle, Len(windowTitle)
        appList.Add Trim(windowTitle)
    End If
    EnumWindowProc = 1 ' 続行
End Function

Sub RegisterApplicationPositions()
    Set appList = New Collection
    EnumWindows AddressOf EnumWindowProc, 0

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("アプリケーション情報") ' シート名を指定
    ws.Cells.Clear ' シートをクリア

    Dim n As Long
    n = 1
    Dim app As Variant
    For Each app In appList
        Dim rect As RECT
        Dim hwnd As LongPtr
        hwnd = FindWindow(vbNullString, app) ' ウィンドウハンドルを取得
        If hwnd <> 0 Then
            GetWindowRect hwnd, rect
            ws.Cells(n, 1).Value = app ' アプリケーション名
            ws.Cells(n, 2).Value = rect.Left ' 左位置
            ws.Cells(n, 3).Value = rect.Top ' 上位置
            ws.Cells(n, 4).Value = rect.Right ' 右位置
            ws.Cells(n, 5).Value = rect.Bottom ' 下位置
            n = n + 1
        End If
    Next app
End Sub
```

### コードの説明
- **EnumWindows**: 起動中のウィンドウを列挙します。
- **GetWindowText**: 各ウィンドウのタイトルを取得します。
- **GetWindowRect**: 各ウィンドウの位置を取得します。
- **Excelシートに書き出し**: 取得したアプリケーション名と位置情報を指定したシートに書き出します。

## 機能2：アプリケーションの起動と位置設定

### 概要
- **シートに書き出したアプリケーションと位置情報を取得**: Excelシートからアプリケーション名と位置情報を取得します。
- **取得したアプリケーションを起動**: アプリケーションを起動します。
- **起動したアプリケーションを、取得した位置情報の位置に移動**: アプリケーションを指定した位置に移動します。

### コード
```vba
Declare PtrSafe Function Shell Lib "shell32" (ByVal lpPathName As String, ByVal nCmdShow As Long) As Long
Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Sub LaunchAndPositionApplications()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("アプリケーション情報") ' シート名を指定

    Dim n As Long
    n = 1
    Dim appName As String
    Dim leftPos As Long, topPos As Long

    Do While ws.Cells(n, 1).Value <> ""
        appName = ws.Cells(n, 1).Value
        leftPos = ws.Cells(n, 2).Value
        topPos = ws.Cells(n, 3).Value

        ' アプリケーションを起動
        Dim hwnd As LongPtr
        hwnd = Shell(appName, vbNormalFocus)

        ' ウィンドウが起動するまで待機
        Application.Wait Now + TimeValue("00:00:02") ' 2秒待機

        ' ウィンドウハンドルを取得
        hwnd = FindWindow(vbNullString, appName)
        If hwnd <> 0 Then
            ' 位置を設定
            SetWindowPos hwnd, 0, leftPos, topPos, 800, 600, 0 ' 幅800、高さ600で配置
        End If
        n = n + 1
    Loop
End Sub
```

### コードの説明
- **Shell**: アプリケーションを起動します。
- **FindWindow**: 指定したアプリケーションのウィンドウハンドルを取得します。
- **SetWindowPos**: アプリケーションのウィンドウを指定した位置に移動します。

## まとめ
- **機能1**では、起動中のアプリケーションの位置情報を取得し、Excelシートに書き出します。
- **機能2**では、シートからアプリケーション名と位置情報を取得し、アプリケーションを起動して指定した位置に配置します。