VB6で計算したデータをAccess2000に入れ、そのデータをWord2000の差込印刷機能を利用して出力したいのですが、1回目は上手くいくのですが続けて2回目を実行すると実行時エラー’462’【リモートサーバーがないか、使用できる状態ではありません。】と表示されます。
With ActiveDocument.MailMerge '差込印刷の行でエラーが表示されます。
コードの抜粋は以下の通りです。

---ここまででデータを書き込みます。---
Set wdApp = New Word.Application
Set wdDoc = wdApp.Documents

wdDoc.Open FileName~---ここでWordファイルを開きます。---

With ActiveDocument.MailMerge '差込印刷
.Destination = wdSendToNewDocument
.MailAsAttachment = False
.MailAddressFieldName = ""
.MailSubject = ""
.SuppressBlankLines = False
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=True
End With

Windows(wdfile).Activate
ActiveWindow.Close

~SaveAs FileName~'番号を付けて保存を行います。
wdDoc.Close 'Wordを終了させます。
wdApp.Quit
Set wdApp = Nothing
Set wdDoc = Nothing
長々と書いて申し訳ございませんが、よろしくお願いいたします。

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

A 回答 (3件)

もう一度、全部を書き直します。



もしこれでも失敗したら,
wdApp/wdDoc変数の宣言を見せてください。

Public Sub test()
  Dim wdApp  As Word.Application 'アプリケーション変数
  Dim wdDoc  As Word.Document  'ドキュメント変数
  
  Dim strFilePath1  As String  '読み込むドキュメントファイルのフルパス
  Dim strFilePath2  As String  '保存するドキュメントファイルのフルパス
  
  Dim wdfile As String      'ドキュメント名

  
'----- 注意 -----
'ファイル名をプログラムの途中で作成するより、プログラム変数/定数などに最初にセットしてあると、デバッグしやすいです
  '開くドキュメントフルパスを取得
  'strFilePath1 = Combo2.Text & Text8.Text & wdfile
  '保存するドキュメントフルパスを取得
  'strFilePath2 = Combo2.Text & Text9.Text & "\" & Text1.Text & ".DOC"
  strFilePath1 = "c:\test.doc"    'テスト用のドキュメントファイル1(開く用)
  strFilePath2 = "c:\test2.doc"    'テスト用のドキュメントファイル2(保存用)
  
  'デバッグ用(実践では削除してください)
  If vbCancel = MsgBox( _
      "ドキュメントファイル1:" & strFilePath1 & vbNewLine & _
      "ドキュメントファイル2:" & strFilePath2 & vbNewLine & _
      "処理をします。よろしいですか?" _
      , vbOKCancel Or vbQuestion, "ファイル1とファイル2の確認") Then
    Exit Sub
  End If
  
  
  'ワード起動
  Set wdApp = New Word.Application
  
  'ドキュメントを開く
  Set wdDoc = wdApp.Documents.Open( _
      FileName:=strFilePath1, _
      ConfirmConversions:=True, ReadOnly:=False, _
      AddToRecentFiles:=False, PasswordDocument:="", _
      PasswordTemplate:="", Revert:=False, _
      WritePasswordDocument:="", WritePasswordTemplate:="", _
      Format:=wdOpenFormatAuto)
  
  '差込印刷
  With wdDoc
    With .MailMerge
      .Destination = wdSendToNewDocument
      .MailAsAttachment = False
      .MailAddressFieldName = ""
      .MailSubject = ""
      .SuppressBlankLines = False
      With .DataSource
        .FirstRecord = wdDefaultFirstRecord
        .LastRecord = wdDefaultLastRecord
      End With
      .Execute Pause:=True
    End With
  End With
  
  '現在カレントのドキュメント(差し込まれたドキュメント)を保存
  wdApp.ActiveDocument.SaveAs _
      FileName:=strFilePath2, _
      FileFormat:=wdFormatDocument, LockComments:=False, _
      Password:="", AddToRecentFiles:=True, _
      WritePassword:="", ReadOnlyRecommended:=False, _
      EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, _
      SaveFormsData:=False, SaveAsAOCELetter:=False


  '全てのドキュメントを閉じる
  For Each wdDoc In wdApp.Documents
    wdDoc.Close SaveChanges:=False
  Next wdDoc
  
  'ワード終了
  wdApp.Quit
  
  '変数開放
  Set wdDoc = Nothing
  Set wdApp = Nothing
  
  MsgBox "終了"
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。
毎回、丁寧に教えていただいて申し訳ございません。
非常に助かりました。

