• ベストアンサー

VBAとロングファイル名

EXCELのVBAで、「C:\My Documents」のようなロングファイル名を 「C:\Mydocu~1」のような昔のファイル形式にする方法を教えてください。 例えば ThisWorkbook.Pathで得たパス名がロングファイルだった場合です。 目的は、ある古い別アプリをShellで起動させたいのですが、それの 引数に昔のファイル形式で色々なパスを渡さないといけないのです。 (そのアプリがロングファイル名に対応していない) ヘルプとか見たんですけど分からないので教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#18951
noname#18951
回答No.1

GetShortPathNameというAPIを使用します。VBAではAPIを使用する前に定義を 書く必要があります。定義は次の通りです。 Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" ( _ ByVal LongPath As String, _ ByVal ShortPath As String, _ ByVal ShortPathSize As Long) As Long 以下はサンプルです。 Dim FileName As String * 512 GetShortPathName "Z:\My Document\audio.wav", ShortName, 512 MsgBox Left(FileName, InStr(FileName, vbNullChar) - 1)

sheeps
質問者

お礼

回答有難うございます。 残念ながら、まだ解決はしてませんのでお手すきの時に 補足を見ていただければ幸いです。

sheeps
質問者

補足

宣言からしますと、 Dim FileName As String * 512 Dim ShortName As String Dim lRet As Long lRet = GetShortPathName "Z:\My Document\audio.wav", ShortName, 512 で使い方合ってますか? lRet = 0 ShortName ="" で戻ってきちゃうんですよ。 MSのHPで検索してもC言語の「GetShortPathName」しかでないし 困ってしまってます。

その他の回答 (2)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 tnakさんの回答の間違いを。 多分単なるタイプミスだと思いますが、 GetShortPathName "Z:\My Document\audio.wav", ShortName, 512 を、以下のようにします。 GetShortPathName "Z:\My Document\audio.wav", FileName, 512 あと、第3引数の文字列長は、 Len(FileName) とした方がいいかも知れません。(変数宣言での文字列長の指定値を変えた時にいちいち変えなくても済みますから。) ちなみに、戻り値をつけるなら()がいると思います。 lRet = GetShortPathName ("Z:\My Document\audio.wav", ShortName, 512) 横から口を出してすみません。 では。

sheeps
質問者

お礼

お礼が遅れてすみません。 頂いた回答を元にコードをブラッシュアップさせていただきます。 ありがとうございました。

noname#18951
noname#18951
回答No.2

 えーと、このまま使っても実在するファイル名がなければ正しい答えを返し てくれません。GetShortPathNameでは結果的にディスクに記録された8+3 形式のファイル名を吐き出してくれるだけですから実在しないと何も返しませ ん。 "Z:\My Document\audio.wav" を実在するファイル名に変えてください。

sheeps
質問者

お礼

お礼が遅れてすみません。 最初の回答をヒントに、なんとか解決できました。 有難うございました。

関連するQ&A