テキストの読み込みと操作
とりあえず参考サイト
どのようにテキストを読み込むか。
テキスト操作に関してはさほど問題ではなかった、すなわち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