Excel でワークシートのヘッダーやフッターを一括で置換する。
この記事は自分用の覚書です。
(Windows 10 Pro 64ビット + Excel2016 Office365 Business サブスクリプション
バージョン1804(ビルド9226.2156)
■ブック内の全てのワークシートのヘッダーやフッターを、一括で全く同じ(表記も、入れる位置も全部同じ)にする。
VBA を使わないで可能。
1.シート名の上で右クリックして「すべてのシートを選択」をクリック
2.「ページレイアウト」タブからヘッダーとフッターを任意に設定
これで、全てのワークシートのヘッダーやフッターが同じになる。
■VBAで処理する。
ワークシート関数の SUBSTITUE 関数を使うプロシージャーの例
Sub ヘッダーとフッターの置換_1()
'ワークシート関数の SUBSTITUTE 関数を呼び出して使う。
Dim i As Long
Dim 置換前 As String, 置換後 As String '■1
置換前 = Application.InputBox(Prompt:="置換前の文字列", Default:="置換前の文字列を入力", Type:=2) '■2
If 置換前 = "False" Then Exit Sub '■3
置換後 = Application.InputBox(Prompt:="置換後の文字列", Default:="置換後の文字列を入力", Type:=2) '■2
If 置換後 = "False" Then Exit Sub '■3
For i = 1 To Worksheets.Count '■4
With Worksheets(i).PageSetup
'■5
If .LeftHeader <> "" Then .LeftHeader = WorksheetFunction.Substitute(.LeftHeader, 置換前, 置換後)
If .CenterHeader <> "" Then .CenterHeader = WorksheetFunction.Substitute(.CenterHeader, 置換前, 置換後)
If .RightHeader <> "" Then .RightHeader = WorksheetFunction.Substitute(.RightHeader, 置換前, 置換後)
If .LeftFooter <> "" Then .LeftFooter = WorksheetFunction.Substitute(.LeftFooter, 置換前, 置換後)
If .CenterFooter <> "" Then .CenterFooter = WorksheetFunction.Substitute(.CenterFooter, 置換前, 置換後)
If .RightFooter <> "" Then .RightFooter = WorksheetFunction.Substitute(.RightFooter, 置換前, 置換後)
End With
Next
'
'■1
'変数「置換前」と「置換後」を String(文字列型)として宣言。
'
'■2
'Excel VBAで使える InputBox には、InputBoxメソッドとInpuBox関数がある。
'ここでは、ApplicationオブジェクトのInputBoxメソッドを使っている。
'InputBoxメソッドでは引数Typeを使える。InputBox関数では引数Typeを指定できない。
'Type:=2 の指定で、文字列のみを受け取り、返すことができる。
'ヘッダーやフッターの値を置換するので、置換の対象は常に文字列。
'(そういう意味で、変数の宣言でも、変数「置換前」と「置換後」を文字列型(Strings)として宣言している。)
'
'InputBox で受け取る値を使って数学的な計算をするわけではないので、Type:=2 の指定で文字列を受け取る指定をしておけば、
' 第4期全体会合 といったような、文字と数字が混ざっている値でも受け取れるし、
' 2018 といった純粋な数字の場合でも、どちらでも受け取れる。
'
'■3
'InputBoxメソッドの「キャンセル」がクリックされたら、このプロシージャ―を抜ける。
'InputBoxメソッドは、「キャンセル」がクリックされたら、 False(論理値) を返す。
'文字列を受け取れるように、引数Typeに「2」を指定しているので、InputBoxメソッドが返してくる False も文字列型になる。
'そこで、IFステートメントでは、FALSE をダブルコーテーションで囲んで、文字列として扱っている。
'このコードで、False をダブルコーテーションで囲っていなくて、InputoBoxメソッドの入力欄に文字列(純粋な数字ではないもの)を入力すると、
'「型が一致しません」というエラーになる。
'
'■4
'Worksheets.Count で、ブック内にワークシートが何枚あるかを取得。
'ワークシートが何枚あっても、左端から右端まで全ワークシートを対象に処理を行うために使う。
'
'■5
'ワークシート関数の SUBSTITUE 関数を呼び出して使っている。
'If ステートメントで、ヘッダー(左・中央・右)やフッター(左・中央・右)に何か入っていれば、(空欄でなければ)置換を行うようにしている。
'ヘッダーやフッターに何も入っていなければ、(空欄なら)置換の処理を始めない。
'
'同様の処理を行うコードで、With ステートメントだけを使った下記のような書き方がある。
'
'For i = 1 To Worksheets.Count
' With Worksheets(i).PageSetup
' .LeftHeader = WorksheetFunction.Substitute(.LeftHeader, 置換前, 置換後)
' .CenterHeader = WorksheetFunction.Substitute(.CenterHeader, 置換前, 置換後)
' .RightHeader = WorksheetFunction.Substitute(.RightHeader, 置換前, 置換後)
' .LeftFooter = WorksheetFunction.Substitute(.LeftFooter, 置換前, 置換後)
' .CenterFooter = WorksheetFunction.Substitute(.CenterFooter, 置換前, 置換後)
' .RightFooter = WorksheetFunction.Substitute(.RightFooter, 置換前, 置換後)
' End With
'Next
'
'上記のコードの場合、ヘッダー(左・中央・右)とフッター(左・中央・右)に
'何か値が入っていても、入ってなくても、一つのシートにつき6か所で置換を行おうとする。
'値が入っていない場合、しなくてもよい作業をしていることになる。
'
'If .LeftHeader <> "" Then .LeftHeader = WorksheetFunction.Substitute(.LeftHeader, 置換前, 置換後)
'
'のように書くことで、左・中央・右のヘッダーやフッターに何か入っている(空欄ではない)場合にだけ置換を始める。
'これによって、処理にかかる時間を With ステートメントだけを使うより短くしている。
'
End Sub
全てのワークシート関数を呼び出せるわけではない。
| 固定リンク
コメント