2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

今日のトリビア VBAのFileCopy等はVBA.FileSystem.Classに属しているがNameだけは属していない

Last updated at Posted at 2021-11-10

VBA単体でファイルやフォルダを操作する命令(StateMent)は大体VBA.FileSystem.Class

どういう命令や関数が含まれているのかというと、

ChDir
ChDrive
CurDir
CurDir$
Dir
EOF
FileAttr
FileCopy
FileDateTime
FileLen
FreeFile
GetAttr
Kill
Loc
LOF
MkDir
Reset
RmDir
Seek
SetAttr

斜体になっているものが関数

ChDirあたりを財務諸表とマイクロソフトは翻訳しているが、

image.png

Statementのことである。
とりあえずこんな書き方が可能。

VBA.FileSystem.Kill

関数であるDirも

VBA.FileSystem.Dir

バッチファイルとの区別はばっちりである。
また、関数とクラスを意識すると
Dirコマンド
とは別だとわかる。

ついでにEnviron

VBA.Interaction Classに所属

VBA.Interaction.Environ

このほかには

CreateObject
MsgBox

など今まで一度は聞いたことがある曲者ぞろい

ところがNameだけは行方不明

実はファイル操作に関するステートメントのなかで、上のクラスのいずれにも所属していないものが一つある。
それは、ファイル操作関連の命令としてのNameステートメントである。
Docs Office VBA リファレンス 言語リファレンス リファレンス 財務諸表 Name

これはExcel.Applicaion.Nameオブジェクトではない。
そもそもExcel.Application.Name自体が知っている人が少ないかもしれない。それよりもっと少ないと思う。たいていの場合、FilesystemObjectを使う方が検索もしやすく、サンプルも多いためである。
Nameステートメントは、ファイルの移動、名前の変更、フォルダの移動、フォルダ名の変更を行う。
というわけで、フォルダー、ファイルの操作を行うので明らかにExcelの枠ではない。
もとより、公式の解説が言語リファレンスに存在していることがわかる。
ところがオブジェクトエクスプローラーではOfficeでもVBAでもNameが見つからない。
ご存じの通り、Nameといえばプロパティは星の数ほどはないが、きわめて多い。
この命令が知られていないのも、そもそも検索することができないからではないか。

あいまいさを回避するために必要

一般的に、こういうあいまさが発生する場合には、上のように、上位から書いて区別するとわかりやすい。
東京都新宿区なんとか町のような形になるためである。
実際、Dimステートメントでも参照設定(事前バインディング)を行った場合修飾子(qualifier)として使うことで、あいまいさを回避して異なるオブジェクトを宣言できる。
ExcelのRangeは有名だが、WordでもRangeは使う。このため、参照設定をしているとこうした書き方が可能となる。

Dim wRng As Word.Range
Dim xRng As Excel.Range

ステートメントも同様に書くとわかりやすい。
FileCopyも

VBA.FileSystem.FileCopy

とする方がわかりやすい。
ただ、なくてもいいので、省略される。
そうだとすれば、Nameも他と区別するために

VBA.FileSystem.Name

と書きたいところだ。
しかしこれは上記のリストにないのでできない。しかも検索方法がわからない。どうやっても別のコンテンツが引っかかってしまう。
つまり、現時点ではあいまいさを回避することができない。
このため、ファイル/フォルダのリネーム(ファイル/フォルダ名の変更)及び移動は、FilesystemObjectを使う方がよい。
VBA ファイル名の取得または変更する TipsFound
VBA フォルダ名の取得または変更する TipsFound
ファイルの移動、ファイル名の変更、ファイルの削除 Excelでお仕事!

Visual Basic本家

Docs .NET .NET API ブラウザー Microsoft.VisualBasic FileSystem

FileSystem Class

Definition

Namespace:Microsoft.VisualBasic
Assembly:Microsoft.VisualBasic.Core.dll

The FileSystem module contains the procedures that are used to perform file, directory or folder, and system operations. The My feature gives you better productivity and performance in file I/O operations than using the FileSystem module. For more information, see FileSystem.

