sironekotoroの日記

Perl で楽をしたい

Excel VBAスタンダード 公式テキスト 13章 ファイルの操作

13-1 テキストファイルの操作

テキストファイルを開く

  • Open ファイルのパス For 操作モード As ファイル番号
    • ファイルのパス:"C:\sample.txt"
    • 操作モード
      1. Append:ファイルに追記
        • 末尾に追加される
      2. Binary:ファイルをバイナリモードで開く
      3. Input:ファイルから読み込む
      4. Output:ファイルに書き込む
        • 新しいデータで上書きされる
      5. Random:ファイルをランダムアクセスモードで開く
    • ファイル番号
      • 任意の数字でよい。このファイル番号で指定した数値で区別する

テキストファイルを閉じる

  • Close ファイル番号
    • Workbooksを閉じるのではない事に注意
Sub Macro1()
'
' Macro1 Macro
'何も起きてないように見えるが、ファイルを開いて閉じている
Open "C:\Sample.txt" For Input As #1
Close #1
'
End Sub

テキストファイルから1行読み込む

  • Line Input As ファイル番号 , 変数
Sub Macro1()
'
' Macro1 Macro
'
Dim buf As String
Open "C:\Sample.txt" For Input As #1

    `EOF(ファイル番号) ファイルを最後まで読み込むとTrueになる
    Do Until EOF(1)
        Line Input #1, buf
        MsgBox buf
    Loop

Close #1
'
End Sub

ファイルに書き込む

  • Print ファイル番号 , データ
Sub Macro1()
'
' Macro1 Macro
'
Dim buf As String

`上書きのときは `Append`を`Output`に
Open "C:\Sample.txt" For Append As #1

    Print #1, "hello"

Close #1
'
End Sub

ファイルをすべて読み込む

  • Line Inputで1行ずつ読み込む方法
  • Get #ファイル番号, 読み込み開始位置 ,データを格納する変数名
    • Getステートメントを利用して一括書き込み
    • 読み込み開始位置を省略すると先頭から
  • Getステートメント使うときの制限
    • ファイルをBinaryモードで開く必要がある
    • データ格納用の変数のサイズと、ファイルのサイズを同一にしなくてはならない。
      • Filelen ファイル名:ファイルサイズを取得
      • Space 数値:スペース(空白文字)
Sub Macro1()
'
' Macro1 Macro
'
Dim tmp As String
tmp = Space(FileLen("C:\Sample.txt"))
Open "C:\Sample.txt" For Binary As #1
    Get #1, , tmp
Close #1

MsgBox tmp
'
End Sub

13-2 ファイルのコピーと移動

  • FileCopy コピー元ファイル , コピー先ファイル
    • 同名ファイルがあった場合、上書き時の確認メッセージは出ない
    • コピー先のファイル名を変更してもok
  • 移動は?
    • 移動のコマンドは無い
    • ファイル名を変更するコマンドの引数(変更後のファイル名)のパスを代えてしまえば移動と同じになる
    • Name 旧ファイル As 新ファイル
Name "C:\Sample.txt" As "C:\Sample2.txt"

13-3 ファイルの削除

  • Kill ファイル名
    • ゴミ箱に入りません。注意。
Kill "C:\Sample2.txt"

13-4 ファイルの存在確認

  • Dir ファイル名
If Dir("C:\Sample.txt ") = "" Then
    MsgBox "存在しません"
Else
    MsgBox "存在する!"
End If
Sub Macro1()
'
' Macro1 Macro
'
Dim buf As String

'ワイルドカード利用時のDirの挙動に注意
'最初にdirが呼ばれた時は、該当する要素の1つを返す
buf = Dir("C:\sample*.txt")

Do While buf <> ""
    MsgBox buf
    '引数を省略したとき時は、1回目で返していない要素を返す
    'ワイルドカードの要素がなくなると、空欄を返す
    buf = Dir()
Loop

'
End Sub

13-5 カレントフォルダ

  • CurDir:カレントフォルダを返す
  • ChDir パス:カレントフォルダの移動
  • ChDrive ドライブ名:カレントドライブの移動
    • ドライブをまたぐ移動はまず、カレントドライブを変更してからカレントフォルダの変更を行う
MsgBox "現在のカレントフォルダは" & CurDir
ChDrive "C"
ChDir "C:\Bak"
MsgBox "現在のカレントフォルダは" & CurDir

13-6 フォルダの操作

  • MkDir パス:フォルダをつくる
  • RmDir パス:フォルダを削除する
    • フォルダ内にファイルやフォルダが残っていると失敗する
MkDir "C:\SampleFolder"
MsgBox "フォルダを作成"
RmDir "C:\SampleFolder"
MsgBox "フォルダを削除"

お疲れさま

  • 残されたExcelVBAファイルをPerlスクリプトに書き換えようとして、VBAの何たる鴨知らないために始めたVBAの勉強もこれで一段落
  • 今後は自分のExcel VBAの改良に移りますわ

印象深かった

  • Perlの勉強と平行しながらだったんで、プログラミング言語でも違うところ、同じところあるんだなぁ、というのが素直な感想
  • 配列扱うときに、わざわざ配列の要素数を把握しておかなきゃいけないのは面倒だよなぁ、って思う(Perlの場合は特に意識した事ない)
    • ReDimとかLBoundとかUBoundとか
  • UserFormだけど、素の部品のままでも自分のセンスが悪い気がして悲しい
  • Perlでもそうだけど、もっと早く、もっと10年くらい前に知っていたら、お仕事とかすごい楽だっただろうなぁって。
    • ま、今勉強してるのも10年、その先に楽するためと思えば
  • 人をぶん殴れそうな「Excel VBA大辞典」とかって何がおさめられてんだろ

    • まぁ、まだまだ奥は深く、VBAの入り口にたっただけだよなぁとか思いまする。
  • オレはようやくのぼりはじめたばかりだからな このはてしなく遠いExcel VBA坂をよ