アットウィキロゴ

テキストの読み込みと操作

テキストの読み込みと操作


とりあえず参考サイト



どのようにテキストを読み込むか。

テキスト操作に関してはさほど問題ではなかった、すなわちFileSystemObject(FSO)を利用する方法が定石らしく、どこを調べてもすぐに見つけることができたからだ。
しかし、ユーザーに任意のファイルを指定させる方法となると、Office製品間の"差異"に阻まれる事となった。
Windowsユーザーであれば、何らかのファイルを操作するにあたり、その実体を直接ダブルクリックするとか、既に起動したソフトのメニューから『ファイルを開く』ダイアログを使用して操作対象ファイルを指定して実行するなどして、目的のファイルを指定するわけだが、今回は操作対象ファイルをVisioで操作するという事があらかじめ決まっているので、後者を採用する事は必然となる。

ここでExcelであればメソッドとして".GetOpenFilename"というものが用意されており、これを使うだけで簡単に『ファイルを開く』ダイアログを表示して、ユーザーが選択した任意のファイル名(ファイルのフルパス)を取得することができる。

ところがVisioにはこれが存在しない。※ちなみにAccessにも存在しないらしい。他は知らん。
Visioファイル(.vsd)を開くための『ファイルを開く』ダイアログは存在するようだが、私の最終目的はテキストフォーマットからVisio図面を起こす事なので、テキストが開けなければ意味がない。

ではどのように『ファイルを開く』ダイアログからファイルパスを取得するかを考えた時、そのソリューションはVisioの枠を超える事を私に要求してきたのである。
どうやら面倒な領域に足を突っ込んだらしい。


comdlg32.dllのAPIを利用する方法(?)

何を言っているのかさっぱりわからない。
とりあえず下の方にそれが実現できるコードを転載しておく(インデント、改行部分のみ加筆)。
これは『とりあえず参考サイト』で紹介した、教えて!Ziddyちゃん - VisioのVBAでユーザにファイルを選択させる方法から転載したコードである。
回答者曰く、Visioに最適化したものと断っているので参考にするにはもってこいだろう。
しかし、質問者も回答者もレベルが高すぎて、見ただけでは何をやってるのかさっぱりわからない。
これを理解するのがこのページでの主題となるだろう。面倒くさいなぁもぅ。

Option Explicit

Private Declare Function GetOpenFileName _
   Lib "comdlg32.dll" _
   Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
   lStructSize As Long
   hwndOwner As Long
   hInstance As Long
   lpstrFilter As String
   lpstrCustomFilter As String
   nMaxCustFilter As Long
   nFilterIndex As Long
   lpstrFile As String
   nMaxFile As Long
   lpstrFileTitle As String
   nMaxFileTitle As Long
   lpstrInitialDir As String
   lpstrTitle As String
   flags As Long
   nFileOffset As Integer
   nFileExtension As Integer
   lpstrDefExt As String
   lCustData As Long
   lpfnHook As Long
   lpTemplateName As String
End Type

Private Const OFN_ALLOWMULTISELECT = &H200

Private Sub CommandButton1_Click()
   Dim Fkouzou As OPENFILENAME
   Dim lngRet As Long, NULLPos As Long
   Dim FileName As String

   With Fkouzou
       .flags = OFN_ALLOWMULTISELECT
       .lStructSize = Len(Fkouzou)
       .lpstrInitialDir = ThisDocument.Path
       .lpstrFilter = "GIF(*.gif)" & vbNullChar & "*.gif"
       .nMaxFile = 256
       .lpstrFile = String(256, vbNullChar)

   End With

   lngRet = GetOpenFileName(Fkouzou)

   If lngRet = 0 Then 、
       MsgBox (vbNullString)
   Else
       MsgBox (Left(Fkouzou.lpstrFile, InStr(Fkouzou.lpstrFile, Chr(0)) - 1))
   End If

End Sub


では以下のセクションから一個ずつ分解していく事にする。


変数宣言を強制する

まずは以下の1行からだ。
Option Explicit

この行はプログラミングをしている開発者に変数の宣言を強制する事を求めるステートメントです。
VBAでは変数の宣言無しでプログラムが動作してしまう。
要するに以下のような感じでも動くという事。
Sub Macro8()

    hensu = "test"
    MsgBox hensu

End Sub

ところがこの"Option Explicit"を付加すると、以下のようにちゃんと変数を宣言しないと正常に動作しなくなる。

Sub Macro8()

    Dim hensu As String

    hensu = "test"
    MsgBox hensu

End Sub
最終更新:2013年06月07日 15:10