Khắc phục sự cố mã trộn VBA Excel sang Word
Tôi có đoạn mã VBA Excel bên dưới để hợp nhất dữ liệu từ trang tính Excel có tên "PatientReport" vào mẫu Word có tên "PatientReportTemplate". Đoạn mã hoạt động tốt với việc hợp nhất và xuất ra một tài liệu Word chứa dữ liệu nguồn từ trang tính Excel. Tuy nhiên, nếu người dùng cố gắng chạy lại đoạn mã trong khi tài liệu Word vẫn đang mở, nó sẽ dừng lại và báo lỗi (tôi đoán là do mẫu đã bị khóa để người dùng khác sử dụng). Bất kỳ sự trợ giúp nào về việc sửa đổi mã để khắc phục sự cố như vậy đều được đánh giá cao (Tôi rất biết ơn nếu bạn vui lòng giải thích những sửa đổi mã VBA sẽ làm gì đối với mẫu Word và tài liệu đã hợp nhất; ?? có thể sửa đổi để tự động lưu tài liệu đã hợp nhất sau khi hợp nhất thành tệp .doc theo cùng đường dẫn của mẫu Word với cùng tên + ngày + phần mở rộng sao chép #, và giải phóng tệp mẫu Word để sử dụng cho mục đích khác nếu cần)?
Cảm ơn
--------------------------------------------------
Tùy chọn rõ ràng
Const PatientReportPath = "\PatientReportTemplate.docx"
Sub GetPatientReportByMerge()
Làm mờ wd như đối tượng
Làm mờ wdocSource thành Đối tượng
Dim strWorkbookName dưới dạng chuỗi
Ứng dụng.ScreenUpdating = Sai
Tiếp tục lỗi tiếp theo
Đặt wd = GetObject(, "Word.Application")
Nếu wd không là gì thì
Đặt wd = CreateObject("Word.Application")
Kết thúc nếu
Khi lỗi GoTo 0
Nếu Dir(ThisWorkbook.Path & PatientReportPath) <> "" Thì
Đặt wdocSource = wd.Documents.Open(ThisWorkbook.Path & PatientReportPath)
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdocSource.MailMerge.MainDocumentType = wdFormLetters
wdocSource.MailMerge.OpenDataSource _
Tên: = strWorkbookName, _
AddToRecentFiles:=False, _
Hoàn nguyên:=Sai, _
Định dạng:=wdOpenFormatAuto, _
Kết nối:="Nguồn dữ liệu=" & strWorkbookName & ";Chế độ=Đọc", _
SQLStatement:="SELECT * FROM `PatientReport$` WHERE(`Name` KHÔNG NULL và `Name` <>'')"
Với wdocSource.MailMerge
.Điểm đến = wdSendToNewDocument
.SuppressBlankLines = Đúng
Với .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
Kết thúc bằng
.Thực hiện tạm dừng:=Sai
Kết thúc bằng
wd.Visible = Đúng
wdocSource.Đóng Lưu thay đổi:=Sai
Đặt wdocSource = Không có gì
wd.Kích hoạt
Đặt wd = Không có gì
Khác
MsgBox "Tệp ' " & ThisWorkbook.Path & PatientReportPath & "' không tồn tại!"
Kết thúc nếu
Application.ScreenUpdating = Đúng
Kết thúc phụ đề
Trả lời:
Nếu PatientReportTemplate thực sự là một Mẫu theo thuật ngữ được sử dụng trong Word, thì bạn nên sử dụng
Đặt wdocSource = wd.Documents.Add(ThisWorkbook.Path & PatientReportPath)
còn hơn là
Đặt wdocSource = wd.Documents.Open(ThisWorkbook.Path & PatientReportPath)
-- Hy vọng thông tin này hữu ích.
Doug Robbins - MVP của Word,
dkr[atsymbol]mvps[dot]org
Đăng qua Cầu Cộng đồng
"WissamK" đã viết trong tin nhắn tin tức:*** Địa chỉ email đã bị xóa vì lý do riêng tư ***...
Tôi có đoạn mã VBA Excel bên dưới để hợp nhất dữ liệu từ trang tính Excel có tên "PatientReport" vào mẫu Word có tên "PatientReportTemplate". Đoạn mã hoạt động tốt với việc hợp nhất và xuất ra một tài liệu Word chứa dữ liệu nguồn từ trang tính Excel. Tuy nhiên, nếu người dùng cố gắng chạy lại đoạn mã trong khi tài liệu Word vẫn đang mở, nó sẽ dừng lại và báo lỗi (tôi đoán là do mẫu đã bị khóa để người dùng khác sử dụng). Bất kỳ sự trợ giúp nào về việc sửa đổi mã để khắc phục sự cố như vậy đều được đánh giá cao (Tôi rất biết ơn nếu bạn vui lòng giải thích những sửa đổi mã VBA sẽ làm gì đối với mẫu Word và tài liệu đã hợp nhất; ?? có thể sửa đổi để tự động lưu tài liệu đã hợp nhất sau khi hợp nhất thành tệp .doc theo cùng đường dẫn của mẫu Word với cùng tên + ngày + phần mở rộng sao chép #, và giải phóng tệp mẫu Word để sử dụng cho mục đích khác nếu cần)?
Cảm ơn
--------------------------------------------------
Tùy chọn rõ ràng
Const PatientReportPath = "\PatientReportTemplate.docx"
Sub GetPatientReportByMerge()
Làm mờ wd như đối tượng
Làm mờ wdocSource thành Đối tượng
Dim strWorkbookName dưới dạng chuỗi
Ứng dụng.ScreenUpdating = Sai
Tiếp tục lỗi tiếp theo
Đặt wd = GetObject(, "Word.Application")
Nếu wd không là gì thì
Đặt wd = CreateObject("Word.Application")
Kết thúc nếu
Khi lỗi GoTo 0
Nếu Dir(ThisWorkbook.Path & PatientReportPath) <> "" Thì
Đặt wdocSource = wd.Documents.Open(ThisWorkbook.Path & PatientReportPath)
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdocSource.MailMerge.MainDocumentType = wdFormLetters
wdocSource.MailMerge.OpenDataSource _
Tên: = strWorkbookName, _
AddToRecentFiles:=False, _
Hoàn nguyên:=Sai, _
Định dạng:=wdOpenFormatAuto, _
Kết nối:="Nguồn dữ liệu=" & strWorkbookName & ";Chế độ=Đọc", _
SQLStatement:="SELECT * FROM `PatientReport$` WHERE(`Name` KHÔNG NULL và `Name` <>'')"
Với wdocSource.MailMerge
.Điểm đến = wdSendToNewDocument
.SuppressBlankLines = Đúng
Với .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
Kết thúc bằng
.Thực hiện tạm dừng:=Sai
Kết thúc bằng
wd.Visible = Đúng
wdocSource.Đóng Lưu thay đổi:=Sai
Đặt wdocSource = Không có gì
wd.Kích hoạt
Đặt wd = Không có gì
Khác
MsgBox "Tệp ' " & ThisWorkbook.Path & PatientReportPath & "' không tồn tại!"
Kết thúc nếu
Application.ScreenUpdating = Đúng
Kết thúc phụ đề
Doug Robbins - Word MVP dkr[atsymbol]mvps[dot]org
Trả lời:
Tôi không biết tại sao bạn chỉ nhận được lỗi khi gọi GetPatientReportTable từ RunMerge
Nhưng tôi nghĩ vấn đề là, sổ làm việc đang gọi lệnh hợp nhất cũng là nguồn của dữ liệu hợp nhất. Vì vậy, nó hơi vòng vo.
Có thể tốt hơn nếu sử dụng thủ tục GetPatientReportTable để sao chép dữ liệu thích hợp vào một sổ làm việc mới, lưu và đóng sổ đó.
Sau đó, truyền tên sổ làm việc mới cho RunMerge để sử dụng làm nguồn dữ liệu. Sau khi hoàn tất, hãy xóa nó.
Comments
Post a Comment