御返事ありがとうございます。
吐出しから見栄えの修正までのコードは以下になります。
(これは納品書ですが請求書も見積書も同様な流れで処理しています)
1フォームでコンボボックスから選択した取引先を基にクエリの生成
2指定された場所に保存された書類のテンプレートを呼び出し
3テンプレートへクエリから貼り付け
4テンプレートは変動に対応できるよう幅をもたせているので最終行からデータの終わりまでを求めて削除
5わかりやすいように指定場所へ保存
Dim rs As DAO.Recordset
Dim qd As DAO.QueryDef
Dim xlApp As Excel.Application
Dim xlWb As Excel.Workbook
Dim xlWs As Excel.Worksheet
Dim fileName As Variant
Dim x1, y1, x2, y2, x3, y3, i As Long
Dim endrc
Dim res As Variant
res = MsgBox("データの吐き出しをおこないますか?" & Chr(13) & "本出しは戻れません!!", _
vbYesNo, "吐き出しの確認")
If res = vbYes Then
'レコードセットを開く
'VBAでパラメータクエリをセットさせないといけないので・・・
Set qd = CurrentDb.QueryDefs("Q_納品書吐き出し")
qd.Parameters("[forms]![F_納品書吐き出し]![txt1得意先]") = Forms!F_納品書吐き出し!txt1得意先
Set rs = qd.OpenRecordset
If Not rs.RecordCount = 0 Then
'Excel
'オブジェクトの作成
Set xlApp = CreateObject("Excel.Application")
'ファイルを開く→絶対パスで!
Set xlWb = xlApp.Workbooks.Open("\NAS\share\作業管理\各種書類テンプレ\納品書.xltx")
'シートをセット
Set xlWs = xlWb.Worksheets("納品書")
xlApp.Visible = True
'セルを指定してレコードセットを張り付け
'エクセルシートは独自の形をしているので分割して吐き出そう・・・・
'**********************************************************************************************************
'セル位置は(Y,X)で表記しよう!!!
'業者名・担当者・発行日・納品書ナンバー
xlWs.Range("C8").MergeArea = rs("得意先")
'xlWs.range("M6") = rs("") 担当者はベタ打ちらしい!
xlWs.Range("H3").MergeArea = Date
xlWs.Range("L1").MergeArea = rs("最新納品書発行番号")
'番号・型番・製造番号・修理内容・修理金額
'ループさせながらクエリをエクセルへ貼り付けるよ!
With rs
'レコードの終端をループの最後にするために取得します
'→Do Loopは時間がかかりすぎたので、ForNext作戦・・・・
.MoveLast
endrc = .RecordCount
.MoveFirst
'開始地点セルはC19セルなので・・・
x1 = 3
y1 = 19
i = 0
For i = 1 To endrc
xlWs.Cells(y1, x1) = rs("管理番号")
xlWs.Cells(y1, x1 + 1) = rs("メーカー名")
xlWs.Cells(y1, x1 + 2) = rs("型番")
xlWs.Cells(y1, x1 + 3) = rs("製造番号")
xlWs.Cells(y1, x1 + 4) = rs("修理内容")
xlWs.Cells(y1, x1 + 5) = rs("金額(税抜)")
rs.MoveNext
y1 = y1 + 1
Next
End With
'見栄えの修正
ActiveSheet.Activate
Dim 行 As Long
行 = 0
行 = Range("C38").End(xlUp).Row
行 = 行 + 4
Rows(行 & ":" & 38).Delete
Range("J13").Select
'**********************************************************************************************************
重要なポイントは、 Excel の最上位オブジェクトである
Excel.Application オブジェクトへの参照をオブジェクト変数に保持し、
そのメンバーや下位のオブジェクトを明示的に参照できるような
コードを記述する、ということです。
これは、私のコードでは貼り付けまでは、「xlWs」で流用しているが、
range段階ではアクティブシートにしているのがまずい・・・
という解釈でよろしいでしょうか。
ただ、それでは私の一番の疑問である「なぜ必ず2回に1回だけエラーなのか」が不思議です・・・
rangeもxlWsで記述は試していないので明日、試して見ます。
また、共有モードであれば多人数で開けますとネットや解説書では見ますが
こちらもなぜか7と2007の組み合わせではできず困っております・・・