Access初心者です。
使用バージョンは、Access・Wordともに2007です。
Accessのクエリー/テーブルをWord文書に差し込み、Accessから起動してその差し込み文書を印刷したいのですが、うまくいきません。
Getobjectを使ってWordの差し込み文書テストを印刷する以下のようなプロシジャを作成しました。
予め、手動でWordを起動してから、このプロシジャを実行すると、文書『テスト』を開く前に「次の文書を開くと次のコマンドが実行されます。Select*fromテーブル名 データベースのデータが文書に挿入されます続行しますか?」のメッセージが表示されて応答確認が来るのですが、Wordを起動せずに実行すると、上記のメッセージは表示されず、テーブル内のデータに更新がかかっているにもかかわらず、上記メッセージで「いいえ」と応答したのと同様の状態で印刷されます。

はたして、こんなプロシジャでよいのか、使用方法が間違っているのかすら見当がつきません。どなたかアドバイスをお願いいたします。

(作成したプロシジャ)
On Error GoTo エラー発生
Dim WordFilePass As String
WordFilePass = "C:\Users\User1\Documents\テスト.docx"
Dim MyWord As Word.Application
Set MyWord = GetObject(, "Word.Application")
MyWord.Visible = True
MyWord.Documents.Open FileName:=WordFilePass
MyWord.ActiveDocument.PrintOut
MyWord.Application.Quit
Set MyWord = Nothing
エラー発生:
If Err.Number = 429 Then
Set MyWord = CreateObject("Word.Application")
Resume Next
Else
MsgBox "エラーNo : " & Err.Number & vbNewLine & vbNewLine & _
"エラー内容 : " & Err.Description
End If

このQ&Aに関連する最新のQ&A

A 回答 (3件)

変数名がダブっていました。


下記*行変更下さい。

Private Sub InsertDoc(MyDataName As String) 'MyDataNameは、元データのテーブル又はクエリー名 *
Dim myWrd As Object 'オリジナル文書をセット
Dim myTMP As Object 'テンプレート文書用
Dim MyName As String 'テンプレート文書名
Dim myLooP As Long
Dim LineNum As Integer

'差込印刷のオリジナル文書
Const myFileP As String = "C:\差込印刷.doc"
'テンプレートを保存するフォルダパス(+\)
Const myPath As String = "C:\"

LineNum = DCount("*", MyDataName) 'テーブル又はクエリーのレコード数を取得 *
    • good
    • 0
この回答へのお礼

ありがとうございます。
たいへん参考になりました。試行錯誤しましたがおかげさまで、うまくいきました。
お礼がおそくなりもうしわけございませんでした。

お礼日時:2009/05/18 13:08

私も同じことを行おうとして、質問を考えていました。


imogasiさんの回答は、大変参考となりました。ありがとうございました。
リンク先のコードから下記のような形にしてみました。
差し込み実行後、作成されたワード文書を印刷するとともに、ワードファイルとして保存します。印刷は確認していませんが、ファイルは問題なく作成できました。
このような回答の仕方がルール違反でしたら、お詫びします。

Private Sub InsertDoc(MyName As String) 'MyNameは、元データのテーブル又はクエリー名
Dim myWrd As Object 'オリジナル文書をセット
Dim myTMP As Object 'テンプレート文書用
Dim MyName As String 'テンプレート文書名
Dim myLooP As Long
Dim LineNum As Integer

'差込印刷のオリジナル文書
Const myFileP As String = "C:\差込印刷.doc"
'テンプレートを保存するフォルダパス(+\)
Const myPath As String = "C:\"

LineNum = DCount("*", MyName) 'テーブル又はクエリーのレコード数を取得
If LineNum = 0 Then
MsgBox "レコードがありません!", vbExclamation + vbOKOnly, "確認"
Exit Sub
End If
'ワードオブジェクトの取得
Set myWrd = GetObject(myFileP)
Set myTMP = GetObject(Class:="Word.Application")

'差込
For myLooP = 1 To LineNum 'レコード数だけループする
With myWrd
With .MailMerge
.Destination = 0
.SuppressBlankLines = True
With .DataSource
.FirstRecord = myLooP
.LastRecord = myLooP
End With
.Execute Pause:=False
End With

