ワクワクV039回目FSO解説(2021-05-08)

1
ほえほえ@スプシマン @hoehoe1234

これは生徒さんに書いて頂いたクラス図の上に私がオブジェクトをたどるルートと、パスでのショートカットのルートを追加した図になります。 pic.twitter.com/VYzw3aR39c

2021-05-25 03:00:27
拡大
ほえほえ@スプシマン @hoehoe1234

TextStreamはフィアルを読み書きする穴(パイプ)なんですね。パイプ自体にはつながっている先を表す情報あありません。ただ1バイトずつ読み書きできるだけのモノです。穴を通じてもとのファイルそのものへの操作(copyとか)はできないんですね。 pic.twitter.com/V9zptNLvPJ

2021-05-25 03:05:56
拡大
ほえほえ@スプシマン @hoehoe1234

低レイア風にいうとread関数とwrite関数(そういうのがあるとして)をラップしたオブジェクトですね。とても残念なことにこのオブジェクト、エンコーディング対応してないんですね。エンコードにUTF-8を指定したい場合おおいのではないでしょうか?

2021-05-25 03:07:50
ほえほえ@スプシマン @hoehoe1234

組み込み関数、ステートメントの場合はバラバラですがFSOはまとまってるので慣れれば使い勝手がよさそうですね。まずはFSO+パスでコードを書いていくのがよいかと思います。 pic.twitter.com/eeoMzFufIB

2021-05-25 03:13:04
拡大
ほえほえ@スプシマン @hoehoe1234

これは以前にレイメさんと検証したことですね。Filesはコレクションとはいえ、実装上、性能上の問題からでしょうか、番号では個別のFileを取得できないんですね。このためすべてのFileオブジェクトを取得するにはfor each構文を使う必要があります。 pic.twitter.com/q23eEUl2Vk

2021-05-25 03:15:22
拡大
ほえほえ@スプシマン @hoehoe1234

こんなふうにしてすべてのファイルを取得できます。ファイル名によるフィルタリングは指定できないのでその必要があればコードで表現する必要があります。 pic.twitter.com/cVxQ4SGNKh

2021-05-25 03:16:57
拡大
ほえほえ@スプシマン @hoehoe1234

同じくフォルダ群を取得する場合にはSubFoldersメソッドを使用します。どうしてFilesのようにFoldersコレクションを直接使えないのでしょうか? pic.twitter.com/V5I3BLlEEO

2021-05-25 03:19:15
拡大
ほえほえ@スプシマン @hoehoe1234

このような記述もあるので、Foldersコレクション直接使えてもいいような気がしますが、これはコレクションという「見せかけ」でSubFoldersプロパティでラップしてそうみせているのでしょうか? pic.twitter.com/3OTQguHqst

2021-05-25 03:20:59
拡大
ほえほえ@スプシマン @hoehoe1234

Moveの場合は管理情報の書き換えですので移動先に同名のフィアル、フォルダがあるとエラーになります。デバイスまたがり時の挙動などはまだ試してませんがcopy操作におきかえられるのでしょうか? pic.twitter.com/9IYfSZpo8S

2021-05-25 03:23:24
拡大
ほえほえ@スプシマン @hoehoe1234

このあたりの挙動は「ためしてみる」で十分だとおもいますが、VBAでのファイルに関する挙動の多くは「区切り記号を最後につけることでフォルダとみなす」場合が多いことは覚えておくとよいでしょう。dir関数でも最後に"\"があるかどうかで挙動が変わりますね。 pic.twitter.com/kvG0cx4aZ0

2021-05-25 03:26:27
拡大
ほえほえ@スプシマン @hoehoe1234

これは古いunixシステムのcp関数のコードの一部です。ブロックで読んでブロックで書いているだけですね。ファイルのcopyというシステムコールはありません。 pic.twitter.com/2bilVQ3eTa

2021-05-25 03:28:22
拡大
ほえほえ@スプシマン @hoehoe1234

