VBAについて No.3
前に投稿した記事のマクロについて、書いていきます。
tanisukestr.hatenablog.com
どんな関数なのか
.insファイルを読み込み最後尾に新規作成したシートに書き込むものです。
このとき、シート名はファイルの名前にします。
プログラムの流れと文法を処理順に書いていきます。
ダイアログからファイルを指定
普段ソフトを使ってファイルを開こうとすると、写真の様な"ファイルを開く"というダイアログが表示されますよね。今回作成するマクロもこのダイアログでファイルを取得したいと思います。
そこで使うのが、ApplicationオブジェクトのGetOpenFilenameメソッドです。これを使うことで、"ファイルを開く"ダイアログを表示してくれて、選択したファイルのパスを返してくれます。構文はこんな感じです。
式.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
こんな感じに書きます。
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
とか、私は.insファイルを選択したいので
OpenFileName = Application.GetOpenFilename("RIETAN ファイル,*.ins?")
また、複数の拡張子を表示したいときは、セミコロンで区切ります。
FilterIndexはFileFilterで規定したファイルフィルタ文字列の中で、何番目のフィルタを規定値とするか指定します。
なんか、よく分からないよね。
ButtonTextはMacintoshでのみ使用できるものです。
MultiSelectはファイルを複数選択できるかどうか指定します。
実際に使うのってFileFilterとMultiSelectかな?
使用者はこのダイアログを開いた後にキャンセルするかもしれないし、既に開いているファイルを指定するかもしれません。
その辺の対策もします。
- キャンセルボタンを押したとき
キャンセルボタンが押された場合、本来ファイルのパスが格納されるはずだった、変数"OpenFileName"には"False"が入ります。ということでこれを利用して下の様に命令し処理を終了します。
If OpenFileName = "False" Then
MsgBox "キャンセルしました"
End
一方で、Endはプログラムを終了させます。どちらか必要な方を選択します。
- 同じファイルを開こうとしているとき
この場合は同じ名前のシートがないかで判断したいと思います。
流れとしては、book中にあるシート名を順番に取得し、それがファイル名と同じであればエラー表示する。
といったところです。
使うのはWorkSheetsコレクションです。WorkSheetsコレクションは、指定されたワークブック、アクティブなワークブックにある全てのSheetについてのコレクションです。コレクションはオブジェクトの集合体です。たぶん。
WorkSheets.add⇒シートの追加
WorkSheets.Count⇒シートの数を返す
WorkSheets.Name⇒シート名を返す
同じシート名がないか探索するには以下のように書きます。ここでは例として探索するシート名を"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分か。疲れたので今日はここまで。