お礼日時:2001/11/19 16:14

すいません...



For Each wdDoc In wdApp.Documents
wdDoc.Saved = True
wdDoc.Close
Next wdDoc
なのですが、

Set wdDoc = wdApp.Documents
としているところを見ると
Word.Documents
として宣言してるのですね。

たぶん現状ではエラーが起こるかも?
なので、ドキュメンツではなくドキュメント変数を1つ用意してください。
Dim wdDoc2 As Word.Documents ← NG
Dim wdDoc2 As Word.Document ← OK

それで
For Each wdDoc2 In wdApp.Documents
wdDoc2.Saved = True
wdDoc2.Close
Next wdDoc
としてください。

この回答への補足

いつもすいません。上手く行きませんでした。
省略したファイルを開く場合と保存する場合ですが下に書いてある文で行っております。

【ファイルを開く】
Set wdApp = New Word.Application
Set wdDoc = wdApp.Documents

wdDoc.Open FileName:=Combo2.Text & Text8.Text & wdfile, ConfirmConversions:=True, ReadOnly:= _
False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
"", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
Format:=wdOpenFormatAuto

【差込印刷】
Set wdApp = New Word.Application
  ↓
ActiveWindow.Close
 (前述した内容です。)

【ファイル保存】
ChangeFileOpenDirectory Combo2.Text & Text9.Text '番号を付けて保存
ActiveDocument.SaveAs FileName:=Text1.Text & ".DOC", FileFormat:=wdFormatDocument, _
LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False

wdDoc.Close 'Wordを終了させます。 ---以下前述したとおりです。
よろしくお願いいたします。

補足日時:2001/11/19 13:18
    • good
    • 0

全体的なプログラムを見てみないと、正確なことは言えないのですが・・・・


差込印刷を行うと、ドキュメントを閉じるだけでは、完全にはドキュメントを開放されないようです。

なので・・・
>wdDoc.Close 'Wordを終了させます。
>wdApp.Quit
としている部分を
For Each wdDoc In wdApp.Documents
  wdDoc.Saved = True
  wdDoc.Close
Next wdDoc
wdApp.Quit
と変更してみて下さい。
    • good
    • 0

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

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

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

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

QSetとNothingの存在意味?

数値とオブジェクトの変数セットはそれぞれ、
Dim num as integer
num = 5

Dim obj as Object
set obj = new From
set obj = Nothing
ですが、

オブジェクトの場合でインスタンスを生成しない、単なる参照?別名?
の場合はNothingは不要でしょうか?

Dim obj as Object
For x = 1 to 10
set obj = Form2 ' newとインスタンスを生成するのではなく、単なる参照
 obj.Caption = str(x) & "回目"
'set obj = nothingは不要?
Next x

Aベストアンサー

生成したかどうかは、関係ないと思います。


オブジェクトは、「参照カウンタ」と言う情報を持っていて、
何かから参照される(例えば変数に設定されるとか)すると、
このカウンタが+1され、(Nothing等で)参照されなくなると、カウンタが-1されます。
で、カウンタが0になると「誰からも参照されていない」と言う事で、
破棄されます。

昔の古いVB(VB4だかVB5?)で、プロシージャが終了して、
ローカル変数が解放される際に、
この参照カウンタが-1されないと言うバグがあったため(VB6等では直ってます)、
確実にカウンタを-1するための、おまじないとして、明示的に
> set obj = Nothing
を実行する様になりました。

そういう意味で言うと、提示された状況では、
「ループの中で毎回実行する必要は無いにしても、
ループ終了後、1回実行しておいた方が良い」かも・・・
#無くても大丈夫だとは思いますけど・・・

QMaskEdBox.Enable= False だと、BackColor が効きません

MaskEdBox の Enable を False にして、BackColor を設定すると、
BackColor が、有効になりませんでした。
解決方法を教えて下さい。

Aベストアンサー

VBのバージョンは何でしょうか?

