' โปรแกรมย่อยที่ใช้ในการพิมพ์จดหมายเวียน (Mail Merge)
Private Sub cmdMailMerge_Click()
Dim ConnStr As String
Dim Statement As String
Dim FileTemp As String
Dim FileSaveAs As String
'On Error Resume Next
On Error GoTo ErrHandler
If Trim(txtTemplate.Text) = "" Or Len(Trim(txtTemplate.Text)) = 0 Then
MsgBox "กรุณาเลือกไฟล์ต้นแบบ (Template) ในการทำจดหมายเวียนให้เรียบร้อยก่อนด้วย.", _
vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
Exit Sub
End If
' ข้อมูลในการพิมพ์ ... กรณีนำไปใช้งานจริง ควรทำ Query เพื่อเลือกเฉพาะรายการที่ต้องการ
Statement = "SELECT * FROM tblCustomer ORDER BY CustomerPK "
' สร้างไฟล์ชั่วคราว และกำหนดรูปแบบ เช่น Temp-วันเดือนปี-ชั่วโมงนาทีวินาที
' ที่ต้องสร้างไฟล์นี้ก็เพราะต้องป้องกันความผิดพลาด ที่อาจจะมีผลกระทบกับไฟล์ต้นแบบ
' พี่น้อง ... อยากได้รูปแบบไหนก็กำหนดเอาเองตามใจชอบของท่านเถิดครับ
FileTemp = "Temp-" & Format(Date, "ddmmyyyy") & "-" & Format(Time, "hhmmss") & ".Doc"
Set WordApp = New Word.Application
' เริ่มการติดต่อกับ Word
WordApp.Application.Visible = True
' คัดลอกไฟล์ต้นแบบ หรือ ต้นฉบับ ไปยังไฟล์ชั่วคราวที่ต้องการแสดงผล
Call APIFileCopy(txtTemplate, ApplicationPath & FileTemp)
 MS Word Document Template
' เปิด Document Template (ไฟล์ MS Word ต้นแบบ)
WordApp.Documents.Open ApplicationPath & FileTemp
' กำหนดไฟล์ฐานข้อมูล
ConnStr = ApplicationPath & "DataBase.MDB"
' ให้ MS Word ติดต่อกับฐานข้อมูล พร้อมกับระบุด้วยว่าจะทำจดหมายเวียน (Mail Merge)
With WordApp.ActiveDocument.MailMerge
.MainDocumentType = wdNotAMergeDocument
.MainDocumentType = wdFormLetters
' รูปแบบการเชื่อมต่อไฟล์ฐานข้อมูล ... ยกมาให้ครบชุดเผื่อเอาไว้ใช้งานอื่นกันไปเลย ... เหอๆๆๆๆ
.OpenDataSource Name:=ConnStr, SQLStatement:=Statement, _
ConfirmConversions:=False, ReadOnly:=True, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, SQLStatement1:="", _
OpenExclusive:=True, SubType:=wdMergeSubTypeAccess
' ส่งข้อมูลออกไปให้ MS Word
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
' ไม่ต้องหยุด ให้แสดงผลไปให้หมดเลย
.Execute Pause:=False
End With
 เมื่อสั่ง Run เพื่อให้ Mail Merge ทำงาน
' เตรียมตั้งชื่อไฟล์เอกสารใหม่ เพื่อคัดลอก FileTemp ไปยังไฟล์ใหม่
' หากไม่ใช้วิธีการนี้ผมพบว่าจะทำให้เกิด Run-Time Error 5174 หรือ ไม่สามารถเปิดไฟล์ Mail Merge ได้เลย
FileSaveAs = "MailMerge"
FileSaveAs = ApplicationPath & FileSaveAs & "-" & _
Format(Date, "ddmmyyyy") & "-" & _
Format(Time, "hhmmss") & ".doc"
' บันทึกไฟล์เป็น (Save As) ให้ไฟล์เอกสารใหม่
' นั่นคือ การเปลี่ยนชื่อไฟล์จาก ...
' Temp-วันเดือนปี-ชั่วโมงนาทีวินาที (หรือ Documents.item(1)) ... มาเป็น
' MailMerge-วันเดือนปี-ชั่วโมงนาทีวินาที (หรือ Documents.item(2))
WordApp.Documents.Item(1).SaveAs FileSaveAs
' สั่งปิดไฟล์ให้หมด และไม่ต้อง Save As ไฟล์เอกสาร ...
' ไฟล์จะปิดเองโดยอัตโนมัติ และไม่ต้องมาถามให้กวนใจอีกว่าจะ Save หรือไม่
' หากไม่สั่งปิดจะเกิด Run-Time Error 70 หรือ Permission Denied
WordApp.Documents.Item(2).Close False ' ชื่อไฟล์: MailMerge-วันเดือนปี-ชั่วโมงนาทีวินาที
WordApp.Documents.Item(1).Close False ' ชื่อไฟล์: Temp-วันเดือนปี-ชั่วโมงนาทีวินาที
' แสดงผล MS Word ใหม่อีกครั้ง ...
WordApp.Application.Visible = True
' เปิด MS Word (ไฟล์ใหม่ที่บันทึก)
WordApp.Documents.Open FileSaveAs
ExitProc:
' คืนค่าหน่วยความจำให้กับระบบปฏิบัติการ
Set WordApp = Nothing
' ลบไฟล์ชั่วคราว (Temporary) ออกไปด้วยคำสั่ง Kill
If Dir$(ApplicationPath & FileTemp) <> "" Then Kill ApplicationPath & FileTemp
'MsgBox "ทำการสร้างจดหมายเวียน (Mail Merge) เรียบร้อยแล้ว." & vbCrLf & vbCrLf & _
"ชื่อไฟล์ : " & FileSaveAs, vbOKOnly + vbInformation, "รายงานสถานะ"
End ' หรือ Exit Sub
ErrHandler:
MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
Resume ExitProc
End Sub
|