4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AccessのVBAでFileSystemObjectを使ったよくあるファイル操作まとめ

Last updated at Posted at 2024-03-30

概要

「FileSystemObjectを使ったファイル操作ってどうやったっけ?」
ってよくなるので、この記事を見てさっと思い出せるように。

  • ファイルコピー。
  • ファイル移動。
  • ファイルリネーム。

などの基本操作とファイル上書きについてなど。

参照設定

Microsoft Scripting Runtime
image.png

コピー

ファイル名はそのままで別フォルダーへコピー

サンプル
'Accessファイルと同じフォルダー内の『りこりこ.txt』が対象。
Dim file_path_ As String
file_path_ = CurrentProject.Path & "\りこりこ.txt"


'Accessファイルと同じフォルダー内の『移動先』という名前のフォルダーがコピー先。
'フォルダーパスの末尾に『\』は必要なので注意。
Dim folder_path_ As String
folder_path_ = CurrentProject.Path & "\移動先\"


'CopyFileの第三引数 = 上書きを許可するかどうか。
'True なら、コピー先に同名ファイルあっても例外にならず上書きされます。
Dim fso_ As New Scripting.FileSystemObject
Call fso_.CopyFile(file_path_, folder_path_, True)

なぜフォルダーパスの末尾に\が必要なのか

前述のサンプルの場合、フォルダーパスの末尾に\が無いと

りこりこ.txtを 拡張子無しの『移動先』という名前のファイルリネーム

という動きになってしまいます。

\を付けることで 『拡張子無しファイルではなくフォルダーですよ』 と表現。

仮にフォルダーパスの末尾に\が無く、『移動先』フォルダーが存在していた場合、下記の例外になります。
image.png

  1. 移動先という名前のファイルを作ろうとする。
  2. でも移動先という名前のオブジェクトは存在している。
  3. そのオブジェクトはフォルダー。
  4. 上書きは許可しているがフォルダーをファイルに変えることはできないので例外。

のような感じ。

ファイル名を変えつつ別フォルダーへコピー

Dim before_ As String
before_ = CurrentProject.Path & "\りこりこ.txt"


Dim after_ As String
after_ = CurrentProject.Path & "\移動先\たきなちさと.txt"


Dim fso_ As New Scripting.FileSystemObject
Call fso_.CopyFile(before_, after_, True)

移動

ファイル名はそのままで別フォルダーへ移動

Dim file_path_ As String
file_path_ = CurrentProject.Path & "\りこりこ.txt"


Dim folder_path_ As String
folder_path_ = CurrentProject.Path & "\移動先\"


'CopyFileと違って『上書きをするかどうか』の引数は無いです。
'移動先に同名ファイルがあった場合は例外になります。
Dim fso_ As New Scripting.FileSystemObject
Call fso_.MoveFile(file_path_, folder_path_)

ファイル名はそのままで別フォルダーへ移動(同名ファイルあれば上書き版)

Dim file_path_ As String
file_path_ = CurrentProject.Path & "\りこりこ.txt"


Dim folder_path_ As String
folder_path_ = CurrentProject.Path & "\移動先\"


Dim fso_ As New Scripting.FileSystemObject

'同名ファイルがあったら上書きをする場合、
'ファイル存在チェック⇒存在していたら削除
'をかませる必要あり。
If fso_.FileExists(folder_path_ & fso_.GetFileName(file_path_)) Then
    Call fso_.DeleteFile(folder_path_ & fso_.GetFileName(file_path_))
End If

Call fso_.MoveFile(file_path_, folder_path_)

ファイル名を変えつつ別フォルダーへ移動

Dim before_ As String
before_ = CurrentProject.Path & "\りこりこ.txt"


Dim after_ As String
after_ = CurrentProject.Path & "\移動先\たきなちさと.txt"


Dim fso_ As New Scripting.FileSystemObject
Call fso_.MoveFile(before_, after_)

同名ファイル上書きまわりの挙動は『ファイル名はそのままで別フォルダーへ移動』とほぼ同様なので割愛です。

リネーム

ファイルの場所はそのままでファイル名を完全に変える

Dim file_path_ As String
file_path_ = CurrentProject.Path & "\りこりこ.txt"


Dim fso_ As New Scripting.FileSystemObject
fso_.GetFile(file_path_).Name = "たきなちさと.txt"

ファイルの場所はそのままでファイル名の頭に特定の文字列を付ける

Dim file_path_ As String
file_path_ = CurrentProject.Path & "\りこりこ.txt"


'『にゃーん_りこりこ.txt』という名前のファイルになります。
Dim fso_ As New Scripting.FileSystemObject
fso_.GetFile(file_path_).Name = "にゃーん_" & fso_.GetFile(file_path_).Name

ファイルの場所はそのままで拡張子の前に特定の文字列を付ける

Dim file_path_ As String
file_path_ = CurrentProject.Path & "\りこりこ.txt"


Dim fso_ As New Scripting.FileSystemObject

'GetBaseName()で拡張子無しのファイル名を取得。

'GetExtensionName()で拡張子を取得。
'ただし取得できる拡張子には『.』が付かないので注意。

Dim after_name_ As String
after_name_ = fso_.GetBaseName(file_path_) & "_にゃーん." & fso_.GetExtensionName(file_path_)

'『りこりこ_にゃーん.txt』という名前のファイルになります。
fso_.GetFile(file_path_).Name = after_name_

参考サイトさん

バージョン

Microsoft Windows [Version 10.0.19045.4239]
Microsoft Access for Microsoft 365 MSO (バージョン 2403 ビルド 16.0.17425.20138) 32 ビット

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?