Excelで日報を作成することになり必要になったのでVBAを使ってみました。
やりたいこと
ファイルを1-24の名前で保存し、設定ファイルを作成しそこで始まりの日付を入力したら
それに合わせて名前を変える。
例えば、2020/01/01と入力するとファイル名が2020年01月、2020年02月…と変更したい。
コード
まずはじめに使ったコードを以下に紹介します。
Sub 実行()
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim fl As Folder
Set fl = fso.GetFolder(ThisWorkbook.Path) ' フォルダを取得
For i = 0 To 23
Dim fileName As String
Dim fileNumber As Integer
Dim f As File
For Each f In fl.Files ' フォルダ内のファイルを取得
fileName = f.Name ' ファイル名の取得
fileNumber = 1 + i
If fileName = fileNumber & ".xlsm" Then ' ファイル名を変更したいファイル
Dim date1 As Date
Dim date2 As Date
Dim date3 As String
date1 = Worksheets("Source").Range("D3")
date2 = DateAdd("m", i, date1)
date3 = Format(date2, "yyyy\年mm\月日報")
f.Name = date3 & ".xlsm" ' ファイル名の変更
End If
Next
Next i
' 後始末
Set fso = Nothing
End Sub
FileSystemObject
FileSystemObjectを使うと、ドライブ・フォルダ・ファイルなどを操作できます。
GetFolder()を使うことでフォルダを取得し中にあるファイルを操作できるようにします。
パスを入力して使います。
ここで便利なのが「ThisWorkbook.Path」です。
これを使うことで現在開いてるファイルがあるフォルダのパスをいちいち入力しなくて済みます。
また、フォルダをほかのとこに移動してもエラーをなくせます。
あとは上記のコードを見てもらえればわかると思いますが、
fileNumber & ".xlsm"
ファイル名を変更したいファイルというコメントがあるとこにこのコードがありますが、
この「.xlsm」で拡張子を選択しています。
これにより.txtなどの関係ないファイルを除外できます。
Format(date2, "yyyy\年mm\月日報")
このコードで変更したいファイル名を決めて
f.Name = date3 & ".xlsm"
これで変更してます。ここで拡張子をほかのに変えることも可能です。
For文
For文とは指定した条件まで同じことを繰り返すというものです。
今回はiが0-23になるまで繰り返し動作させてます。
For i = 0 To 23
' 繰り返す命令
Next i
上記が基本的な形になります。
今回のコードはFor文が2回使われてますが、
1つはiを使ってないことがわかると思いますが
これは「each」を使ってます。
「each」を使うと何がいいのか、簡単に言うと
回数がわからないときに便利!
今回で言うと、実際のところファイルって何個あるのかわからないですよね、
今回は1-24って24このファイルにしましたけど、ほかのファイルがあったりすると個数が変わってきます。
なのでファイルの個数がわからない問題を「each」を使うことで解決してます