こんにちは、Ryoです。
あまり夏らしい印象がないまま夏も終わりに近づいていますが、いかがお過ごしでしょうか。
私は業務都合上、ほとんど夏季休暇取れないので余計に季節感ありませんね(笑)
さて、Excelを使って日々仕事をする中で切り離せないのはファイルに関連する操作ですが、
VBAでも同様にファイルに対して開いたり閉じたり、コピーしたり場合によっては削除したりという操作がありますから使う頻度も多いです。
今回はそのファイル操作で使用頻度が多いものについて書いてみたいと思います。
1.ファイル操作・・・「開く」
◆Workbooks.Open
これは一番使用頻度が多いのではないでしょうか。
ファイルを開く場合は、開きたいファイルの場所を指定する必要があります。
Workbooks.Open "ファイルの場所(フルパス)”
この指定だけで開けます。
例えばデスクトップの「Sample」フォルダからsample1.xlsxを開きたければ、
Workbooks.Open "C:\デスクトップ\Sample\sample1.xlsx"
と記述します。
◆ThisWorkbook.Path
VBA実行ファイルと同じ場所にあるファイルを開く場合に使います。
上で例としたフォルダ内としますと、
Workbooks.Open ThisWorkbook.Path & "\sample1.xlsx"
この時のThisWorkbook.Pathには”C:\デスクトップ\Sample”までが入りますので、
& で連結し、\を付けて”\sample1.xlsx”とファイル名を指定する必要があります。
◆ファイルの開き方色々
ファイルを開く際の指定として以下の種類があります。
①読み取り専用
Workbooks.Open ThisWorkbook.Path & "\sample1.xlsx" , ReadOnly:=True
②パスワードで保護されたファイルを開く
Workbooks.Open ThisWorkbook.Path & "\sample1.xlsx" , Password:="A12345B"
③続パスワードで保護されたファイルを開く(書き込み保護)
Workbooks.Open ThisWorkbook.Path & "\sample1.xlsx" _ , WriteResPassword:="A12345B"
②と③はあまり使用頻度は高くないと思いますが、ご参考までに。
2.ファイル操作・・・「閉じる」
◆ActiveWorkbook.Close
ファイルを閉じる処理を行う場合は「Close」を使います。
先ず、アクティブになっているブックを閉じる場合は、
ActiveWorkbook.Close
これだけでOKです。
私の場合はデータ読み込み等の為に「読取り専用」で開いたファイルに対し、一通り処理してから本コマンドを使って閉じたりしています。
「読取り専用」以外のファイルですと保存を促すアラートが表示されたりしますので、
Application.DisplayAlerts = False ActiveWorkbook.Close Application.DisplayAlerts = True
このようにApplication.DisplayAlertsで挟めばOKですが、間違って実行ファイルがアクティブになっていると「強制的に閉じる」ことになりますのでご注意を!
◆Workbooks(”ブック名”).Close
ブック名を指定して閉じる際は、
Workbooks(”ブック名”).Closeとしてブック名を指定すれば閉じることが出来ます。
その他の指定としては以下になります。
①上書き保存して閉じる場合
Workbooks(”ブック名").Close SaveChanges:=True
②保存をしないで閉じる場合
Workbooks(”ブック名").Close SaveChanges:=False
③ファイル名を変更して保存してから閉じる場合
Workbooks(”ブック名").Close SaveChanges:=True, Filename:="新ブック名"
上にも書きましたが、アラート無視する処理を加えつつ閉じる命令を実行したら
「実行ファイル」だった。。。とならないようにご注意くださいね。
私はたまにやらかして唖然・・・ってことがあります。
大事なことなので2回言いました(笑)
3.ファイル操作・・・「コピー」
ファイルをコピーする際は「FileCopy」を使用します。
FileCopy "C:\デスクトップ\Sample\sample1.xlsx", _ "C:\デスクトップ\CopyTest\sample1.xlsx"
“C:\デスクトップ\Sample\sample1.xlsx”がコピー元、
“C:\デスクトップ\CopyTest\sample1.xlsx”がコピー先です。
この場合はデスクトップのSampleフォルダから、同じデスクトップ上にあるCopyTest
フォルダへコピーを実行するものです。
◆同フォルダ内にコピーする場合
コピー元と同じフォルダ内にコピーしようとして上述コードを実行すると「上書き」され、
コピーはされません。(アラートも出ませんからね!ご注意を!)
この場合、コピー実行する処理の際にファイル名を操作する必要があります。
私が良く使うのは日時(年月日&時:分:秒)をファイル名に連結することで、名前が
被らない様に処理しています。
ymd = Format(Date, "yyyymmdd") '年月日を取得 例:20170826 tim = Format(Time, "hhmmss") ’現在時刻を取得 例:100523
このように日付と現在時刻をフォーマット指定で取得してから、
FileCopy "C:\デスクトップ\Sample\sample1.xlsx", _ "C:\デスクトップ\Samplet\sample1_" & ymd & "_" & tim & ".xlsx"
こうすることでコピー先のファイル名に連結させ、被らせないようにします。
但し、ファイル名が長くなるのと連続して大量にコピーするには向かないので、その場合は
For Nextを使って連番とした方が良いですね。
For i=1 To 30 FileCopy "C:\デスクトップ\Sample\sample1.xlsx", _ "C:\デスクトップ\Samplet\sample1_(" & i & ")" & ".xlsx" Next i
こうすれば「ファイル名(1)~(30)」がコピーされます。
4.ファイル操作・・・「削除」
ファイルの削除には「Kill」を使用します。
物騒な名前の通り、このコマンドを使うとゴミ箱には行かずに抹消されます。
間違えて消しちゃったらEaseUS Data Recovery Wizard Professional 【データ復元/データの誤削除、ストレージの誤フォーマットに安全、簡単に対応】|ダウンロード版があると便利ですよ。私も使ってます。
Kill "C:\デスクトップ\Sample\sample1.xlsx"
フルパスでファイルを指定すれば綺麗さっぱり消してくれます。
使用中のファイルはエラー表示されますのでご注意を。
ちなみにワイルドカード(*)を使うこともできます。。。が、気を付けてくださいね。
関連するもの「全部抹消されます」から!
Kill "C:\デスクトップ\Sample\*.xlsx"
この場合、デスクトップにあるSampleフォルダ内の拡張子.xlsxが全て削除されます。
5.ファイル名の取得
◆ActiveWorkbook
処理を実行する際にアクティブとなっているファイル名を取得するなら、
bk_Name = ActiveWorkbook.Name
これでOKです。
◆実行ファイル名の取得
実行ファイル自体のファイル名を取得するなら、
bk_Name = ThisWorkbook.Name
これで取得できます。
◆指定フォルダ内のファイル名一覧を取得
指定したフォルダ内のファイル名一覧を取得する場合はDir関数を使います。
Sub test() Dim strFile As String Dim i As Integer '指定フォルダ内の.xlsxファイルをDirにて取得 strFile = Dir("C:\デスクトップ\Sample\" & "*.xlsx") Do While strFile <> "" i = i + 1 Cells(i, 1) = strFile strFile = Dir() 'Dir関数で見つけたファイル名をstrFile へ Loop End Sub
サンプルコード内のフォルダ場所等を用途に応じて変更し実行すると、セルA1から
順次下方向にファイル名を書き出していきます。
これを応用して必要なファイルのみ抽出したり、削除したり等々出来ますので便利です。
以上がVBAで使用頻度が高いファイル操作(開く/閉じる/コピー/削除/ファイル名取得)ですが、よく使う割に忘れがちで「あれ?どうしたっけ?」となるのは私だけですかね(笑)
今回の記事が何かの参考になれば幸いです。
Ryo