'文書の印刷、保存
MyName = myPath & "差込済み文書" & Format(Date, "yymmdd") & "_" & myLooP & ".doc"
myTMP.Application.ActiveDocument.PrintOut
myTMP.Application.ActiveDocument.SaveAs FileName:=MyName, FileFormat:=wdFormatDocument
myTMP.Application.ActiveDocument.Close
End With
Next

myWrd.Close

Set myTMP = Nothing
Set myWrd = Nothing

MsgBox LineNum & "個のファイル" & myPath & "差込済み文書" & Format(Date, "yymmdd") & "_1 - " & _
LineNum & ".doc が作成されました。"

End Sub
    • good
    • 1

初心者と称して、こんなことをやろうとするのは無謀。


ワードの世界にプログラムで入るなら、ワードのVBAの知識が必要。この情報はWEBでも少ない(解説書では皆無?)、し、経験者も少ないと思う。
難しいことをやりたいなら、自分で苦労して勉強する(期間も当然かかる)のが筋。出来なければ、あきらめること。
ーー
ワードの差込印刷のコードはどうなるか
それをアクセスの世界からWord.Applicationの世界に入ったらどう修正が必要か
の情報を探すこと。
ーー
根本的に
アクセスの世界で
アクセスデータークエリで選択・順序ーレポート印刷
ではいけないのか
ーー
質問は
(1)アクセス起動ーワードに変化部分データー地はワード文書ー機能はワードのMailmerge か
(2)アクセス起動ーアクセスに変化部分データー地はワード文書ー機能はMailmerge か
(2)らしいね。
だったら
(3)前記 アクセスの世界で
アクセスデータークエリで選択・順序ーレポート印刷
の方が勉強が易しいと思う。
他ソフトと連携など先の先に勉強することだと思う。
こんな複雑なことをやる必要があるのは、質問者はソフト業界の社員かな。それなら先輩にそういう経験者がいるのではと思うのでその方に聞いたら。そういうパターンの質問ならここに質問することでは無い。個人なら他ソフトにまたがるような仕組みを複雑にしない選択を出来るだろうから、すること。
===
WEBでは、参考になりそうなのは
http://www.accessclub.jp/bbs5/0017/vba4974.html
ぐらいかな。
Googleで「ワード 差込印刷 VBA」で照会しましたか。
エクセルとの関連が多いようだが、丁寧に当たってみては。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
無謀ですか・・・。初心者ゆえのことです。
私はソフト業界の社員ではありません。諸事情により業務でいきなりAccessをする事になりました。
運用上の背景もありWordとの連携印刷を考えました。ネットで調べたらWordを印刷するサンプルが掲載されていたので、使ってみましたが知り合いに誰も聞く人がいないのでここで質問した次第です。
仰せの通り、別の方法も模索しつつ苦労してみます。

お礼日時:2009/05/16 12:39

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESSのクエリで抽出したデータをWord文書へ差込印刷したいです。

始めまして。今ACCESSをやっているのですが、クエリで抽出したデーターを既存のWord文書に差込印刷をしたいのですがどうしても上手くいきません。もしご存知でしたらこの差込方法を教えてください。

やりたいことは・・・
Accessのフォームでボタンを作り該当するボタンをクリックすると既存の差込をしたいWORD文書がでてきて、
そこにはもう差し込まれた状態でWordを起動したいのです。


今の作業の状況は・・・
ボタンをクリックするとマクロで設定してある作業が実行できるように指定しているのです。
マクロでは、
アプリケーションの実行
を入力して、
そのコマンドラインには
C:\Program Files\Microsoft Office\Office10\WINWORD.EXE C:\総務\レポート\人事考課(経営推進-参与).doc
としています。

わかりずらくてすみませんm(__)m

どうかよろしくお願いします。

Aベストアンサー

こんにちわ。以前同様のものを作ったことがあります。
その際、私が使ったのはマクロではなくVBAでしたが参考までにやり方を載せておきます。
>>>>>>>>>>>
Dim passadd
docmd.SetWarnings false
DoCmd.OpenQuery "[クエリー名を入れてください]"
passadd = "C:\総務\レポート\人事考課(経営推進-参与).doc"
Shell "C:\Program Files\Microsoft Office\Office10\WINWORD.EXE " & passadd & "", 3
DoCmd.SetWarnings True
<<<<<<<<<<<
そのままコピペしたのでSetWarningsとかOpenQueryとかは必要ないかも知れません。(笑)
(昔のことで何のために書いたか忘れてる…)
あとパスは920-920さんの書かれたパスを入れさせて頂きました。
ちなみにShell~でWORDの場所を指定していますが「~WINWORD.EXE」のあとは1つ空白を入れてダブルクォーテーションを閉じてください。確かここが上手くいくためのコツだったと思います。
ではがんばってください。

