Sao chép một loạt các trang trong Macro (Microsoft Word)
Kevin tự hỏi liệu có cách nào, trong VBA, để sao chép một loạt các trang. Anh ta biết cách sao chép các đoạn văn và một phạm vi văn bản liền kề, nhưng anh ta không biết cách sao chép toàn bộ trang.
Không có đối tượng VBA nào tham chiếu đến toàn bộ trang, chẳng hạn như có với một đoạn văn, cũng như không có câu lệnh VBA nào cho phép bạn chọn một trang. Tuy nhiên, bạn có thể tính toán những gì sẽ bao gồm một trang và sau đó chọn phạm vi đó. Khái niệm chung được hiển thị trong macro này:
Sub CopyPages1() Dim rCopy As Range Set rCopy = ActiveDocument.GoTo(What:=wdGoToPage, _ Which:=wdGoToAbsolute, Count:=7) Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=9 rCopy.End = Selection.Bookmarks("\Page").Range.End rCopy.Select End Sub
Macro này đặt phạm vi rCopy bằng với điểm bắt đầu trang 7.
Sau đó, nó chọn văn bản ở đầu trang 9 và sử dụng một trong các dấu trang cài sẵn của Word để chọn từ đầu trang 7 đến cuối trang 9. (Đó là những gì macro này được thiết kế để làm — chọn trang 7 qua 9.)
Tuy nhiên, bạn cần lưu ý rằng các trang rất linh hoạt trong Word. Nếu bạn sử dụng chính xác cùng một tài liệu trên hai hệ thống khác nhau, macro trên rất có thể trả về các lựa chọn hoàn toàn khác nhau. Tại sao? Bởi vì các trang có thể chảy khác nhau trên mỗi hệ thống.
Nếu bạn thực sự muốn sao chép các trang đã chọn (từ 7 đến 9), thì bạn có thể sửa đổi macro một chút để có được kết quả mong muốn.
Sub CopyPages2() Dim rCopy As Range Dim rCurrent As Range Set rCurrent = Selection.Range Set rCopy = ActiveDocument.GoTo(What:=wdGoToPage, _ Which:=wdGoToAbsolute, Count:=7) Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=9 rCopy.End = Selection.Bookmarks("\Page").Range.End rCopy.Copy Documents.Add ActiveDocument.Range.PasteSpecial rCurrent.Select End Sub
Lưu ý rằng macro “ghi nhớ” những gì người dùng đã chọn trước khi nó được chạy, lưu trữ phạm vi trong biến rCurrent và sử dụng nó để chọn lại khu vực đó ở cuối macro. Các trang đã chọn (một lần nữa, từ 7 đến 9) được sao chép sang một tài liệu hoàn toàn mới.
Bạn cần lưu ý rằng các macro trên chỉ hoạt động bình thường nếu thực sự có ít nhất 9 trang trong tài liệu hiện tại. Nếu bạn muốn một macro linh hoạt và mạnh mẽ hơn, bạn có thể xem xét biến thể sau.
Sub CopyPages3() Dim rCopy As Range Dim rCurrent As Range Dim sTemp As String Dim i As Integer Dim iStart As Integer Dim iEnd As Integer Set rCurrent = Selection.Range ' Get page numbers to be copied sTemp = InputBox("Page range to copy (use format 6-7)", "") i = InStr(sTemp, "-") If i > 0 Then iStart = Val(Left(sTemp, i - 1)) iEnd = Val(Mid(sTemp, i + 1)) If iStart < 1 Then iStart = 1 If iEnd < iStart Then iEnd = iStart With ActiveDocument.Range If iStart > .Information(wdNumberOfPagesInDocument) Then iStart = .Information(wdNumberOfPagesInDocument) End If If iEnd > .Information(wdNumberOfPagesInDocument) Then iEnd = .Information(wdNumberOfPagesInDocument) End If End With ' Set the range Set rCopy = ActiveDocument.GoTo(What:=wdGoToPage, _ Which:=wdGoToAbsolute, Count:=iStart) Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, _ Count:=iEnd rCopy.End = Selection.Bookmarks("\Page").Range.End ' Copy range to a new document rCopy.Copy Documents.Add ActiveDocument.Range.PasteSpecial rCurrent.Select Else If sTemp > "" Then MsgBox "There is no dash character" End If End If End Sub
Phiên bản này yêu cầu người dùng chỉ định phạm vi trang sẽ được sao chép. Số trang được điều chỉnh để đảm bảo rằng số bắt đầu nhỏ hơn hoặc bằng số kết thúc và cả số bắt đầu và số kết thúc đều được đảm bảo nhỏ hơn tổng số trang trong tài liệu.
_Lưu ý: _
Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên các trang WordTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.
WordTips là nguồn của bạn để đào tạo Microsoft Word hiệu quả về chi phí.
(Microsoft Word là phần mềm xử lý văn bản phổ biến nhất trên thế giới.) Mẹo này (5295) áp dụng cho Microsoft Word 2007, 2010, 2013, 2016, 2019 và Word trong Office 365.