タグ: VBA

連続していないSelectionはVBAから取得できない

Wordは連続していない複数ができる

いくつか段落を作り、Ctrlキーを押しながら段落や文字を選択すると、複数の文字や段落を選択できる。このとき、文字や段落が連続していなくても良い。

VBAからアクセスできない

連続せず、飛び飛びに複数選択されているとVBAからはアクセスできない。そういう仕様。

VBAのカンレトディレクトリをUNCで

ドライブレターありきのChDrive/ChDir

VBAでカレントディレクトリ(今のWindowsなら「カンレトフォルダ」という言い方が正しい?)を変更するには、ChDriveとChDirします。

VBAの話なので、Wordに限らずExcelやAccess等でも同じはず。さらにはVB6でも同じだと思うけど知らない。

C:\yamada\takaoへ変更する例

ChDrive "C:"
ChDir "yamada\takao" 'C:\yamada\takaoでも構わない

まるでコマンドプロンプトです。いや、cdコマンドに/dオプションがあるだけcmd.exeの方が賢いかも。

UNCが使えない

サーバー上のいわゆる共有フォルダを扱う際に、UNC(\\ServerName\FolderName…のような表記)を利用することがよくあります。ところが、ChDrive / ChDirではUNCを扱えません。きっと、VSTOへの移行を促したいM$の(地味な)陰謀であります。

SetCurrentDirectoryを使えばUNCでOK

Windows APIであるSetCurrentDirectoryを使えばUNCが使えます。”\\ServerName\FolderName”をカレントディレクトリとする場合は以下のとおりです。

Declare Function SetCurrentDirectoryW Lib "kernel32" (ByVal lpPathName As Long) As Long

Public Sub TestCd()
    SetCurrentDirectoryW StrPtr("\\ServerName\FolderName")
    Debug.Print CurDir
End Sub

実行結果は、

\\ServerName\FolderName

となります。

SetCurrentDirectoryAではなくSetCurrentDirectoryWがおすすめ

あくまで個人的な印象に過ぎませんが、Windows Vista(MS-IME 2007)が出てからファイル名にUnicodeが使われることが多くなっています。SetCurrentDirectoryAではUnicodeが使えないので、SetCurrentDirectoryWが良さそうです。

宣言時にlpPathNameをLongにすること、呼ぶ時にStrPtrを介すことに気をつけてください。

ところで、Officeが64bitになったらAPIも64bitの方を呼ぶんだろうな。そうなるとポインタを渡すときはLongじゃダメってことか。64bit……Double型??

余談

もちろん、

SetCurrentDirectoryW StrPtr("C:\yamada\takao")

でもいけますが、

SetCurrentDirectoryW StrPtr("\\?\C:\yamada\takao")

でもいけたりします。