【簡単エクセルマクロ・VBA】ファイル名を変更する|Name関数|ファイル操作 #009
いつもありがとうございます。
これは、ノンプログラマー向けのエクセルマクロ・VBA解説シリーズです。
本稿では、ファイル名を変更する方法を解説いたします。
ことばの意味
- ノンプログラマー
プログラミングを本職としない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
筆者の記事関連経験/資格
- VBA使用経験 約20年
- Python 3 エンジニア認定基礎試験 合格
一般社団法人Pythonエンジニア育成推進協会によって運営・認定されている民間資格で、経済産業省が定めたガイドライン「ITスキル標準(ITSS)」において、職種:ソフトウェアディベロップメント、専門分野:応用ソフトのレベル1に掲載されています。
VBAにおけるファイル操作の全体像
VBAにおける「ファイル操作」の全体像は以下の記事で解説しております。
本稿では「ファイル操作」の一部である「ファイル名を変更する方法」を解説いたします。
VBAでファイル名を変更する方法
以下のようなフォルダ構成を例に説明します。
- マクロを記述した "ファイル名を変更する.xlsm" と同階層に "001_変更前"、"002_変更後" というが名前のフォルダがあります。
- "001_変更前"には "変更前のファイル名1.xlsx"が入っています。
- この"変更前のファイル名1.xlsx" を "変更後のファイル名1.xlsx"に変更し "002_変更後"に保存します。
これを実行するコードとマクロ実行結果を以下に示します。
Sub Sample()
' 変数宣言
Dim original_filename As String
Dim new_filename As String
' 変更前及び変更後のファイル名(パス)を変数に代入する
original_filename = ThisWorkbook.Path & "\001_変更前\変更前のファイル名1.xlsx"
new_filename = ThisWorkbook.Path & "\002_変更後\変更後のファイル名1.xlsx"
' ファイル名を変更する
Name original_filename As new_filename
End Sub
解説します。
' 変数宣言
Dim original_filename As String
Dim new_filename As String
この冒頭の部分は変数の宣言です。Dim 変数 As データ型の構文で宣言します。
これによって各変数は As 以降で指定した型のデータを保持できるようになります。
尚、String
型は文字列データを扱うためのデータ型です。
' 変更前及び変更後のファイル名(パス)を変数に代入する
original_filename = ThisWorkbook.Path & "\001_変更前\変更前のファイル名1.xlsx"
new_filename = ThisWorkbook.Path & "\002_変更後\変更後のファイル名1.xlsx"
ここでは、変更前及び変更後のファイル名(パス)を、それぞれの変数に代入しています。
具体的には:
original_filename
には、現在のワークブックが保存されているフォルダのパスThisWorkbook.Path
に続いて「\001_変更前\変更前のファイル名1.xlsx
」というファイルパスが代入されます。new_filename
には、現在のワークブックが保存されているフォルダのパスThisWorkbook.Path
に続いて「\002_変更後\変更後のファイル名1.xlsx
」というファイルパスが代入されます。
' ファイル名を変更する
Name original_filename As new_filename
ここがファイル名を変更している部分です。original_filename
を new_filename
に変更しています。
Name関数の基本構文は以下の通りです。
Name 変更前のファイル名(ファイルパス) As 変更後のファイル名(ファイルパス)
マクロ実行結果を見ていただくと分かりますが、この Name関数 では、ファイル名を変更するときに original_filename
は消去され new_filename
が生成されます。
以上が、VBでファイル名を変更する方法です。
【発展偏】VBAでフォルダ内のすべてのファイルの名称を変更する方法
上記で解説した方法では、ファイル名を変更したいファイルが1つだけで、しかもファイル名がいつも固定値であるような場合にしか使えません。
このような状況であれば、わざわざコードを書くよりも、手作業でファイル名を変更してしまった方が早いことは言うまでもありませんね。
マクロが本領を発揮するのは、多数のファイルの名称を一括で変更するような場合や、条件によって自動で処理内容を変えるような場合です。
ここでは、その例として以下のような場合のコードを示したいと思います。
- "001_変更前" のフォルダに100個のファイルが入っている。
- "002_変更後" のフォルダにファイル名を変更したファイルを出力する。
- この際、条件に合致しないファイルは除外する。
以下にコードを示していきます。このマクロの動作手順は以下のようになっています。
- マクロで実行・・・"001_変更前" フォルダに入っている100個のファイルをシートのB列に書き出す。
- 人手で実行 ・・・ B列をC列にコピーし、エクセルの置換機能などで変更したいファイル名に修正する。
- マクロで実行・・・C列で指定した名称にファイル名を変更し "002_変更後" フォルダにファイルを出力する。
まず 1 のコードとマクロ実行結果を示します。
Sub Sample2()
' 参照設定が必要なライブラリ
' Microsoft Scripting Runtime
' 変数宣言
Dim twb As Workbook
Dim twb_ws1 As Worksheet
Dim fso As FileSystemObject
Dim source_directory As String
Dim source_file As Object
Dim row_idx As Long
' ワークブックとワークシートを変数に代入
Set twb = ThisWorkbook
Set twb_ws1 = twb.Worksheets(1)
' オブジェクトを変数に代入
Set fso = New FileSystemObject
' ソースディレクトリを変数に代入
source_directory = ThisWorkbook.Path & "\001_変更前"
' 書き込み用の行番号変数の初期値を設定
row_idx = 6
' ソースディレクトリ内の全ファイルを順番に処理
For Each source_file In fso.GetFolder(source_directory).Files
' シートにファイル名を出力
twb_ws1.Cells(row_idx, 2) = source_file.Name
' 行番号変数に + 1
row_idx = row_idx + 1
Next source_file
End Sub
"001_変更前" フォルダに入っているファイルの名称がシートのB列に書き出されました。
尚、このシートの上部にはボタンの図形が表示されていますが、これはマクロ実行スタート用の図形です。毎回、エクセルメニューの「表示」→「マクロ」→「マクロの表示」から実行したり、VBAのエディター(VBE)を開いてマクロを実行しても良いですが、手間がかかります。
そこで、以下のように、右クリックメニューから図形にマクロの登録をしておくことができます。一度図形にマクロを登録してしまえば、以後は、この図形をクリックするだけでマクロがスタートします。
次に 2 の作業内容を示します。
B列にマクロで書き出したファイル名が入力されていますので、これをC列にコピーします。その後、エクセルの置換機能(Ctrl + H)などで修正したいファイル名に修正します。
最後に 3 のコードとマクロ実行結果を示します。
Sub Sample3()
' 参照設定が必要なライブラリ:
' Microsoft Scripting Runtime
' 変数宣言
Dim twb As Workbook ' 現在のワークブックを格納する変数
Dim twb_ws1 As Worksheet ' 現在のワークブックの最初のワークシートを格納する変数
Dim fso As FileSystemObject ' ファイルシステム操作を行うオブジェクトを格納する変数
Dim source_directory As String ' 変更前のファイルがあるディレクトリパスを格納する変数
Dim destination_directory As String ' 変更後のファイルを保存するディレクトリパスを格納する変数
Dim last_row As Long ' 処理対象の最終行を格納する変数
Dim row_idx As Long ' ループ処理で使用する行番号を格納する変数
' ワークブックとワークシートを変数に代入
Set twb = ThisWorkbook
Set twb_ws1 = twb.Worksheets(1)
' オブジェクトを変数に代入
Set fso = New FileSystemObject
' ソースディレクトリ、ディスティネーションディレクトリを変数に代入
source_directory = ThisWorkbook.Path & "\001_変更前\"
destination_directory = ThisWorkbook.Path & "\002_変更後\"
' 最終行の取得
last_row = twb_ws1.Cells(twb_ws1.Rows.Count, 2).End(xlUp).Row
' 行をループして処理
For row_idx = 6 To last_row
' ファイル名に"除外"を含むファイルを除外する
If InStr(twb_ws1.Cells(row_idx, 3), "除外") = 0 Then
' 名称を変更したファイルを "002_変更後" に出力
Name source_directory & twb_ws1.Cells(row_idx, 2) _
As destination_directory & twb_ws1.Cells(row_idx, 3)
End If
Next row_idx
End Sub
除外するファイルは元のフォルダに残り、修正されたファイルのみ変更後のフォルダに出力されました。
いかがでしたでしょうか。実際の仕事の場面では、このように大量のファイルを扱ったり、条件で処理を分けたい場合などにマクロでの処理が有効です。
おわりに
ご覧いただきありがとうございました。
本稿では、「ファイル操作」の中の「ファイル名を変更する方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるより、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
私は、迷った場合は、インプレス社の「いちばんやさしい」シリーズを購入することが多いです。
>>Amazon で VBA の書籍をでチェックする>>楽天市場 で VBA の書籍をチェックする
>>Yahoo!ショッピングでVBAの書籍をチェックする
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。