アプリ版:「スタンプのみでお礼する」機能のリリースについて

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)

のように指定していますが、いちいち短い名前を指定しないと
いけないようで、面倒で困っています。
長いパス名を短いパス名に変換するような関数等はありませんか?
他にもっと簡便な方法があればあわせてご教示ください。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/08 09:05

こんにちは。

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/08 09:05

どちらかというと、


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

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

お礼日時:2006/08/08 09:07

s_husky です。

補足します。

' ----------------------------------------------------------------------------------------
' 共通記号定数
' ----------------------------------------------------------------------------------------
Option Compare Database
Option Explicit

'
' Rounds関数用
'
Public Const 四捨五入 = 0
Public Const 切り捨て = 1
Public Const 切り上げ = 2

広域記号定数の場合です。
    • good
    • 0

プログラムコードにパス情報を書くのは、一種のマジックナンバーの埋め込みに等しい作法かと思います。


ですから、

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)

と書けば宜しいかと・・・。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/08 09:08

関数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))
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

GetShortPathNameという関数はACCESS2003にはないようですが、
何かセットアップが必要なのでしょうか?

お礼日時:2006/08/07 19:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!