2016-06-20 4 views
0

나는 단어 메일에 대한 데이터 소스를 통해 이동하려고 문서를 합병했다. 편지 병합 데이터 소스를 통해 실행Word 편지 병합도 RecordCount -1을 반환

내 코드는 다음과 같습니다

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

지금 모든 것이 정말 잘 작동합니다. 데이터 소스를 실행하고 필요한 작업을 수행합니다.

지금 내가이 제작하고 사용자가 작은 도우미 함수 사용으로 인해 다른 이유입니다 : 메일 합병 도우미를 (그것이 2010 년 워드에 존재)

그들은이 있지만, 내 ActiveDocument.MailMerge를 사용하는 경우 .DataSource.RecordCount는 -1을 반환합니다. 즉, 데이터 소스의 레코드 수를 결정할 수 없습니다. 내 가정은 메일 합병 도우미가 데이터 소스를 올바르게 설정하지 않는다는 것입니다.

그러나이 편지 병합을 반복에서 저를 방지 (그는이 도우미를 사용하는 경우, 그는 여전히 병합의 결과를보고 같은 일반적인 편지 병합 기능을 활성화 할 수 있습니다).

무엇이 잘못 되었나요? 병합을 반복하는 대신에 레코드를 하나씩 얻을 수 있습니까?

답변

5

감사합니다. bibadia, 당신은 올바른 길로 나를 안내합니다.

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

불행하게도, 일부 데이터 소스, 말씀은 -1로도 RecordCount를 설정 않습니다. 어떤 경우에는, 그는 ADO를 사용하여 말씀의 결과 일 수있다/당신은 ADO를 사용하여 레코드 집합을 검색 할 때 OLE DB 연결은, 예를 들어, 당신은 때때로 실제 레코드 수를 검색 할 .MoveLast를 사용하기 때문에, 심지어 그에 따라 다릅니다 ADO 커서 유형 및 기타 ADO 설정 그러나 Excel Word에 DDE 연결의 경우에도 -1 레코드 수를 반환 할 수 있습니다.

은 당신이 할 수있을 필요가 정확히 무엇을 완전히 명확하지 않았다, 그러나 어떤 경우에는 레코드 수보다 큰 숫자에

theDoc.MailMerge.DataSource.ActiveRecord 

을 설정하여 현재 가장 큰 레코드 번호를 설정할 수 있습니다. 당신이 할 수있는 최선의 방법이 무엇인지 의심합니다.

theDoc.MailMerge.DataSource.ActiveRecord = 2147483647# 

그러나 나는 그것만으로는 충분하지 않다. 데이터 소스가 다중 사용자 데이터베이스 인 경우 한 가지 들어, 레코드 카운트가 그래서 대부분의 경우에 생각했을 있지만 실제로 (작동하지 않을 수 있습니다 시작 부분에 .lastrecord 설정, 병합 중 변경 될 수 있다는 상상할 수없는 , 실제로 트랜잭션에서 레코드를 검색하고 처리하는 경우, 전체 레코드에서 동일한 레코드 세트를 볼 수 있습니다. 각 반복에서 .ActiveRecord를 증가 시키면 그 가능성을 처리 할 수 ​​있습니다. 레코드의 끝에 도달하면 .ActiveRecord가 증가하지 않습니다. Windows Word에서는받는 사람 목록 편집 대화 상자를 통해 개별 레코드를 제외 할 수도 있습니다. 당신이 .ActiveRecord를 증가하려고 할 때이 경우, 실제로는 다음 포함/선정 기록으로 건너 뜁니다 (있는 경우) 및 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 

. {NEXT}와 같은 필드가 있으면 iteration 당 여러 레코드를 소비 할 수 있습니다. 몇 개를 알고 있으면 관련 레코드 수를 건너 뛸 수 있습니다. 숫자가 다를 수있는 경우 (예 : {NEXTIF} 문을 통해) VBA에서 정확히 얼마나 많은 레코드가 각 병합에서 사용되었는지 감지 할 수있는 방법이 명확하지 않습니다.