• ベストアンサー

ACCESSからEXCEL起動時、パス名は短い名前でないといけないの?

ACCESS2003からEXCEL2003をVBAで起動するコードを書いてます。 SetApplName = "c:\Program Files\Microsoft Office\office11\excel.exe /r c:\docume~1\alluse~1\docume~1\毎日の数字.xls" Call Shell(SetApplName, 1) のように指定していますが、いちいち短い名前を指定しないと いけないようで、面倒で困っています。 長いパス名を短いパス名に変換するような関数等はありませんか? 他にもっと簡便な方法があればあわせてご教示ください。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

こんにちは。KenKen_SP です。 Shell に渡すパスに空白があるとそこでコマンド区切りとして解釈され、誤動 作します。8.3 形式のショートパスを使う理由はそこにあるのですが、空白を 含むロングパスであってもパスを ”” で括れば OK です。 もちろん、ロングパスとショートパスの相互変換は API を使えば可能ですが... Shell で Excel を起動する理由は? ご提示のコードだと、Excel のバージョンやインストールパスなどが変われば 動かないコードになってしまいますよ? 例えば、  Excel2002  C:\Program Files\Microsoft Office\Office10\Excel.exe  Excel2003  C:\Program Files\Microsoft Office\Office11\Excel.exe のように、標準インストールでもバージョンでフォルダ名が違うし、D:\ などの 別ドライブにインストールされる可能性もあるので、レジストリから Excel.exe のパスを調べるハメになりますね。 Access + Excel の連携なら CreateObject か GetObject が一般的に使われる 方法だと思います。単に読み取り専用で開きたいだけなら、下記のようなコード になります。 Sub Sample()   Dim xlApp As Object ' Excel.Application   Dim Wb  As Object ' Excel.Workbook      Set xlApp = CreateObject("Excel.Application")   With xlApp     ' 可視化     .Visible = True     ' ブックを読み取り専用で開く     Set Wb = .Workbooks.Open( _         FileName:="C:\Sample.xls", _         ReadOnly:=True)     ' 処理     ' イミディエイトウインドウにブック名を表示してみる     Debug.Print Wb.Name   End With      ' ※1 Excel を開いたままプロシージャを終了する場合   Set Wb = Nothing   Set xlApp = Nothing      ' ※2 ブックを閉じ Excel も終了させる場合   ' オブジェクト変数の開放をちゃんとしないと Excel を   ' xlApp.Quit で終了させても プロセス が残ってしまう   'Wb.Close   'Set Wb = Nothing   'xlApp.Quit   'Set xlApp = Nothing End Sub

nozomi300k
質問者

お礼

とても参考になりました。ありがとうございました。 無事できました。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • yarazu
  • ベストアンサー率36% (4/11)
回答No.6

No.1です。APIの宣言が必要です。 Public Declare Function GetShortPathName Lib "kernel32" _ Alias "GetShortPathNameA" _ (ByVal lpszLongPath As String, _ ByVal lpszShortPath As String, _ ByVal cchBuffer As Long) As Long

nozomi300k
質問者

お礼

ありがとうございました。 この方法も簡単そうなので、また使ってみたいと思います。

すると、全ての回答が全文表示されます。
  • ese_ee
  • ベストアンサー率48% (68/139)
回答No.4

どちらかというと、 いちいち短い名前を指定しないといけないのではなく、 Excelへ渡す引数に空白を含むパスを与えると、誤動作するからでしょう。 ダブルコーテーションの中にさらにダブルコーテーションを含める場合は、 2つ続けて記しますので、 """c:\Program Files\Microsoft Office\office11\excel.exe"" /r ""空 白 を含むフォルダや\ファ イル 名.xls""" で上手くいくと思います。

nozomi300k
質問者

お礼

なるほど。空白が問題だったのですね。 よくわかりました。ありがとうございました。

すると、全ての回答が全文表示されます。
noname#22222
noname#22222
回答No.3

s_husky です。補足します。 ' ---------------------------------------------------------------------------------------- ' 共通記号定数 ' ---------------------------------------------------------------------------------------- Option Compare Database Option Explicit ' ' Rounds関数用 ' Public Const 四捨五入 = 0 Public Const 切り捨て = 1 Public Const 切り上げ = 2 広域記号定数の場合です。

すると、全ての回答が全文表示されます。
noname#22222
noname#22222
回答No.2

プログラムコードにパス情報を書くのは、一種のマジックナンバーの埋め込みに等しい作法かと思います。 ですから、 Const conExcelPath = "c:\Program Files\Microsoft Office\office11\excel.exe /r " Const conBookName = "c:\docume~1\alluse~1\docume~1\毎日の数字.xls" と、モジュールで定義し、 Call Shell(conExcelPath & conBookName, 1) と書けば宜しいかと・・・。

nozomi300k
質問者

お礼

ご忠告ありがとうございました。 今後の参考にさせて頂きます。

すると、全ての回答が全文表示されます。
  • yarazu
  • ベストアンサー率36% (4/11)
回答No.1

関数GetshortPathNameで取得できませんか? Dim strLongPath As String Dim strShortPath As String * 255 Dim lngRet As Long Dim lngSiz As Long strLongPath = strlName lngSiz = Len(strShortPath) lngRet = GetShortPathName(strLongPath, strShortPath, lngSiz) usrShortNameGet = Trim(Left(strShortPath, InStr(strShortPath, Chr(0)) - 1))

nozomi300k
質問者

お礼

ご回答ありがとうございました。 GetShortPathNameという関数はACCESS2003にはないようですが、 何かセットアップが必要なのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A