韜晦日記

韜晦日記

Rietveldよりもプログラミングメインになりつつある

Rietveld解析初心者による備忘録とつぶやき

VBAについて No.3

前に投稿した記事のマクロについて、書いていきます。
tanisukestr.hatenablog.com

どんな関数なのか

.insファイルを読み込み最後尾に新規作成したシートに書き込むものです。
このとき、シート名はファイルの名前にします。
プログラムの流れと文法を処理順に書いていきます。

ダイアログからファイルを指定

普段ソフトを使ってファイルを開こうとすると、写真の様な"ファイルを開く"というダイアログが表示されますよね。今回作成するマクロもこのダイアログでファイルを取得したいと思います。
f:id:tanisuke_str:20170827112618p:plain
そこで使うのが、ApplicationオブジェクトのGetOpenFilenameメソッドです。これを使うことで、"ファイルを開く"ダイアログを表示してくれて、選択したファイルのパスを返してくれます。構文はこんな感じです。


式.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

引数の1つめであるFileFilterは開くファイルの種類(拡張子)をフィルタリングしてくれます。
こんな感じに書きます。

OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
とか、私は.insファイルを選択したいので
OpenFileName = Application.GetOpenFilename("RIETAN ファイル,*.ins?")

上のように書くと、写真のようなダイアログボックスが現れると言うことです。

また、複数の拡張子を表示したいときは、セミコロンで区切ります。
FilterIndexFileFilterで規定したファイルフィルタ文字列の中で、何番目のフィルタを規定値とするか指定します。
なんか、よく分からないよね。
ButtonTextMacintoshでのみ使用できるものです。
MultiSelectはファイルを複数選択できるかどうか指定します。
実際に使うのってFileFilterMultiSelectかな?

使用者はこのダイアログを開いた後にキャンセルするかもしれないし、既に開いているファイルを指定するかもしれません。
その辺の対策もします。

  • キャンセルボタンを押したとき

キャンセルボタンが押された場合、本来ファイルのパスが格納されるはずだった、変数"OpenFileName"には"False"が入ります。ということでこれを利用して下の様に命令し処理を終了します。


If OpenFileName = "False" Then
MsgBox "キャンセルしました"
End

このとき、注意したいのはプログラムの終了処理をEndにするかExit Subにするかという問題です。両者は同じようですが、Exit SubはSubから抜けるだけで、プログラムが終了するわけではありません。Subを呼び出したプロシージャに戻るので呼び出した側の処理が継続されます。
一方で、Endはプログラムを終了させます。どちらか必要な方を選択します。

  • 同じファイルを開こうとしているとき

この場合は同じ名前のシートがないかで判断したいと思います。
流れとしては、book中にあるシート名を順番に取得し、それがファイル名と同じであればエラー表示する。
といったところです。
使うのはWorkSheetsコレクションです。WorkSheetsコレクションは、指定されたワークブック、アクティブなワークブックにある全てのSheetについてのコレクションです。コレクションはオブジェクトの集合体です。たぶん。


WorkSheets.add⇒シートの追加
WorkSheets.Count⇒シートの数を返す
WorkSheets.Name⇒シート名を返す

みたいな感じで、WorkSheetsに.プロパティ.メソッドでWorkSheetに命令を出します。
同じシート名がないか探索するには以下のように書きます。ここでは例として探索するシート名を"Sheet2"としています。

Dim i As Integer
Dim SheetName as String
SheetName = Sheet2
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = SheetName Then
            MsgBox SheetName & vbCrLf & "はすでに開いています", vbExclamation
            Exit Sub
        End If
    Next i

既にSheet2があれば、プログラムは終了、Sheet2がなければ続行します。


これ書くのに40分か。疲れたので今日はここまで。