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

#VBA単体でファイルやフォルダを操作する命令(StateMent)は大体VBA.FileSystem.Class
どういう命令や関数が含まれているのかというと、

[ChDir](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/chdir-statement)
[ChDrive](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/chdrive-statement)
*[CurDir](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/curdir-function)*
CurDir$
*[Dir](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dir-function)*
*[EOF](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/eof-function)*
*[FileAttr](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/fileattr-function)*
[FileCopy](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/filecopy-statement)
*[FileDateTime](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/filedatetime-function)*
*[FileLen](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/filelen-function)*
*[FreeFile](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/freefile-function)*
[GetAttr](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/chdrive-statement)
[Kill](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/kill-statement)
*[Loc](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/loc-function)*
*[LOF](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/lof-function)*
[MkDir](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/mkdir-statement)
[Reset](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/reset-statement)
[RmDir](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/rmdir-statement)
[Seek](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/seek-statement)
[SetAttr](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/setattr-statement)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/2532012b-6723-0f87-f384-ad1d72a259cf.png)


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

```vb
VBA.FileSystem.Kill
```

関数であるDirも

```vb
VBA.FileSystem.Dir
```

バッチファイルとの区別はばっちりである。
また、関数とクラスを意識すると
[Dirコマンド](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/dir)
とは別だとわかる。

# ついでにEnviron
VBA.Interaction Classに所属

```vb
VBA.Interaction.Environ
```

このほかには

CreateObject
MsgBox

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

#ところがNameだけは行方不明
実はファイル操作に関するステートメントのなかで、上のクラスのいずれにも所属していないものが一つある。
それは、ファイル操作関連の命令としてのNameステートメントである。
 [Docs Office VBA リファレンス 言語リファレンス リファレンス 財務諸表 Name](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/name-statement)

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

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

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

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

```vb
VBA.FileSystem.FileCopy
```

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

```vb
VBA.FileSystem.Name
```

と書きたいところだ。
しかしこれは上記のリストにないのでできない。しかも検索方法がわからない。どうやっても別のコンテンツが引っかかってしまう。
つまり、現時点ではあいまいさを回避することができない。
このため、ファイル/フォルダのリネーム（ファイル/フォルダ名の変更）及び移動は、FilesystemObjectを使う方がよい。
[VBA ファイル名の取得または変更する TipsFound](https://www.tipsfound.com/vba/18011)
[VBA フォルダ名の取得または変更する TipsFound](https://www.tipsfound.com/vba/18023)
[ファイルの移動、ファイル名の変更、ファイルの削除 Excelでお仕事！](https://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_100.html)

#Visual Basic本家
[ Docs .NET .NET API ブラウザー Microsoft.VisualBasic FileSystem](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.filesystem?view=net-5.0)

##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](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.fileio.filesystem?view=net-5.0)」を参照してください。

```c#
[Microsoft.VisualBasic.CompilerServices.StandardModule]
public sealed class FileSystem
```

Inheritance (継承) Object FileSystem
Attributes  StandardModuleAttribute

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

[ Docs .NET .NET API ブラウザー Microsoft.VisualBasic.FileIO FileSystem](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.fileio.filesystem?view=net-5.0)
###定義
名前空間: Microsoft.VisualBasic.FileIO 
アセンブリ: Microsoft.VisualBasic.Core.dll

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

```c#
public class FileSystem
```

継承 Object FileSystem

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

[VBAでファイルの操作 - OfficeTanaka](http://officetanaka.net/excel/vba/tips/tips91.htm)
>CurDir関数は、引数driveで指定したドライブのカレントフォルダを返します。引数driveを省略すると、カレントドライブのカレントフォルダを返します。関数名がCurDirと"ディレクトリ"になっているのは、MS-DOS時代に使っていた呼称のなごりでしょう。

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

[Visual Basic 中学校 掲示板 投稿内容 File IO](http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=18655)
投稿者 魔界の仮面弁士   (社会人)   投稿日時 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](https://thom.hateblo.jp/entry/2019/01/05/135614)
ここはVBA.FileSystem Classから持ってきている。このため、Nameは存在しない。