今回は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ツールです。よかったら使ってみてください。
最近のコメント