こんにちは!するどいプランナーです!
今日は簡単なVBAの使用例のおまけとして「エクセル資料のカーソル位置をデフォルト位置にする」を説明します。
仕様書としてエクセルを利用しているケースはまだ多々あるかと思いますが、上司や取引先に提出したりする場合のお作法として
- ファイルを開いたとき、トップページ(=一番左のタブ)を表示する
- 各シートを開いたとき、カーソルを一番左上にする
ことが求められたりします。カーソルが変な位置にあると、受け取った人は読みにくいですからね。
ファイル数が多いと、1個1個設定していくのも手間になるのでVBAで自動化してみましょう。
◆完成イメージ
処理の概要
特定フォルダ内の全.xlsxファイルに対して
- 表示されるシートを一番左のタブのものにする
- カーソル位置をA1にする
- 保存する
の処理を行います。
今回は2つの関数を使用します。
①提出用の調整()
提出用の表示調整を、今開いている1つのファイルに対して行います。
②提出用の調整_フォルダ内全部()
フォルダ内のファイルを開き、①の処理を繰り返します。
◆VBAマクロ①提出用の調整()
処理の内容にわかりにくいところはないかと思います。
一番左のシートを選択する、の部分は「シートが表示されていれば」を調べずに行う方法もありますが、非表示のシートが含まれているとエラーになることがあるので回避しています。
' カーソルをA1に移動して一番左のシートを選択する
Sub 提出用の調整()
Dim objSheet As Worksheet
' ブックの全シートを 1 つずつループして処理する
For Each objSheet In ActiveWorkbook.Worksheets
'A1を選択、スクロール位置も移動
objSheet.Activate
Application.Goto Reference:=Range("A1"), Scroll:=TrueNext
'一番左のシートを選択する
Dim i As Long
For i = 1 To ActiveWorkbook.Worksheets.Count
'シートが表示されていれば選択する
If Worksheets(i).Visible = xlSheetVisible Then
Worksheets(i).Select
Exit Sub
End If
Next i
End Sub
◆VBAマクロ②提出用の調整_フォルダ内全部()
こちらも処理の内容にわかりにくいところは無いかと思います。
Application.ScreenUpdating はVBAではよく使用します。Falseにしておくと、ファイルを開いたりしている間に画面が更新されないので処理が早く終わります。
Sub 提出用の調整_フォルダ内全部()
'画面の更新を止める
Application.ScreenUpdating = False
Dim path As String
Dim fs, file, files As Object
path = ThisWorkbook.path & "\src\"
Set fs = CreateObject("Scripting.FileSystemObject")
Set files = fs.GetFolder(path).files'フォルダ内の全ファイルについて処理
For Each file In files'ファイルを開いてブックとして取得
Dim wb As Workbook
Set wb = Workbooks.Open(file)'ブックに対する処理
Call 提出用の調整'保存して閉じる
wb.Save
Call wb.Close(SaveChanges:=True)Next file
'画面の更新を元に戻す
Application.ScreenUpdating = True
End Sub
◆改良してみよう
やりたかった自動化は以上のVBAで行えますが、もう少し改良の余地がありそうですね。
- フォルダのパスを自由に指定できる
- 子フォルダの中も再帰的に処理する
などができれば、もっと便利になりそうです。
使用してみて改善の余地があるところはどんどん改良していきましょう!
◆まとめ
先週と同じ話になりますが、効率化の手段としてVBAの手札を持っておけるのは1つの強さなので、食わず嫌いにならずに挑戦してみましょう。
完全な自動化はハードルが高くても、「自動化する部分」と「手動のままの部分」のバランスを見極めれば、すこしの手間で多くの作業が楽になるはず!です。