ファイルリストを取得する方法として4つのパターンがある。
Dialogs(wdDialogFileOpen)
を使う。FileSearch
メソッドFindFirstFile
関数FileSearch
VBA メソッドを使用する方法と 2-2 の FindFirstFile
関数を使う方法がある。Dialogs(xlDialogFileOpen)
なのだが、ダイアログを表示するだけの Display
がなく Show
メソッドがあるがこれは実際にファイルを開いてしまうため、いったんファイルリストを取得しておいてあとからそれを元に実際のマクロ処理をしようとする用途には不向きだ。GetOpenFileName
という Windows API と同じ名前のメソッドが用意されている。
そもそも Word VBA から Windows API を駆使してまで複数ファイルを選択できるようにしなければならなくなったのは、ファイルを開くための Word の組み込みダイアログを表示させる Dialogs(wdDialogFileOpne)
メソッドで複数のファイル名を取得できなかったことと、Excel にはある GetOpenFileName
メソッドが Word VBA に用意されていなかったからだ。
VBA プログラミングに関する情報は Excel に関するものが圧倒的に多く、これを参考にして Word VBA に応用しようとするわけだが、上記 Dialogs( )
を例にとると...
Dialogs |
Word VBA | Excel VBA |
引数 | wdDialogFileOpen |
xlDialogFileOpen |
Show メソッド |
複数選択できるが、ファイルを開く時点でエラー発生。 | 複数選択して開くことができる。 |
Display メソッド |
複数選択できるが、ファイル名を取得する時点でエラー発生。 | Excel VBA には存在しない。 |
オープンダイアログのフィルタ設定 | Name プロパティに値をセットする。 例: Dialogs(wdDialogFileOpen).Name = "Hoge*.*" |
arg1 パラメータに値をセットする。 例: Dialogs(xlDialogOpen).Show Arg1:="Hoge*.*" |
ちなみに、他の組み込みダイアログでも同様で、Word VBA の場合は各々に具体的な名前が付いているのに対し、Excel では全てが arg1, arg2, ..., arg30
のような形式で同じ arg1
でもダイアログによって意味するところが違っており、なんでこんなことになってしまっているのか、非常に理解に苦しむ(--;)
このように、いずれかの VBA に精通しているからといって、その知識が別の VBA にそっくりそのまま通用すると過信すると、とんでもない泥沼にはまり込むことになるので気をつけよう! < 経験者は語る(^^;
ライブラリにある GetFileList.dot と GetFileList.xlt をぜひとも比較されたい。
Delphi の ExtraxctFileExt 関数の VBA 版。
関数に渡されたファイル名(文字列)を右側からスキャンして「.」にたどり着いたら、その位置から右端までを拡張子とする。
'************************************************************
' ファイル名から拡張子部分(.を含む)を取り出す
' 「.」が含まれないときは null を返す
'************************************************************
Public Function ExtractFileExt(FileName As String) As String
Dim i As Integer
Dim FileExt As String
i = 0
FileExt = ""
If InStr(FileName, ".") > 0 Then
Do
i = i + 1
FileExt = Mid(FileName, Len(FileName) - i)
Loop Until Left(FileExt, 1) = "."
ExtractFileExt = FileExt
Else
ExtractFileExt = ""
End If
End Function
Delphi の ExtraxctFileName 関数の VBA 版。
'************************************************************
' パス名からファイル名(拡張子含む)を取り出す
'************************************************************
Public Function ExtractFileName(PathName As String) As String
Dim i As Integer
Dim WrkString As String
Dim FileName As String
i = 0
FileName = ""
If InStr(PathName, "\") > 0 Then
Do
i = i + 1
WrkString = Mid(PathName, Len(PathName) - i)
Loop Until Left(WrkString, 1) = "\"
FileName = Mid(PathName, Len(PathName) - Len(WrkString) + 2)
ExtractFileName = FileName
Else
ExtractFileName = ""
End If
End Function
Delphi の ExtraxctPathName 関数の VBA 版。
'************************************************************
' ファイル名(パス名)からディレクトリ名(\を含む)部分を取り出す
'************************************************************
Public Function ExtractFilePath(FileName As String) As String
Dim i As Integer
Dim WrkString As String
Dim FilePath As String
i = 0
FilePath = ""
If InStr(FileName, "\") > 0 Then
Do
i = i + 1
WrkString = Mid(FileName, Len(FileName) - i)
Loop Until Left(WrkString, 1) = "\"
FilePath = Left(FileName, Len(FileName) - Len(WrkString) + 1)
ExtractFilePath = FilePath
Else
ExtractFilePath = ""
End If
End Function
'****************************************************************
' ファイルのベースネーム部分(一番右の「\」の次から
' 一番右の「.」の直前まで)を取り出す
'****************************************************************
Public Function ExtractFileBase(FileName As String) As String
Dim i As Integer
Dim WrkString As String
Dim FullName As String
Dim FileBaseName As String
'ディレクトリ部分を取り除く
i = 0
If InStr(FileName, "\") > 0 Then
Do
i = i + 1
WrkString = Mid(FileName, Len(FileName) - i)
Loop Until Left(WrkString, 1) = "\"
FullName = Mid(FileName, Len(FileName) - Len(WrkString) + 2)
Else
FullName = FileName
End If
'拡張子部分を取り除く
WrkString = ""
i = 0
If InStr(FullName, ".") > 0 Then
Do
i = i + 1
WrkString = Mid(FullName, Len(FullName) - i)
Loop Until Left(WrkString, 1) = "."
FileBaseName = Left(FullName, Len(FullName) - Len(WrkString))
Else
FileBaseName = FullName
End If
ExtractFileBase = FileBaseName
End Function
単語数
ActiveDocument.ComputeStatistics(Statistic:=wdStatisticWords, IncludeFootnotesAndEndnotes:=True)
スペースを含まない文字数
ActiveDocument.ComputeStatistics(Statistic:=wdStatisticCharacters, IncludeFootnotesAndEndnotes:=True)
スペース含む文字数
ActiveDocument.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces, IncludeFootnotesAndEndnotes:=True)
全角文字と半角カタカナの文字数
ActiveDocument.ComputeStatistics(Statistic:=wdStatisticFarEastCharacters, IncludeFootnotesAndEndnotes:=True)
段落数
ActiveDocument.ComputeStatistics(Statistic:=wdStatisticParagraphs, IncludeFootnotesAndEndnotes:=True)
行数
ActiveDocument.ComputeStatistics(Statistic:=wdStatisticLines, IncludeFootnotesAndEndnotes:=True)
ページ数
ActiveDocument.ComputeStatistics(Statistic:=wdStatisticPages, IncludeFootnotesAndEndnotes:=True)
半角英数の単語数
単語数 - 全角文字と半角カタカナの文字数
※この式からもわかるように、全角文字と半角カタカナは1文字で「1単語」と数えているようだ。
IncludeFootnotesAndEndnotes:=False
とすると脚注部分を含まない統計情報が得られる。
'Win32API ShellExecute()のための定数定義
Public Const SW_HIDE = 0
Public Const SW_NORMAL = 1
Public Const SW_MAXIMIZE = 3
Public Const SW_MINIMIZE = 6
'Win32API ShellExecute() により関連付けを利用する
Public Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
'Windows デフォルトのブラウザを起動する。
ShellExecute(hwnd, "open", "filename.html", vbNull, vbNull, SW_NORMAL)