こんにちわ。以前同様のものを作ったことがあります。
その際、私が使ったのはマクロではなくVBAでしたが参考までにやり方を載せておきます。
>>>>>>>>>>>
Dim passadd
docmd.SetWarnings false
DoCmd.OpenQuery "[クエリー名を入れてください]"
passadd = "C:\総務\レポート\人事考課(経営推進-参与).doc"
Shell "C:\Program Files\Microsoft Office\Office10\WINWORD.EXE " & passadd & "", 3
DoCmd.SetWarnings True
<<<<<<<<<<<
そのままコピペしたのでSetWarningsとかO...続きを読む

QAccessのレポート出力をWordに出力する方法

AccessDBにて、ある伝票をレポート出力しました。
今まではワードにて伝票作成しメール送信していたやつです。
現在はレポート印刷で「紙」になってしまいます。
できれば、「ワードファイル」または「HTMLファイル」に出力して、メールへ添付をしたいのです。
なので、伝票をワード形式にしたいのですが、Accessのエキスポートにはワードはありせん。
ACCESSDBへデーターを入力して、「ボタン押下」で
ワードのフォーマットのファイルに出力する方法は
ないのでしょうか?

Aベストアンサー

97ですが、出力したいレポートを表示してメニューより
ツール→Office LinksでWordかExcelに出力できます。
それより新しい2000などでも可能だと思います

QACCESSからVBAでWORDの印刷を..

ACCESS2000のVBAでWORD文書の印刷をしたいのですが、どのようなコマンドを使ったらいいのかさっぱり分かりません。どなたか教えて下さい!

Aベストアンサー

こんな感じでどうでしょうか。
Sub Macro()
 Dim obj As Object
 Set obj = CreateObject("Word.Application")
 Shell obj.Path & "\winword.exe"
 'これでobjを使ってWordが操作できるようになります。
 'ちなみにExcelなら同じ理屈でExcel.Application

 obj.Documents.Open FileName:="test.doc"
 obj.ActiveDocument.PrintOut
 'この例ではtest.docを開いて、印刷します。
 '要はWordでの操作をマクロで記録して、それをobjに続けて書きます。

 Set ob = Nothing
 '最後にオブジェクト解放
End Sub
なお、これは要するにAccessからWordを操作するのだから、Wordがインストールされてなければダメです。

Qアクセスのボタンから指定のワードファイルを開く

アクセスのフォームでボタンをいくつか作成し、各ボタンをクリックすると指定のワードファイルが開けるようにするにはどうしたら良いのでしょうか。
宜しくお願いします。

Aベストアンサー

ボタンのプロパティのクリック時のイベントに
ボタンをコマンド1とすると

Private Sub コマンド1_Click()
On Error GoTo Err_コマンド1_Click

Dim stAppName As String

stAppName = "C:\Program Files\Microsoft Office\Office\winword.exe 指定のワードファイルのパス\ファイル名.doc"
Call Shell(stAppName, 1)

Exit_コマンド1_Click:
Exit Sub

Err_コマンド1_Click:
MsgBox Err.Description
Resume Exit_コマンド1_Click

End Sub

と記述すれば開きます。

Qaccessレポートにwordの文書を貼り付ける

accessレポートにwordの文書を貼り付ける
accessは、レポートにword,excelにオフィスリンク機能や差し込み印刷はあるのは、わかっていますがあえて使わずに作業をしたいのです。
利用ソフトはアクセス2007、2003、2000どれも試しました。
accessでレポートを作成する時に、wordやexcelで作成した物をコピーして張り付けるということが可能ですが、wordの文書を貼り付けると通常は80%程度の大きさにしかなりません。
しかしコピーして貼り付けたら、ほぼ同一の大きさになったことがたまに何度かあります。
理由はわからないのですが、やり方が(法則?)わかれば教えてください。

Aベストアンサー

