불행하게도, 일부 데이터 소스, 말씀은 -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에서 정확히 얼마나 많은 레코드가 각 병합에서 사용되었는지 감지 할 수있는 방법이 명확하지 않습니다.