VBのDir関数でファイルの一覧を得る myDir関数

VBのDir関数は、初めにワイルドカード*や?どちらも半角文字。 ワイルドカード*は、何の文字で何文字でもいいという意味。?は任意の一文字)を使ってファイルを検索し、続いて引数無しでDir関数を実行して、他に該当するファイルやフォルダ(ディレクトリ)がある場合は、その名前を返す。以下は、ドキュメントフォルダにa.xlsmとb.xlsmのファイルがあること前提にしている。

以下はイミディエイトウィンドウに入力している。

?vba.Curdir                       'カレントフォルダの確認
c:\users\take\documents       'takeはログインユーザ名
?vba.Dir("*.xls*")             'カレントフォルダにExcelのファイルがあるか
a.xlsm
?dir    '2回目のDir関数に引数が無い場合は、前のワイルドで検索を続ける
b.xlsm
?dir
       '””が返るともう見つからないという意味
vba.FileCopy  "c.xlsm","x.xlsm"     'コピーしてx.xlsmにする。
?dir("x.xlsm")           'ファイルがコピーされているか確認
x.xlsm
vba.Kill "x.xlsm"  'ワイルドカード禁止。ごみ箱には入らない
?dir("x.xlsm")
                            :削除済み

次のコードは標準モジュールに書く。ファイルの一覧を文字列で出力する関数。フルパスのファイル名を改行(vbCrLf)コードで挟んで文字列を返す関数。

'パスとファイル(ワイルドカード)を渡して一覧を改行コード区切りで文字列を返す
Function myDir(path As String, file As String) As String
    Dim s As String
    If VBA.Right(path, 1) <> "\" Then path = path & "\" '¥マークが最後に付いてない場合は¥を付ける
    s = VBA.Dir(path & file)
    Do Until "" = s '空白文字はもう該当のファイルが無いという意味
        If "" = myDir Then       '最初か
            myDir = path & s
        Else
            myDir = myDir & VBA.vbCrLf & path & s    'vbCrLfは改行の定数
        End If
        s = VBA.Dir()
    Loop
End Function
'?mydir(curdir,"*.xls*")

実行すると、拡張子がxlsを含むファイルを検索し、検索結果の文字列を改行コードで挟んで(区切り文字)にして表示する。

以下は、イミディエイトウィンドウ。

?mydir(vba.Curdir,"*.xls*")
C:\Users\take\Documents\a.xlsm
C:\Users\take\Documents\b.xlsm

プログラムで使う場合はar=Split(myDir(??,??),vbCrLf)で配列arに入れて処理する。

カテゴリー: 13 ファイル処理、メモ帳とのデータ処理 | コメントする

カレントフォルダを知る  Shell関数

カレンドとは今選んでいるっていう意味。カレントフォルダ/カレントディレクトリとは今いるフォルダ/ディレクトリのこと。

Excelは2つのカレントフォルダがある。

  1. VBAのカレントフォルダ
  2. Excelのカレントフォルダ。ファイルを保存するまでカレントフォルダは無い。

各カレントフォルダの確認は、イミディエイトウィンドウなら以下でできる。

?vba.Curdir
?excel.ThisWorkbook.FullName

Excelオブジェクトの方は、保存したらカレントフォルダが決まる。それまでは、ファイル名だけ。

ついでに、VBA.Shellでエクスプローラー/explorerを起動するとビジュアル的にわかりやすいかな?

カテゴリー: 13 ファイル処理、メモ帳とのデータ処理 | コメントする

VBA.FileSystemオブジェクトのメンバー

VBAのライブラリのFileSystemモジュール(Module、VBEの標準モジュールに相当)に定義されている。

FileSystemのアイコンはModuleモジュール

Moduleアイコンのメンバーは、Classのようにプロパティは無い。Moduleのメンバーは、SubかFunctionプロシージャで定義されている。入力時に?やカッコが必要かどうかは、入力時の引数のヒントから判断できる。Funcitonプロシージャは、戻り値の型があるので()と戻り値を出力するために?も入力する。

メンバーは大きく分けると以下のようになる。
ファイル操作
Dir,FileCopy,FileDateTime,FileLen,Kill,Name
フォルダ(ディレクトリ)操作
Dir,CurDir,ChDir,ChDrive,MkDir,RmDir,Name

名前の変更と移動は、Nameステートメントが使える。Nameは、Dimなどと同じステートメントなのでオブジェクトブラウザでは見つからない。つまり、VBA. FileSystemのメンバーでは無い。

「Name 名前変更前 As 名前変更後」とAsを使う。FileCopy関数のように「,」カンマ区切りでは無い。

カテゴリー: 13 ファイル処理、メモ帳とのデータ処理 | コメントする

編集のコメントブロックとインデント

コメント行は、手で入力するなら「’」シングルクオートを文字列の先頭に入れると以降はコメントとして扱われる。コメントブロック(コメントアウト)は、コメント入力以外に以下の目的にも使う。

  1. 実行の対象から外す。参考のコード貼り付けや、エラー行を実行させない一時しのぎ
  2. コードの説明。処理内容、引数、実行例のコード

複数行のコメントは、次図のようにアイコンを使うと簡単。

「編集」のツールバーは便利ですよ!

イミディエイト内でもコメントの記号「’」は使える。以下はイミディエイトウィンドウで入力する。

'先頭に「'」があるのでここでEnterキーを押しても実行しない。
?vba.MsgBox("",vbAbortRetryIgnore) 'vbAbortRetryIgnoreは中止、再試行、無視の3つのボタン。
'ボタンを押すと、ボタンの左から3,4,5の値をMsgBox関数が返す。  

実行するのは?から始まる行だけです。他は行頭に「’」が入るのでコメントとして扱われる。MsgBox関数を実行する行も行の後半はコメントがあるが問題なくjMsgBox関数は実行する。

カテゴリー: 1 「開発」タブとVBE | コメントする

ワークシート関数とVBA関数

初めて使うのはワークシート関数で、マクロを勉強すると使うのがVBA関数。

  1. セルの中で使う関数:ワークシート関数、Sum関数が代表
  2. プログラムで使う関数:VBA関数。モジュール内のコードで使う。

Left関数なんかはワークシート関数でもVBA関数でもあるので、はじめてVBのコードを書く時に混乱した覚えがある。SUM関数は、セルの中で使う関数だがコードで利用することができる。使う時は、 WorksheetFunction のオブジェクトを前に付ける必要がある。WorksheetFunction.Sum(1,3)のように使える。 入力する時は、excelから入力するとWorksheetFunctionを全部入力する必要が無い。excel.WorksheetFunction.Sum(1,3)。

モジュールにコードを書く時は、excelはたは、vbaから入力すると「.」ドットを入力した時点で候補が出るので楽です。

カテゴリー: 2 VBEを使うための基本操作と知識 | コメントする