回答します。アクセスのレポートをワードのリッチテキストファイル形式で保存をした後、これにテキストボックスを挿入し、そのなかにワードの文書ファイルを貼り付けることが出来ますが、これではいけないのでしょうか。

QAccessのマクロでWordを最前面に開く

Access2010を使用しています。
フォームにボタンを設置し、
そのボタンをクリックすると
「WORD」というテーブル書出しクエリが実行されて、
その実行結果を
「form.dotx」というWordファイルに差込みしたいと思っています。

Private Sub コマンド39_Click()
DoCmd.OpenQuery "WORD"

Dim oDoc As Object
Set oDoc = GetObject("\\XXX\XXX\form.dotx")
oDoc.Application.Visible = True

End Sub

上記のようにマクロを書いてみたんですが
実行すると
WORDファイルを開く前のメッセージボックス
”この文書を開くと、次のSQLコマンドが実行されます”
がウィンドウの最背面に表示されてしまい、
Accessほかにひらいているものをひとつひとつ最小化すると
やっとそのメッセージボックスが表示されるような状態です。

Wordのレジストリをいじって
このメッセージボックスを表示させない方法もあるようですが
http://free-style.mkstyle.net/web/pc/sql.html
社内で共有して使うものなので
できればレジストリを操作するようなことはしたくありません。

マクロを実行したら
Wordを開く際のメッセージボックスが最前面に表示されるような方法は
あるのでしょうか?

ご教授お願いいたします!

Access2010を使用しています。
フォームにボタンを設置し、
そのボタンをクリックすると
「WORD」というテーブル書出しクエリが実行されて、
その実行結果を
「form.dotx」というWordファイルに差込みしたいと思っています。

Private Sub コマンド39_Click()
DoCmd.OpenQuery "WORD"

Dim oDoc As Object
Set oDoc = GetObject("\\XXX\XXX\form.dotx")
oDoc.Application.Visible = True

End Sub

上記のようにマクロを書いてみたんですが
実行すると
WORDファイルを開く前のメッセージボックス
”この文書を開く...続きを読む

Aベストアンサー

VBAでレジストリを操作する方法もあるのですが、それはやめておきます。ただ、多くのソフトウェアは、レジストリを操作しているのですが、他のPCで、作ったままのVBAでは、アンチウィルスに引っかかてしまいます。

今回は、私の場合、OSの関係か、そのコードで再現はできなかったのですが、現象は理解できます。

Dim fn As String '一応、念の為にファイル名を別書きにしました。
fn = "\\XXX\XXX\form.dotx"
CreateObject("Wscript.Shell").Run fn

こんな風にすれば、SQLは生きた状態で、Wordは前面で開くはずです。
Word自体を前面に持ってくる方法もありますが、とりあえず、これで試してみてください。

QACCESSのレポートにWORDで作った文書を貼り付けるには?

ACCESS初心者です。
WORDで既に作成してある表があって、それをACCESSのレポートにしたいのですが、
カット&ペーストすると、左側が切れて印刷されてしまいます。
(プレビューで見ると、ちゃんと入っているように見えるのですが…)
ACCESSの設定が悪いのか?WORDの設定が悪いのか?分かりません。
うまく設定する方法を教えてください。

ちなみに、他に良い方法があれば、そちらも教えてください。

Aベストアンサー

推測ですが余白がWordのものがある上にAccessのがあるので
右下にずれるんでしょう。

プリンタに縁なし印刷の設定があるなら
Access側のページ設定で縁なしにしないと無理でしょうね。

Qexcelからexcelへの差し込み印刷

お世話になります。

excelでwordへの差し込み印刷をよく利用するのですが、
同様に、
excelのデータをexcelに流し込んで印刷する方法はありますでしょうか。

excelの名簿のデータを
excelの表のフォーマットに流し込んで
1人づつ印刷したいのですが。

お分かりの方いらっしゃいました教えてください。
どうぞ宜しくお願い致します。

Aベストアンサー

イメージはわかるが、エクセルに差込印刷の機能はありません。
ワードなどと違ってA.X氏1人分書類シート作成、B印刷、Aのシートををy氏分のデータでシート内容(セル)を置き換え、印刷、の繰り返しをします。
ーー
例データ Sheet1 A1;D3
連番氏名住所品物
1山田 三郎東京都江東区かばん
2植田 健横浜市港北区帽子
A列はこのたび連番を振りました。
Sheet2   に送り状の書式を体裁よく作ります。
H1セル(どこでも良いが、下記のVLOOKUPの式は変わる)

