2016-06-20 42 views
0

単語の差し込み印刷文書のデータソースを調べようとしています。Wordの差し込み印刷レコード数が-1を返します

ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord 
lastDoc = ActiveDocument.MailMerge.DataSource.RecordCount 

今、すべてが本当にうまく機能:差し込み印刷のデータソースを介して実行する

私のコードは次のようになります。私はデータソースを実行し、私は何をする必要があります。

今小さなヘルパー関数を使用して、他の理由による私はこれを作っていますユーザーである、:メール合併ヘルパー(これは、Word 2010に存在する)

彼らはしかし、これを使用すると、私のActiveDocument.MailMerge .DataSource.RecordCountは-1を返します。これは、データソース内のレコード数を決定できないことを意味します。私の前提は、Mail Merger Helperがデータソースを正しく設定していないことです。

しかし、それは私が(ヘルパーを使用するとき、彼はまだマージの結果を見るなどの通常の差し込み印刷機能を有効にすることができます)、差し込み印刷を反復するのを防ぎます。

どうしたのですか?マージを反復する代わりに、レコードを1つずつ取得できますか?

答えて

5

ビバディアありがとう、あなたは私を正しい道に導きます。

ActiveRecordをwdLastRecordに設定すると、 ActiveRecordの最後のデータソースを読み取ることができます。だから私はそれをつかんで、ActiveRecordをwdFirstRecordに再び設定する必要がありました。

Dim count As Integer 

ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord 
count = ActiveDocument.MailMerge.DataSource.ActiveRecord 
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord 
0

一部のデータソースでは、WordはRecordCountを-1に設定します。場合によっては、ADO/OLE DB接続を使用するWordの結果である場合があります。たとえば、ADOを使用してRecordSetを取得すると、.MoveLastを使用して実際のレコード数を取得する必要があります。 ADOカーソルタイプとその他のADO設定ただし、DDEをExcelに接続しても、Wordは-1のレコード数を返します。

私はあなたが行うことができるように必要な正確に何を完全には明らかではなかったが、いくつかのケースでは、あなたはレコード数よりも大きい任意の数に

theDoc.MailMerge.DataSource.ActiveRecord 

を設定することで、最大の現在のレコード番号を確立することができます。私ができると思うのは、最高だと思っています

theDoc.MailMerge.DataSource.ActiveRecord = 2147483647# 

しかし、私はそれだけでも十分であるとは確信していません。 1つは、データソースがマルチユーザーデータベースの場合、マージ中にレコード数が変化することは考えられないため、最初は.lastrecordを設定しても機能しない場合があります(ほとんどの場合、実際には、トランザクション内のレコードを取得して処理することになります。この場合、常に同じレコードセットが表示されます)。各反復で.ActiveRecordをインクリメントしようとすると、その可能性に対処できます。レコードの最後に達した場合、.ActiveRecordは増加しません。 WindowsのWordでは、ユーザーがEdit Recipient Listダイアログで個々のレコードを除外できる可能性も考慮する必要があります。その場合、.ActiveRecordをインクリメントしようとすると、実際には次のIncluded/Selectedレコード(存在する場合)にスキップされ、Wordでエラーが発生する可能性があります。したがって、以下はWindows Wordで私が知っているすべての可能性をコード化する方法を示しています。 (この特定のバージョンはしかし、テストされていません):

Sub MailMergeOneThingPerDataSourceRecord() 
Dim lngSourceRecord As Long 
Dim objMerge As Word.MailMerge 
Dim bError As Boolean 
Dim bTerminateMerge As Boolean 
Set objMerge = ActiveDocument.MailMerge 
bError = False 
bTerminateMerge = False 
With objMerge 
    lngSourceRecord = 1 
    Do Until bTerminateMerge 
    On Error Resume Next 
    .DataSource.ActiveRecord = lngSourceRecord 
    If Err.Number = 0 Then 
     On Error GoTo 0 
     If .DataSource.ActiveRecord < lngSourceRecord Then 
     bTerminateMerge = True 
     Else 
     lngSourceRecord = .DataSource.ActiveRecord 
     .DataSource.FirstRecord = lngSourceRecord 
     .DataSource.LastRecord = lngSourceRecord 
     .Destination = wdSendToNewDocument 
     .Execute 
     lngSourceRecord = lngSourceRecord + 1 
     End If 
    Else 
     bTerminateMerge = True 
     If Err.Number <> 5853 Then 
     bError = True 
     End If 
    End If 
    Loop 
End With 
If bError Then 
    ' deal with the error (you may prefer to do your error 
    ' handling some other way) but e.g.... 
    MsgBox "Error " & Err.Number & ": " & Err.Description 
End If 
Set objMerge = Nothing 
End Sub 

しかし、唯一本当にあなたがメールのメイン文書をマージすることを知っている場合のみ、一度に1つのデータソースレコードを消費動作すること。 {NEXT}のようなフィールドがある場合、反復ごとに複数のレコードを消費する可能性があります。あなたがいくつ知っている場合は、関連するレコード数をスキップすることができます。数値が変わる可能性がある場合(たとえば、{NEXTIF}文など)、VBAで各マージで消費されたレコードの数を正確に検出する方法は明白ではありません。

関連する問題