VBA プログラミング 覚え書き

Last Update 2002.02.10

目次

  1. ファイルリストを取得する方法
  2. 似て非なる...
  3. ファイル名から拡張子部分を取り出す
  4. フルパス名からファイル名(拡張子含む)部分を取り出す
  5. フルパス名からディレクトリ部分を取り出す
  6. フルパス名からファイルのベースネーム部分を取り出す
  7. Word の「ツール|文字カウント」で表示される内容と同様の、アクティブな文書に関する統計情報を取得する
  8. Windows API を使って指定したファイルを、そのファイルタイプ ( 拡張子 ) に関連づけされたアプリケーションで開く

ファイルリストを取得する方法

ファイルリストを取得する方法として4つのパターンがある。

このページの先頭へ


似て非なる...

そもそも 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.dotGetFileList.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
このページの先頭へ


Word の「ツール|文字カウント」で表示される内容と同様の、アクティブな文書に関する統計情報を取得する。


  単語数
  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とすると脚注部分を含まない統計情報が得られる。
このページの先頭へ


Windows API を使って指定したファイルを、そのファイルタイプ ( 拡張子 ) に関連づけされたアプリケーションで開く

    '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)

このページの先頭へ