送り状

住所X
氏名Y

品物Z

上記の品をお送り申し上げます。
ご査収ください

以上
Xの場所のセルに =VLOOKUP($H$1,Sheet1!$A$1:$D$3,2,FALSE)
Yの場所のセルに =VLOOKUP($H$1,Sheet1!$A$1:$D$3,3,FALSE)
Zの場所のセルに =VLOOKUP($H$1,Sheet1!$A$1:$D$3,4,FALSE)

---
結果

送り状

住所山田 三郎
氏名東京都江東区

品物かばん

上記の品をお送り申し上げます。
ご査収ください

以上
ここで
VBE画面で標準モジュールに
Sub test01()
For i = 1 To 2 '人数分
Range("H1") = i
Range("A1:G20").PrintOut '印刷範囲は各人同じとする
Next i
End Sub
を張り付け、実行する。
山田、植田分の紙が2枚印刷されました。
これは質問者はVBAの経験も無いでしょうと、最低限にしてあります。
VBAを勉強してください。
別ブックにある名簿を対象などは複雑になるので避けています。

イメージはわかるが、エクセルに差込印刷の機能はありません。
ワードなどと違ってA.X氏1人分書類シート作成、B印刷、Aのシートををy氏分のデータでシート内容(セル)を置き換え、印刷、の繰り返しをします。
ーー
例データ Sheet1 A1;D3
連番氏名住所品物
1山田 三郎東京都江東区かばん
2植田 健横浜市港北区帽子
A列はこのたび連番を振りました。
Sheet2   に送り状の書式を体裁よく作ります。
H1セル(どこでも良いが、下記のVLOOKUPの式は変わる)

送り状

住所X
氏名Y

品物Z

...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QACCESS VBAからWordのテンプレートに

いつもお世話になっております。

今回、やる作業というのは下記のとおりです。

1.フォームのチェックボックスにチェックをする
2.帳票出力ボタンを押す
3.指定のWordテンプレート起動する
3.チェックの有無によって、Wordテンプレートにあらかじめ入力しておいた「有 無」という言葉を○で囲ったように表示する。

つまりフォームのチェックボックスにチェックがついていれば、Wordの「有」を○で囲い、チェックがなければ「無」を○で囲むっといった具合です。

この対応する言葉を○で囲むというのはどのように記述すればいいんでしょうか?
ACCESS VBAを使っております。

WordでムリなようでしたらExcelでの方法でも結構です。。

拙い文書力で申し訳ございませんが、宜しくお願い致します。

Aベストアンサー

最初、オートシェイプで○をつける方法しか思い浮かばなかったのですが、#1 の方がおっしゃるように、「書式」-「書式拡張」-「囲い文字」を使用する方法が簡単で良いと思います。
Access、Word のバージョンがわかりませんが、Word に、「ツール」-「マクロ」-「新しいマクロの記録」というのがありますよね?「囲い文字」の操作をマクロで記録しておいて、それを Access の VBA に流用すればよいと思います。(念のため言っておきますが、コピー&ペーストで貼り付けただけではダメです。)
「囲い文字」にする文字の場所の特定方法も、 Word の「編集」-「検索」をマクロで記録して Access の VBA に流用すればよいと思います。
もし、囲い文字処理をする文字以外に「有」または「無」がテンプレート中の文章に存在するなら、「次を検索」を繰り返してで目的の位置まで移動させるとか、テンプレートでは囲い文字処理対象の「有」の場所に「@U」、「無」の場所に「@MU」などのように文章中に存在しない文字列を記述しておいて、その文字列を検索→置き換え、のようにしてもよいと思います。

最初、オートシェイプで○をつける方法しか思い浮かばなかったのですが、#1 の方がおっしゃるように、「書式」-「書式拡張」-「囲い文字」を使用する方法が簡単で良いと思います。
Access、Word のバージョンがわかりませんが、Word に、「ツール」-「マクロ」-「新しいマクロの記録」というのがありますよね?「囲い文字」の操作をマクロで記録しておいて、それを Access の VBA に流用すればよいと思います。(念のため言っておきますが、コピー&ペーストで貼り付けただけではダメです。)
「囲い文字」に...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング