Excel VBA ファイル操作

名前を変えてファイルをコピー
既存のファイルを、名前を変えてクローン・ファイルを作るものです。
このマクロをダウンロードできます。FileNameChangeCopy.xls
解説:
FileCopy ステートメントを使って、ファイルをコピーします。
既存ファイルと、変更後のファイルそれぞれ、フルパスで指定します。
FileCopy source, destination
source 必ず指定します。コピーするファイル名を示す文字列式を指定します。フォルダ名およびドライブ名を含めて指定できます。
destination 必ず指定します。コピー後のファイル名を示す文字列式を指定します。フォルダ名およびドライブ名を含めて指定できます。
注:
既に開いているファイルに対して、FileCopy ステートメントを実行しようとすると、エラーが発生します。
Exit ステートメントは、Do...Loop ループ、For...Next ループ、Function、Sub、または Property の各プロシージャを抜けるフロー制御ステートメントです。
指定フォルダの指定ファイルを、別のフォルダにそのままコピー
既存のファイルを、指定したファイルだけを、別のフォルダにコピーするものです。
このマクロをダウンロードできます。FileCopyVBA01.xls
指定フォルダのサブ・フォルダの構成ファイルも含めて、
指定拡張子のファイルを、拡張子を変更してコピー
別項の「フォルダ内のファイルを検索」は、指定フォルダ直下のファイルだけを、対象にしています。
ここでは、FileSystemObject を使用して、フォルダ内のすべてのサブ・フォルダ を再帰的に探索して、処理対象にしています。
このマクロは、下記を参考にしました。
Hey, Scripting Guy! : フォルダとそのサブフォルダ内のファイルの一覧を取得することはできますか
https://gallery.technet.microsoft.com/scriptcenter/93706e43-8c0a-4190-9c2c-ada05ef8667b
再帰を使用したサブフォルダの列挙
https://gallery.technet.microsoft.com/scriptcenter/39273856-c605-4e10-8580-6e733bd16add
作った目的は、「UWSCの落し物部屋」のサンプル部分
http://siromasa.html.xdomain.jp/uwsc/u_sample/
を、参照しやすくするためです。
「UWSCの落し物部屋のサンプル」は、サンプル・ファイルの拡張子が、「uws」のため、リンクをクリックすると、ファイルをダウンロードしに行きます。
ファイルをそのまま使う場合は、ダウンロードすることでよいのですが、プログラムを参照する目的では、ファイルの内容が、ブラウザ画面で直接表示されたほうが、便利です。
このため、私は、Website Explorer を使って、上記サイトの全てのファイルを、私のパソコンに、一括ダウンロードしました。
そして、サンプル・ファイルを、この Excelマクロを使って、拡張子を「uws」から「txt」に変換してコピーしました。
さらに、ローカルの、List.html を以下のように加工しました。
1.正規表現置換で、(<a href=.*.uws">)を、\1ダウンロード</a> \1 に。
これで、<a href="./DLL/Class_Box.uws">が、
以下のようになります。
<a href="./DLL/Class_Box.uws">ダウンロード</a> <a href="./DLL/Class_Box.txt">
2.正規表現置換で、\.uws">$ を .txt">に。
3.普通の置換で、.uws</a> を .txt</a> に、.uws [Treasure]</a> を .txt [Treasure]</a> に。
これで、私のパソコン上では、リンクをクリックすると、期待通り、ブラウザで、UWSのプログラムが、画面表示されるようになりました。
このマクロをダウンロードできます。→FileRenameCopy.xls
注:処理の途中でログを出力するバージョンも、参照下さい。
解説:
Fileオブジェクトは、ファイルのあらゆるプロパティにアクセスする手段を提供します。
http://msdn.microsoft.com/ja-jp/library/cc428069.aspx
プロパティ | 内容 |
Attributes プロパティ | ファイルまたはフォルダの属性を設定します。値の取得も可能です。属性によっては、値の取得のみ可能な場合もあります。 |
DateCreated プロパティ | 指定されたファイルまたはフォルダの作成された日付と時刻を返します。値の取得のみ可能です。 |
DateLastAccessed プロパティ | 指定されたファイルまたはフォルダが最後にアクセスされたときの日付と時刻を返します。値の取得のみ可能です。 |
DateLastModified プロパティ | 指定されたファイルまたはフォルダが最後に更新されたときの日付と時刻を返します。値の取得のみ可能です。 |
Drive プロパティ | 指定されたファイルまたはフォルダが格納されているドライブの名前を返します。値の取得のみ可能です。 |
Name プロパティ | 指定されたファイルまたはフォルダの名前を設定します。値の取得も可能です。 |
ParentFolder プロパティ | 指定されたファイルまたはフォルダが格納されているフォルダを表す Folder オブジェクトを返します。値の取得のみ可能です。 |
Path プロパティ | 指定されたファイル、フォルダ、またはドライブのパスを返します。 |
ShortName プロパティ | 8.3 形式のファイル名が必要なプログラムのために、短いファイル名を返します。 |
ShortPath プロパティ | 8.3 形式のファイル名が必要なプログラムのために、短いパス名を返します。 |
Size プロパティ | ファイルの場合、指定されたファイルのバイト単位のサイズを返します。フォルダの場合、指定されたフォルダ内のすべてのファイルおよびフォルダの合計サイズをバイト単位で返します。 |
Type プロパティ | ファイルまたはフォルダの種類に関する情報を返します。たとえば、名前が .TXT の拡張子で終わるファイルの場合なら、"テキスト文書" という文字列が返されます。 |
メソッド | 内容 |
Copy メソッド | 指定したファイルまたはフォルダを別の場所にコピーします。 |
Delete メソッド | 指定されたファイルまたはフォルダを削除します。 |
Move メソッド | 指定されたファイルまたはフォルダを別の場所へ移動します。 |
OpenAsTextStream メソッド | 指定したファイルを開き、開いたファイルの読み取り、または追加書き込みに使用できる TextStream オブジェクトを返します。 |
指定フォルダの内容を丸ごとコピー
フォルダ内容を、一式コピーするときに、使います。
下記のマクロを使うと、Excelファイルと同レベルのフォルダをコピーします。
解説:
CopyFolder メソッドは、フォルダを別の場所へコピーします。
FileSystemObject オブジェクト .CopyFolder コピーするフォルダsource , コピー先destination [, 既存フォルダを上書きするかどうか ]
「コピーするフォルダ」にはワイルドカード文字を使えます。
「コピー先」にはワイルドカード文字を使えません。
例:
FileSystemObject.CopyFolder "c:\mydocuments\letters\*", "c:\tempfolder\"
引数
source にワイルドカード文字を指定した場合、または引数
destination がパスの区切り文字 (\) で終わる場合は、引数
destination に既存フォルダを指定したと判断され、条件に一致するフォルダおよびサブフォルダがそのフォルダ内へコピーされます。
それ以外の場合では、引数
destination には、作成するフォルダの名前を指定したと判断されます。
いずれの場合も、フォルダのコピーで実行される可能性のある処理は 4 種類あります。
- 引数 destination に指定したフォルダが存在しない場合、引数 source に指定したフォルダおよびそのフォルダ内のすべてのファイルとフォルダがコピーされます。これが通常の場合です。
- 引数 destination に指定したのが既存ファイルの場合、エラーが発生します。
- 引数 destination がフォルダの場合、指定したフォルダおよびそのフォルダ内のすべてのファイルとフォルダをコピーしようとします。引数 source で指定したフォルダ内のファイルと同じ名前のファイルが引数 destination で指定したフォルダ内に既にある場合、引数 overwrite に偽 (False) を指定しているとエラーが発生します。真 (True) を指定していると、ファイルがコピーされ、既存ファイルは上書きされます。
- 引数 destination に読み取り専用のフォルダを指定した場合、引数 overwrite に偽 (False) を指定し、フォルダ内の既存の読み取り専用ファイルへコピーを試みようとすると、エラーが発生します。
引数
source でワイルドカード文字を使って指定したフォルダが、どのフォルダとも一致しない場合も、エラーが発生します。
CopyFolder メソッドは、最初のエラーが発生した時点で処理を中止します。エラーが発生するまでに行った処理を取り消したり元に戻したりする処理は一切行われません。
指定フォルダを削除
ローレベル・コード設定(その2)は、NTFSをデータベース管理システムとして使います。
フォルダに、何万点ものファイルを入れたものをエクスプローラから削除しようとすると、削除操作に時間がかかります。
下記のマクロを使うと、速く削除できます。
下記のマクロは、削除したいフォルダを、A2 以下のセルに登録しておきます。
そして、このExcelファイルを、削除したいフォルダと同一レベルに登録して、マクロを起動します。
解説:ファイルを開いていたり、フォルダが存在していなかった場合に DeleteFolder メソッドを使うとエラーになります。このため、上のマクロでは On Error Resume Next で読み飛ばしています。
削除前にフォルダ存在チェックをする方法でもエラーを回避できます。
If FSO.FolderExists(削除フォルダパス) Then
FSO.DeleteFolder 削除フォルダパス
End If
指定フォルダを削除2
Excelブックと同じフォルダに存在する、Excelシートで指定したフォルダを一括削除します。
指定ファイルを削除
下記のマクロは、削除したいファイルを、A2 以下のセルに登録しておきます。
そして、このExcelファイルを、削除したいフォルダと同一レベルに登録して、マクロを起動します。
フォルダを作成
Excelシートに列記した名前で、フォルダを作るマクロです。
この、マクロのExcelブックが保存してあるフォルダの配下に、サブ・フォルダとして作成します。
この例では、作りたいフォルダ名は、このマクロのExcelブックの、シート名「管理シート」の、セル「B11」以下に登録してあります。
解説:
MkDir ステートメント は、新しいフォルダを作成します。
構文
MkDir path
引数 path は必ず指定します。引数 path には、作成するフォルダ名を示す文字列式を指定します。
ドライブ名も含めて指定できます。ドライブ名を省略したときは、現在のドライブに新しいフォルダが作成されます。
既に存在するフォルダを作成しようとすると、エラーになります。
上位の階層フォルダまでさかのぼって、フル・パスでフォルダを作ってくれる分けではありません。(単独のフォルダを作成するだけです。)
ファイル名を変更 (or ファイルを移動)
Win32 API のヘルプ chm を作る過程で必要になったので、作成しました。
Excel マクロと同一フォルダにあるファイルのファイル名を変更します。
変更後のファイル名が既存の場合は、処理を飛ばします。
VBA03 で、ファイル名として使えない文字を削除するルーチンを追加しました。
このマクロをダウンロードできます。ChangeFileNameVBA04.xls
解説:
Name ステートメント は、ファイルまたはフォルダの名前を変更します。
ファイルを他のフォルダに移動する場合も、Name を使います。
構文
Name oldpathname As newpathname
Name ステートメントの構文は、次の指定項目から構成されます。
指定項目 | 内容 |
oldpathname |
必ず指定します。名前を変更するファイル名を示す文字列式を指定します。
フォルダ名およびドライブ名も含めて指定できます。 |
newpathname |
必ず指定します。新しいファイル名を示す文字列式を指定します。
フォルダ名およびドライブ名も含めて指定できます。
引数 newpathname には、既に存在しているファイル名は指定できません。 |
Name ステートメントはファイル名を変更して、必要に応じて他のフォルダにファイルを移動します。
Name ステートメントでは、ドライブ間ではファイルを移動しますが、newpathname と oldbathname で指定したドライブ名が同じ場合は、単に既存のフォルダの名前を変更します。
ファイルやフォルダを新しく作成することはありません。
「新しい名前」のファイルがすでに存在するとエラーになります。
Nameステートメントを実行する前に、
Dir 関数で存在確認をすることができます。
現在、開いているファイルに対して
Name ステートメントを実行すると、エラーが発生します。ファイル名を変える前に、開いているファイルを閉じてください。
引数
Name には、複数の文字を指定するためのアスタリスク (
*) および単一の文字を指定するための疑問符 (
?) のワイルド カード文字を指定できません。
次の例は、
Name ステートメントを使って、ファイルの名前を変更します。
この例では、指定するフォルダは既に存在するものと仮定します。
ファイルを別のフォルダに移動する
ファイルの移動には、Name ステートメント だけでなく、ファイルシステム・オブジェクト の MoveFile メソッドも利用できます。
ファイルシステムオブジェクトによるファイル移動
https://www.239-programing.com/excel-vba/fso/fso023.html
FileSystemObjectオブジェクト - MoveFileメソッド
http://officetanaka.net/excel/vba/filesystemobject/filesystemobject23.htm
FileSystemObject:ファイルを移動する(MoveFile)
https://excelwork.info/excel/fsomovefile/
VBAでフォルダを移動させるMoveFolder、ファイルを移動させるMoveFileメソッドの使い方
https://atmarkit.itmedia.co.jp/ait/articles/1705/02/news020.html
以下の例は、Excel ファイルと同じフォルダに登録したファイル名の一覧テキストを読み込んで、対象指定拡張子でこの一覧に「無い」ファイルを別のフォルダに移動させます。
指定高さ以下の JPG ファイルを指定フォルダに移動する
この Excel ファイルと同じフォルダにある JPG ファイルで、指定高さ以下のものを、別のフォルダに移動します。
このマクロは、私が収集した JPG画像ファイルを、スライドショーで表示する上で、パソコン画面より高さが低いファイルを Batch AI Photo Sharpener で拡大するために抽出する目的で作成しました。
JPG ファイルの巾、高さの取得方法は、下記サイトで教えていただきました。
【VBA】画像の幅と高さを取得する
https://kazusa-pg.com/vba-picinfo/
Windows Image Acquisition Automation を使うためには参照設定が必要です。
Microsoft Windows Image Acquisition Library にチェックをつけます。
ImageFile object
https://learn.microsoft.com/ja-jp/previous-versions/windows/desktop/wiaaut/-wiaaut-imagefile
横長 JPG ファイルのみを指定フォルダに移動
この Excel ファイルと同じフォルダにある JPG ファイルで、横長形式のものを、別のフォルダに移動します。
移動するファイルの数を指定できます。
このマクロは、私が収集した JPG画像ファイルから、横画面のパソコンのスライドショーで表示するのに適したファイルを抽出する目的で作成しました。
画像の幅と高さを取得する
https://kazusa-pg.com/vba-picinfo/
ImageFile object
https://learn.microsoft.com/ja-jp/previous-versions/windows/desktop/wiaaut/-wiaaut-imagefile
複数ブックのシートを1つのブックにコピーする
moug モーグ の下記に、複数のブックのシートを、一つのブックにコピーして集約するマクロを紹介していただいています。
http://www.moug.net/tech/exvba/0060003.html
ただ、このマクロは、〜Excel 2003 と Excel 2007〜 が混在する環境では下記のエラーが表示されて動きませんでした。
移動先またはコピー先のブックの行列数が元のブックの行列数よりも少ないため、
シートを移動先またはコピー先のブックに挿入できません
http://www.officelabo.net/excel_qa/qa60.html
http://lifeworker.jp/excel/2013/06/11/4808.html
このため、クリップ・ボードを使ってコピーするバージョンを作ってみました。
いままでのVBAコードが動かないのはなぜ?
http://park.geocities.jp/tryvba/excel2007question.html
' wb.Sheets("Sheet1").Cells.Copy ThisWorkbook.Sheets("特定").Cells
ファイル名の英数を半角に変更(Excelと同じフォルダおよびサブフォルダの全てのファイル)
このマクロをダウンロードできます。ChangeFileNameToHalfWidthVBA01.xls