• ベストアンサー

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

  • エクセルのフルパスをvbaで取得

    当方エクセル2003で、 エクセルのフルパスは C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE です。 それをVBAで取得するにはどうすればいいですか? Sub サンプル() Debug.Print 'オフィスがインストールされているフォルダのパスの取得 End Sub のようにして、 C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE を返したいです。 VBAコードをご教示ください。

  • Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。

    Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。 以下のように、shell関数で、既存のExcelファイルを起動させました。 どうすれば、Excelファイルを終了できますか? 宜しくお願いします。 Dim fl_name As String fl_name = "C:\XE2.xls" Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE " & fl_name, vbNormalFocus

  • VBからExcelクローズ検知

    VBで作成したaaa.exeの中でエクセルファイルbbb.xls、ccc.xlsを呼び出しています。 taskIdB = Shell("C:\Program Files\Microsoft Office\Office10\excel.exe C:\bbb.xls", vbHide) taskIdC = Shell("C:\Program Files\Microsoft Office\Office10\excel.exe C:\ccc.xls", vbHide) bbb.xls、ccc.xlsともにWorkbook_Openイベントで自動的にVBAが起動し、処理が終了すると自分自身を クローズするようになっています。 ここで問題になるのが、ccc.xls は bbb.xlsの処理完了を待ってから起動したいのですが、連続的に起動してしまう点です。 aaa.exeのなかで、bbb.xlsの終了を検知するなど、良い解決方法があればお教え下さい。 WindowsはXp pro.、VBは6.0、Excelは2002を使用しています。 よろしくお願いいたします。

  • AppActivateの使い方

    現在開いているエクセルファイルをアクティブにしたいです。 バージョンは2003です。 アクセスVBAから Sub test() Dim rc As Long rc = Shell("C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE", 1) AppActivate "aaa.xls" End Sub を実行すると、 新規にアプリケーションが開いて、空のBOOK1が表示されます。 本当は、aaa.xlsをアクティブにしたいのですがうまく出来ません。 aaa.xlsは既に開いている状態です。 aaa.xlsはデスクトップにあります。 http://officetanaka.net/excel/vba/statement/AppActivate.htm を見ながらやってみたのですがうまく出来ません。 新たなアプリケーションは立ち上げたくないけど aaa.xlsはアクティブにしたいです。

  • VBからExcelが起動しません

    Excelファイルを開くプログラムをVBで作成したのですが 1つのパソコンだけ実行時エラー5が発生してExcelを起動できません どなたかお助けください プログラムはこんなかんじです WKPATH = "D:\Program Files\Microsoft Office\Office\EXCEL.EXE " & " c:\a.xls" exl = Shell(WKPATH, 1) ちなみにエラーが発生するパソコンはNT4.0sp6です

  • Excelのハイパーリンクで絶対パスが動作しない

    こちらで同類の質問を見つけましたが解決に至っていなかったので質問させていただきます。 当方、Excel2000を使用しています。 サーバー上にある共有フォルダ(Jドライブ)の同じフォルダの中に「A.xls」とリンク参照先のファイル「B.xls」があります。 「A.xls」のセルに、「B.xls」を開くためのハイパーリンクを、絶対パス(J:\フォルダ名\B.xls)で指定しました。 しかし、「A.xls」を例えばローカルドライブ(Cドライブ)のデスクトップにコピーし、そちらを開いてハイパーリンクをクリックすると、Jドライブにある「B.xls」を開きたいのに、ハイパーリンクが相対パスに変わってしまって、デスクトップ上のB.xlsを探してしまうため「ファイルが見つかりません」と表示されてしまいます。 [ハイパーリンクの編集]で確認したところ、「ファイル名またはWebページ名」欄には絶対パス「J:\フォルダ名\B.xls」を指定したはずなのに「J:\フォルダ名\」の部分が消えてしまい、「B.xls」というファイル名しか残っていませんでした。 Microsoftサポート情報『JP418119:以前のバージョンでハイパーリンクが開けない』の原因欄に『参照元と参照先が同じドライブの場合、ファイルを保存した時点で相対パスに変更されます。』とあったので、システムの仕様なのかもしれませんが、同一フォルダ内にあるファイルでも絶対パスの情報を保持する方法はないでしょうか。 デスクトップにある「A.xls」でハイパーリンクを設定すれば、「B.xls」と別フォルダのためか絶対パスが保持されるのですが、「A.xls」は最終的には「B.xls」と同じフォルダ内に保存しておきたいので、いちいちコピーするのはなるべく避けたいため、同一フォルダ内でも絶対パスの指定を保持する方法を教えてください。

  • Accessフォームからの外部アプリ起動方法

    お世話になります。 掲題の件、Accessのフォームからボタンをクリックし、 外部アプリケーション(たとえばExcel等)を起動する ことは可能でしょうか? 起動可能であればどのようなVBA記述をしたら良いか 教えて頂けたら幸いです。 [作成環境] 起動ボタン名: 起動 Excelのパス :  C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE 以上、宜しくお願い致します。

  • エクセルでパスを含んだファイル名

    エクセルのヘッダー・フッター編集で ワードのように"パスを含んだファイル名"(またはシート名)を 自動?で挿入することはできるでしょうか。 例えば、Cドライブの「あ」と言うフォルダーに保存してある テスト.xlsの「い」と言うシート名をヘッダーに挿入したい 場合、 C:\あ\テスト.xls\い と言うようにです。 ご教授をお願いいたします。

  • セルのファイルを起動したい

    セルに入っているファイル名を開きたいと考えています。 ファイル名はパス付きで入っています。 拡張子が.docの時はワードで、.xlsの時はエクセルで、.pdfの時はアクロバットで、その他該当するアプリケーションを立ち上げてそのファイルを開き、そしてパス名だけの時はエクスプローラで該当ディレクトリを開きたいと思っています。 拡張子を見てワード、エクセル、アクロバットまでは立ち上げるVBAまでは出来ました。 エクスプローラが分かりません。 どなたか教えていただけないでしょうか。 またファイル名が入っている場合、現在は直接アプリケーションを起動するやり方をとっていますが、拡張子から自動的に適切なアプリを立ち上げることはできないでしょうか。 よろしくお願い申し上げます。 現在の方法: Sub test() Shell "C:\Program Files\Microsoft Office\OFFICE11\WinWord.exe " & _ "c:\test.doc", vbMaximizedFocus End Sub

  • バッチファイル エクセル起動

    いつも大変御世話になっております。 WindowsVISTA環境で以下バッチ【ABC.bat】が稼動します。 "ABC.bat"------------------------------------------------- "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" "F:\EXCEL_OPEN\ABC.xls" echo %ERRORLEVEL% pause "ABC.bat"------------------------------------------------- 上記バッチの構文について3点質問があります。 (1)OS等が変わった場合、EXCEL.EXEの格納パスも変更するので   当然変更しなければいけないのでしょうか? (2)上記バッチを起動する前に他のエクセルを開いていた場合(例えばDEF.xls)、  ABC.xlsとDEF.xlsを両方閉じなければバッチの後続処理が動きません。  ABC.xlsだけ閉じてバッチの後続処理を動かす事は可能なのでしょうか? (3)上記構文でエクセル(マクロ)からエラーレベルを取得できるのでしょうか?  ※上記バッチで開くエクセルは開いたら自動でマクロが動きます。 もしご存知の方がいらっしゃるようでしたら、ご教授願いますでしょうか? 以上、何卒宜しくお願い致します。

専門家に質問してみよう