忍者ブログ

VBAの文字コード問題 Dir関数を使わずにFileSystemObjectを使おう

2021年02月17日
今回も会社で作っているマクロについて。

【おさらい】
今作っているのは、別のエクセルファイルからデータを読み取って、CSVに出力するツール。

エクセルファイルの中の環境依存文字がCSV化したときに「?」になっちゃうので、
Shift-Jisではなく、UTF-8でCSV出力するってのが前回のお話。


文字コード問題はそれだけじゃなかった。。。ってのが今回の内容。


現状のツールは突貫で何も考えずに作ったせいで、
環境依存文字に対応していない関数を多用している。
  1. Dir関数でフォルダ内のファイル一覧取得やファイル存在チェック
  2. FileLen関数によるサイズチェック
  3. FileDateTime関数による更新日時チェック
これらはShift-Jisにしか対応していないので、ファイル名やフォルダ名に
環境依存文字が含まれるとエラーになってしまう。

ファイル名やフォルダ名を変えて実行すりゃー良いんだけど、
問い合わせをうけてもめんどくさいので、FileSystemObjectで書き直すことにした。

Application.GetSaveAsFilenameによる保存ダイアログ表示については、
ちょっと調べるも、VBAがShift-Jisにしか対応していないのでどうにもならず。

デフォルトファイル名に環境依存文字が含まれると、
何も入力していない状態で表示される。

VBAアプリのダイアログ表示なのでどう頑張っても環境依存文字は入力できず。
仕方ないので、ファイル名決め打ちの仕様に変更。


これまで趣味でやっている分だと、
FileSystemObjectは処理が遅いのでDir関数を好んで使っていたけど、
業務用ツール開発となるとDir関数は使えませんな。

フォルダ内のファイル一覧取得
【Dirベース】Office TANAKA - ファイルの操作[ファイルの一覧を取得する]
【FSOベース】Office TANAKA - FileSystemObject[フォルダ内に存在する全「.xlsx」ファイルのベース名を取得する]

Dir関数について
Dir(フォルダ名)とすると、フォルダ内の任意のファイル名を返す
次にDir()とするとたびに、フォルダ内の次のファイル名を返し、
全ファイル名を返した後にDir()とすると、空欄が返ってくる。

FileSystemObjectについて
オブジェクト変数を定義して、オブジェクトを宣言
Dim FSO As Object:Set FSO = CreateObject("Scripting.FileSystemObject")

ループ変数を定義してループ
dim f As Variant
For Each f In FSO.GetFolder(フォルダ名).Files
ファイル名=f.name
ファイルサイズ=f.size
更新日時=f.DateLastModified
Next f

使い終わったら開放を忘れずに
Set FSO = Nothing

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字