FileSystem モジュールに含まれるプロシージャを使って、ファイル、ディレクトリ、またはフォルダー、およびシステムの操作を実行します。 My 機能を使用するほうが、FileSystem モジュールを使用した場合よりファイル I/O 操作の生産性およびパフォーマンスが向上します。 詳細については、「FileSystem」を参照してください。

[Microsoft.VisualBasic.CompilerServices.StandardModule]
public sealed class FileSystem

Inheritance (継承) Object FileSystem
Attributes StandardModuleAttribute

ここにやはりName以外の命令や関数が固まっている。
しかしVBAとは関係ないが、MSはこちらを推奨している。

Docs .NET .NET API ブラウザー Microsoft.VisualBasic.FileIO FileSystem

定義

名前空間: Microsoft.VisualBasic.FileIO
アセンブリ: Microsoft.VisualBasic.Core.dll

ドライブ、ファイル、ディレクトリを操作するためのプロパティとメソッドを提供します。

public class FileSystem

継承 Object FileSystem

マイクロソフトが推奨しているのに加えて、こちらの解説には「ドライブ」という表現が現れる。

VBAでファイルの操作 - OfficeTanaka

CurDir関数は、引数driveで指定したドライブのカレントフォルダを返します。引数driveを省略すると、カレントドライブのカレントフォルダを返します。関数名がCurDirと"ディレクトリ"になっているのは、MS-DOS時代に使っていた呼称のなごりでしょう。

VBAの方が古いということがわかる。

Visual Basic 中学校 掲示板 投稿内容 File IO
投稿者 魔界の仮面弁士 (社会人) 投稿日時 2014/9/11 10:05:34
(中略)

VB.NET 2002~2003 あたりまでの変革期であればいざ知らず、.NET が登場して
十数年が経ち、VB6 からのコード変換ウィザードさえも廃止され今となっては、
当時の書き方に縛られ続けている必要は無いと思います。
(まぁ、VBA7.1 などにおいては、未だに Line Input # 等も現役なのですが…)
http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.fileio.filesystem.aspx
編注:現在は下記リンク
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.fileio.filesystem?redirectedfrom=MSDN&view=net-5.0
上記でも触れられていますが、基本的には「System.IO 名前空間」のクラスか、
「My.Computer.FileSystem オブジェクト」を使って、同じような機能を実装できます。
(C# と VB の両方を扱う人だと、VB 固有表現である「My」の利用も嫌う傾向にあるようですが)

そして少なくとも Microsoft としては、従来の記法からの切替を薦めています。
推奨された記法を学ぶことなく、古い記法だけで開発していこうと考えて
いるのであれば、将来性という面やメンテナンス性といった面からも、
あまり望ましく無いと言えるでしょう。

ただし、新旧両方の使い方を理解した上で、それでもあえて古典的な記法の方に
メリットがあると判断して使うのならば、特に問題は無いと思います。
FileOpen ならではの機能(構造体の一括読み書きなど)が必要な場合や、
旧 VB 時代の過去資産を活かす目的があるのならば、System.IO.Stream などによる
記述ではなく、従来の手法で開発した方が楽な場合もあるでしょうからね。
http://msdn.microsoft.com/ja-jp/library/aa711203.aspx
編注:現在は下記リンク、やはりNameは入っていない
Visual Basic .NET のファイル I/O オプションの中から選択する
https://docs.microsoft.com/ja-jp/previous-versions//aa711203(v=vs.85)?redirectedfrom=MSDN

ですがそれは新旧両方を知った上でないと判断できません。
両方を学ぶ余裕が無いのなら、推奨された方式に比重を置いて学ぶべきかと

たとえば、.NET のクラス群の幾つかは、ファイルデータを読み込むために、
「System.IO.Stream を継承したクラス」を受け取るものが少なからず存在しています。
(後略)

しかし、この2つにもやはりNameは含まれていない。

FileSystem クラスだけを意識するとNameは確実におちる。
VBA Dir関数とFileSystemObjectの比較 - tom's Diary
ここはVBA.FileSystem Classから持ってきている。このため、Nameは存在しない。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?