こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBからACCESSのデータを印刷するが2000とXPで・・・

OSが2000
VB6.0のSP5
ACCESS2000
の環境で開発してVBから下記のようにShell関数
でACCESSからの印刷をしているのですが
2000では印刷できるのですが
XPでVB6.0のSP5
ACCESS2000の環境でコンパイルして実行しても
「起動するためのコマンドライン引数が不正です」
とメッセージがでてしまい印刷できません。
どなたか解る方がいましたら解答お願いします。

strMSACCESS =
"C:\Program Fles\Microsoft Office\Office\MSACCESS.EXE"

strCommand = strMSACCESS & " " & CurDir & "\AAA.mdb /x DoPrint /cmd " & "**"

Work = Shell(strCommand, vbMinimizedFocus)

AAA.mdbのあるフィールドの**の値のものだけを印刷しています。
Microsoft DAO3.6 Object Libraryを指定しています

投稿日時 - 2004-03-25 15:08:04

QNo.814728

困ってます

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

>その後のstrCommand を付け加えるとやはりダメでした。

strCommandの内容、微妙にmasa00さんのコードを直してあるんですけど、そのままコピペしてもらえました?

投稿日時 - 2004-03-26 12:13:03

お礼

うまくいきました。前回はなぜうまく動作しなかったのかは
解りませんが、2回目の回答でもう1度確認ため試したら
うまく動作しました。
いろいろありがとうございます。

投稿日時 - 2004-03-26 18:24:28

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

#3 の
>strMSACCESS = """C:\Program Fles\Microsoft Office\Office\MSACCESS.EXE"""
ですが、"Program Files" じゃなくて "Program Fles" になってますね。

投稿日時 - 2004-03-26 16:10:43

お礼

そういえばそうですね。
私の質問のときから間違っていました。
申し訳ありません。
コーディングはProgram Filesになっていました。
いろいろありがとうございました。

投稿日時 - 2004-03-26 18:28:07

ANo.6

2ch

失礼

#3でMDBを処理してたみたいね。。。

昨晩、自宅環境
OS:Win2000pro
AC:Access2002(XP)
で#3の内容をコピってやってみたら、できなかった。。。

イメージ的にはできそうなんだけどね。

なぜなんだろう

投稿日時 - 2004-03-26 12:54:14

お礼

補足などして再び回答いただいたりして
ありがとうございました。
動作するようになりましたが、何がどうなって
うまく動作しなかったのかは補足後の回答のソースで
少し理解できました。これから詳しく調べようと思います。
回答の時間を見ると深夜なので驚きました。
いろいろ協力していただき本当にありがとうございます。

投稿日時 - 2004-03-26 18:34:29

ANo.4

2ch

#3の言いたいことはあってるけど、例を書き間違ったんだと思う。

Accessパスはダブルで囲む必要ないけど、アクセスMDBのフルパスを処理しなけりゃいけない?。
まーそんな心配が無いように、ショート名にMDBを変換すりゃマルチに使える。

Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" _
  (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
  (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

Sub Main()
  Const DEF_FILE As String = "AAA.mdb"        'DBファイル名
  Const DEF_PARAM As String = "/x DoPrint /cmd **"  'パラメータ
  
  Dim strDBFile  As String
  
  strDBFile = CurDir$ & "\" & DEF_FILE
  
  If Not MyShell(strDBFile, vbMinimizedFocus, DEF_PARAM) Then
    GoTo PGMEND
  End If
  
  MsgBox "起動成功"
  
PGMEND:
End Sub

'起動する関数
Function MyShell( _
          ByVal inFilePath As String, _
          Optional ByVal inWindowStyle As VbAppWinStyle = vbNormalFocus, _
          Optional ByVal inParam As String _
        ) As Boolean
  Const MAX_SIZE As Long = 260
  
  Dim lpszShortPath  As String * MAX_SIZE
  Dim strShortPath  As String
  
  Dim strExeName   As String * 1024
 
  Dim strShell    As String
  
  Dim lngProcessId  As Long
  Dim lngRet     As Long
  
  On Error GoTo PGMEND
 
  'DBをショート名に変換
  lngRet = GetShortPathName(ByVal inFilePath, lpszShortPath, ByVal Len(lpszShortPath))
  If (lngRet = 0) Then
    MsgBox "ショートファイル名に変換エラー"
  End If
  'ショートファイル名正規化
  strShortPath = Left$(lpszShortPath, lngRet)
  
  
  'DB存在チェック
  If Dir(strShortPath) = "" Then
    MsgBox "ファイル無い"
    GoTo PGMEND
  End If
 
  '関連付いたEXEを取得
  lngRet = FindExecutable(strShortPath, vbNullString, strExeName)
  If (lngRet < 33) Then
    MsgBox "関連付いたEXEの取得失敗"
    GoTo PGMEND
  End If
  
  'SHELLに投げる文字を作成
  strShell = Left$(strExeName, InStr(1, strExeName, vbNullChar) - 1) & " " & strShortPath
  If (inParam <> "") Then
    strShell = strShell & " " & inParam
  End If
  
  '起動
  lngProcessId = Shell(strShell, inWindowStyle)
  If (lngProcessId = 0&) Then
    MsgBox "起動失敗"
    GoTo PGMEND
  End If
  
  '正常終了
  MyShell = True
PGMEND:
  Exit Function
PGMERR:
  Call MsgBox(Err.Number & vbCrLf & Err.Description)
  GoTo PGMEND
End Function


って感じ

この例は#2で発言した真意と違う内容。

#2で言いたかったのは、パラメータでAccessを利用するのではなく、Access起動後もVBで完全操作する方法の方が、何かと便利だからと思っての発言。

でもAccess側でコーディングがほとんどできたているなら、しゃーないとオモタ。

投稿日時 - 2004-03-26 02:26:32

ANo.3

strMSACCESS =
"""C:\Program Fles\Microsoft Office\Office\MSACCESS.EXE"""

strCommand = strMSACCESS & " """ & CurDir & "\AAA.mdb"" /x DoPrint /cmd " & "**"

パス名にスペースが入っているからでしょう。
ダブルクォーテーションで囲いましょう。

投稿日時 - 2004-03-25 18:21:36

お礼

試してみましたがダメでした。
strMSACCESS だけで実行したところACCESSは起動できました。
その後のstrCommand を付け加えるとやはりダメでした。
ありがとうございます。

投稿日時 - 2004-03-25 19:14:28

ANo.2

2ch

補足

回答を参考にさせていただいて、調べた結果XPでEXEを
作成してインストール先が"C:\Program File\*****"に
インストールすると印刷できなく"C:\Program File"の
フォルダ以外だと正常に動作して印刷できました。
DLLの問題かACCESSのマクロの問題か解りません。
この内容で症状がおわかり頂けたらお時間があるときにでも
回答を頂けたらうれしく思います。
勉強不足で申し訳ありません。

投稿日時 - 2004-03-25 18:09:34

ANo.1

(1) Work = Shell(strCommand, vbMinimizedFocus) の行にブレークポイントを設定して実行。
(2) イメディエイトウィンドで
?strCommand
とするなどして、strCommand の内容を確認されてはどうでしょうか。

投稿日時 - 2004-03-25 15:45:59

お礼

内容は確認してみましたが間違っていませんでした。
早々の解答ありがとうございます。

投稿日時 - 2004-03-25 18:09:17

あなたにオススメの質問