これも同様のmv関数のコードの一部です。管理情報の書き換えを行っていますね。失敗したら(違うデバイス?)/bin/cpを呼び出してコピーしています。昔のunixのコードはシンプルということが分かると思います。 pic.twitter.com/8Gz0eeK0zq

2021-05-25 03:30:53
拡大
ほえほえ@スプシマン @hoehoe1234

事前に参照設定しておくかどうかは悩みますね。プロジェクトの規約があるなどの事情がなければ、インテリが利用できますのでFSO、辞書あたりは事前バインディングでよいと思います。 pic.twitter.com/uiKiMvhuqx

2021-05-25 03:36:15
拡大
ほえほえ@スプシマン @hoehoe1234

連番で大量のファイルを作る場合もVBAを作ると便利ですね。いや、シェルのほうがブレース展開もあるし、簡単なのでは?という話もあるとはおもいますが。 pic.twitter.com/uT4v936hqR

2021-05-25 03:39:13
拡大
ほえほえ@スプシマン @hoehoe1234

これもFSO+パスによるショートカットですね。FSOが組み込み関数のまとめ役のように振る舞い、名前空間をつくっているのがいいですね。FSOを好んで使う人が多いわけですね。いや、組み込み関数も重要だとおもますけど。 pic.twitter.com/5QKNr8EHiJ

2021-05-25 03:41:23
拡大
ほえほえ@スプシマン @hoehoe1234

都度宣言する方法ですね。参考書、サイトなどにはすべてを見せるためにこのように関数内でcreateobjectしていますが実際は1つでよいため、staticでFSOインスタンスを保有する形で十分だと思います。 pic.twitter.com/kNWB21mTyD

2021-05-25 03:42:56
拡大
ほえほえ@スプシマン @hoehoe1234

すこし冗長な書き方をしていますが、FSOを遅延バインディングする場合は、このようなプロパティ関数を1つ作っておくとよいと思います。staticオブジェクトが1つで良いように思いますが、newもできるインタフェースにしています(滝Libから) pic.twitter.com/GPfMBSBz2A

2021-05-25 03:47:55
拡大
ほえほえ@スプシマン @hoehoe1234

ファイルの一覧をシートに書き出すコードも簡潔に書けますね。 pic.twitter.com/gIvjoveoyU

2021-05-25 03:49:02
拡大
ほえほえ@スプシマン @hoehoe1234

for each構文の解説をしました。for each構文では取り出す順番はコンテナ(取り出すコレクション)側がきめます。配列、コレクションと言われるものは通常最初の要素から取り出されます。先にみたFilesコレクションのように番号で取得できない場合もあります。 pic.twitter.com/e93A7fE3PI

2021-05-25 03:51:46
拡大
ほえほえ@スプシマン @hoehoe1234

このような形で講義をすすめています。最近の講義は録画でも公開していますのでご興味のある方は御覧ください。

2021-05-25 03:52:52
ほえほえ@スプシマン @hoehoe1234

転記もの、集計ものをつくるポイントをまとめます。 ①レンジのフルエントな使い方をマスターする(まとめ記事をUPしています)。 ②ファイルの操作が自由にできるようになる。FSOも組み込み関数も使えるようになる。 ③アプリ全体の構成を作れるようになる(モジュールへの分割)。

2021-05-25 03:54:11
ほえほえ@スプシマン @hoehoe1234

④デバックができるようになる(これには多くの知識概念、経験が必要なので時間がかかります)。 ⑤機能仕様書と全体概要図を書けるようになる(自分が作りたいアプリを言語化できる) ⑥最後まで作り切るという気力。 です。ご興味のある方はDMにてお問い合わせください。 おしまい。

2021-05-25 03:56:00
ほえほえ@スプシマン @hoehoe1234

追加1 このサイトでは、FSOと組み込み関数との機能対照表を掲載しており、とてもわかりやすかったのでご紹介します。 239-programing.com/excel-vba/fso/…

2021-05-25 04:00:08