« ◆Excel VBA(Excel起動時に前回終了ウィンドウ状態を再現) | トップページ | ♪Piano »

2007年3月24日 (土)

◆Excel VBA(Excel起動時に前回終了ウィンドウ状態を再現2)

今回はExcelをカスタマイズするシリーズの本当の最終回とします。

前回はちょっと前置きが長くなりましたが、要はExcelを起動したときに前回保存したウィンドウの状態を再現し、タスクバーに隠れないようにウィンドウを自動的に移動するということになります。前回書き忘れましたが、実はこのウィンドウ位置を自動調節してくれるフリーソフトは存在します(名前は忘れましたが)。以前私も使用していましたが、なぜか使用しなくなりました。わざわざソフトを常駐させておきメモリーを消費するのがいやになったからかもしれませんが理由は覚えていません。

さて、ここからが本題です。前回の処理の概略に沿って説明します。

    (1)自分好みに調節したExcelウィンドウの縦横サイズと表示座標を取得する

    (2)Excel終了時に(1)の情報を保存する(保存先はレジストリでも良いが手軽なiniファイルへの保存を採用することとする。WindowAPI関数が必要)

      この(1)、(2)の処理の例は以下の通り

        lngWindowHandle = FindWindow("XLMAIN", vbNullString)
       
        If lngWindowHandle = 0 Then Exit Sub
            
        With Application
            If .WindowState = xlMinimized Then
                .WindowState = xlNormal
            End If
            lrc = GetWindowRect(lngWindowHandle, lpRect)
            If lrc = 0 Then
                Exit Sub
            End If
        End With
       
        With lpRect
            lVal = _
                    gEt_Left & "=" & .Left & vbNullChar & _
                    gEt_Top & "=" & .top & vbNullChar & _
                    gEt_Right & "=" & .Right - .Left & vbNullChar & _
                    gEt_Bottom & "=" & .Bottom - .top & vbNullChar & vbNullChar
        End With
        Call WritePrivateProfileSection(gSc_ExcelWindowSize, lVal, "iniファイルパス")

       解説ですが、GetWindowRect関数で現在のウィンドウ位置を取得するのですが、ウィンドウハンドルを必要としますのでFindWindowで取得します。WritePrivateProfileSectionでiniファイルに書き込みをします。当然以下をモジュールの先頭に記述しておく必要があります。これらの処理をWorkbook_BeforeCloseから呼び出せばよい訳です。

       Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
           ByVal lpszClass As String, ByVal lpszWindow As String) As Long

        Private Declare Function GetWindowRect Lib "user32" _
            (ByVal hWnd As Long, _
            lpRect As RECT) As Long

       Public Declare Function WritePrivateProfileSection Lib "kernel32" _
             Alias "WritePrivateProfileSectionA" _
             (ByVal lpAppName As String, _
             ByVal lpString As String, _
             ByVal lpFileName As String) As Long

    (3)Excel起動時にiniファイルから情報を取得する

    (4)取得したウィンドウ位置などを設定する(当然これもWindowsAPI関数)

       (3)、(4)の処理については以下の通り。

        lngWindowHandle = FindWindow("XLMAIN", vbNullString)

        If lngWindowHandle = 0 Then Exit Sub
            
        rtn = m_GetSecIni(pIniNm, gSc_ExcelWindowSize, larr)
        If rtn = False Then Exit Sub
       
        For i = LBound(larr) To UBound(larr)
            Select Case larr(i)(0)
            Case gEt_Left
                lngMoveLeft = larr(i)(1)
            Case gEt_Top
                lngMoveTop = larr(i)(1)
            Case gEt_Right
                lngMoveRight = larr(i)(1)
            Case gEt_Bottom
                lngMoveBottom = larr(i)(1)
            End Select
        Next

        lngWin32apiResultCode = _
            MoveWindow(lngWindowHandle, _
                       lngMoveLeft, _
                       lngMoveTop, _
                       lngMoveRight, _
                       lngMoveBottom, _
                       True)

       Thisworkbookに記述したWorkbook_openから上記の処理を呼び出すことで実現できます。m_GetSecIniでは、GetPrivateProfileSection関数を呼んで、iniファイルの指定セクションに含まれるキーの値を一括取得しています(詳細は割愛します、ネット上にたくさん例がありますので)。iniファイルには以下の通り記述されていて、ExcelWindowSizeセクションの情報を一括取得するわけです。そして、MoveWindow関数で前回保存した値でExcelのウィンドウ位置を変更します。必要な宣言は以下の通り。

          [ExcelWindowSize]
            Left=50
            Top=0
            Right=973
            Bottom=767

        Private Declare Function MoveWindow Lib "user32.dll" _
               (ByVal hWnd As Long, _
                ByVal x As Long, _
                ByVal y As Long, _
                ByVal nWidth As Long, _
                ByVal nHeight As Long, _
                ByVal bRepaint As Long) As Long
       
        Public Declare Function GetPrivateProfileSection Lib "kernel32.dll" _
                Alias "GetPrivateProfileSectionA" _
                (ByVal lpAppName As String, ByVal lpReturnedString As String, _
                ByVal nSize As Long, ByVal lpFileName As String) As Long

いやぁ~長くなりましたが以上で実現できます。

これらの処理を記述したExcelブックをMS-OfficeがインストールされているフォルダにあるXLStartに格納しておけば、Excelを毎回起動する度に前回保存状態を再現してくれるようになります。Excelブックは非表示状態にしておくと邪魔にならず良いでしょう。お試しあれ。

さて、Excelのカスタマイズシリーズは一旦終了とします。また、ネタが見つかったら書き込んでみたいと思います。それでは。

※私が作成したVBAツールです。よかったら使ってみてください。

« ◆Excel VBA(Excel起動時に前回終了ウィンドウ状態を再現) | トップページ | ♪Piano »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ◆Excel VBA(Excel起動時に前回終了ウィンドウ状態を再現) | トップページ | ♪Piano »