VB6のSP3で単純に組んだプログラムでは再現しませんでした。
他の原因も考えられますのでフォームの様子や周辺のソースなど補足してください。

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

QSetやWithについて

C言語とPICのアセンブラは分かるんですが、
VB系は初心者です。

SetやWithの使い方やメリットなど
分かり易く解説していただけますでしょうか

Aベストアンサー

まず、VBには VB6以前とVB.net以降の大きく2つがあります。Excelで使われている VBAや、スクリプトで使われるVBScriptは、どちらかと言えばVB6系です。


Basicでは、 代入は「命令」です。 「 = 演算子による式」であるC言語とは異なります。
正式には Let 変数=値 という Let命令 が代入を行う命令で、 = だけなのは、Letを省略したものです。
VB6では、この他に「オブジェクト」というものがあり、オブジェクトと変数を関連付けるには Let ではなく Set 命令を使います。このSetは省略できません。メリットが無くても、Setを使うしかありません。

VB.net以降では、 オブジェクトの代入にSetを使わなくなりました。
SetはプロパティのSetterの宣言に使用されています。


With は、指定したオブジェクトの要素に簡単にアクセスするためのものです。

objA.fieldA = 0
objA.fieldB = 1
objA.fieldC = 2



With objA
.fieldA = 0
.fieldB = 1
.fieldC = 2
End With

とは、ほぼ等価です。

まず、VBには VB6以前とVB.net以降の大きく2つがあります。Excelで使われている VBAや、スクリプトで使われるVBScriptは、どちらかと言えばVB6系です。


Basicでは、 代入は「命令」です。 「 = 演算子による式」であるC言語とは異なります。
正式には Let 変数=値 という Let命令 が代入を行う命令で、 = だけなのは、Letを省略したものです。
VB6では、この他に「オブジェクト」というものがあり、オブジェクトと変数を関連付けるには Let ではなく Set 命令を使います。このSetは省略できません。メリットが無...続きを読む

QLabel2.visible=false

任意の関数式を入れるとグラフを描くプログラムを作りました。表示するのに時間がかかる(といっても1秒程度ですが)ので「計算中!」と赤で表示させ、グラフが描き終わると消したいと思い、グラフ開始時にLabel2.Visible=True、終了時にLabel2.Visible=Falseを付けましたが、思惑通りには行きません。何故でしょう。おわかりになる方、教えてください。

Aベストアンサー

.NET以降,DoEvents (System.Windows.Forms.Application.DoEventsメソッド) の使用は推奨されません。
DoEventsはVB6までやVBAのような,マルチスレッドが扱えない言語における代替策でしかなく,
長時間かかる処理 (だいたい50ms:WinRT APIにおける非同期処理の目安) を超えるようであれば,その処理はバックグラウンドスレッドで処理すべきです。

VB 2005以降であれば,BackgroundWorkerコンポーネントをFormに配置し,
・Label2.Visible = False後,配置したBackgroundWorkerのRunWorkerAsyncメソッドを呼び出す
・グラフの点の計算をBackgroundWorkerのDoWorkイベントに記述する。
※このイベントの中で,Formのコントロールやコンポーネントに触ることができないので注意して下さい。
・BackgroundWorkerのRunWorkerCompletedイベントで,グラフの描画やLabel2.Visible = Trueを行う。
という方法で処理を行います。
# VB 2012以降で.NET 4.5以降をターゲットとする場合では,Async/Awaitを使う方法が推奨されます。

ref) MSDN: 方法 : バックグラウンドで操作を実行する
http://msdn.microsoft.com/ja-jp/library/hybbz6ke.aspx

.NET以降,DoEvents (System.Windows.Forms.Application.DoEventsメソッド) の使用は推奨されません。
DoEventsはVB6までやVBAのような,マルチスレッドが扱えない言語における代替策でしかなく,
長時間かかる処理 (だいたい50ms:WinRT APIにおける非同期処理の目安) を超えるようであれば,その処理はバックグラウンドスレッドで処理すべきです。

VB 2005以降であれば,BackgroundWorkerコンポーネントをFormに配置し,
・Label2.Visible = False後,配置したBackgroundWorkerのRunWorkerAsyncメソッドを呼び...続きを読む


人気Q&Aランキング

おすすめ情報