Mình cũng thử các loại code rồi nhưng khi xuất ra file nhỏ không ra kết quả như mong đợi. mình muốn tách từng file mỗi file ghi tên của người trong quyết định và vẫn giữ được thể thức văn bản
Nhờ GPE giúp mình file gửi kèm. mình đã thử các loại code trên lick bạn cho cung cấp rồi nhưng khi xuất ra file nhỏ không ra kết quả như mong đợi. mình muốn tách từng file mỗi file mỗi trang ghi tên của người trong quyết định và vẫn giữ được thể thức văn bản
Nhờ GPE giúp mình file gửi kèm. mình đã thử các loại code trên lick bạn cho cung cấp rồi nhưng khi xuất ra file nhỏ không ra kết quả như mong đợi. mình muốn tách từng file mỗi file mỗi trang ghi tên của người trong quyết định và vẫn giữ được thể thức văn bản
2/ Lý ra ngay từ đầu chỉ vẽ 1 trang duy nhất thôi rồi dùng trộn thư (Mail merge).
Nếu có bảng dữ liệu thì giờ làm trộn thư vẫn rất tốt so với tách trang, tách file.
File trên là mình trộn thư rồi nhưng tách ra mỗi trang 1 file lâu quá. Mình gửi file dữ liệu nhờ GPE trộn mà không phải tách trang nhưng file tách ra có tên như trong danh sách, không thay đổi thể thức của văn bản
2/ Lý ra ngay từ đầu chỉ vẽ 1 trang duy nhất thôi rồi dùng trộn thư (Mail merge).
Nếu có bảng dữ liệu thì giờ làm trộn thư vẫn rất tốt so với tách trang, tách file.
File trên là mình trộn thư rồi nhưng tách ra mỗi trang 1 file lâu quá. Mình gửi file dữ liệu nhờ GPE trộn mà không phải tách trang nhưng file tách ra có tên như trong danh sách, không thay đổi thể thức của văn bản
1. Dùng Bookmark.
Tạo tập tin Word mẫu chỉ có 1 trang. Ở những chỗ mà khi trộn thư bạn chèn các trường từ Excel thì bây giờ bạn chèn bookmark. Vd. sau khi viết xong
"Điều 1. Nâng bậc lương thường xuyên cho ông (bà) " thì Insert -> bookmark -> bookmark name = hoten -> Add
Làm tương tự cho các chỗ khác. Sau cùng thì lưu lại tập tin mẫu.
Trong trường hợp này code sẽ mở tập tin mẫu -> đọc dòng đầu trong Excel -> bắn dữ liệu vào các bookmark -> lưu lại với tên đọc từ Excel -> đọc dòng tiếp theo trong Excel -> bắn dữ liệu vào các bookmark -> lưu lại với tên đọc từ Excel -> cứ như thế cho tới hết dữ liệu trong Excel.
2. Dùng tập tin kết quả của trộn thư như tập tin đính kèm ở bài #1.
Mở tập tin nguồn -> Alt + F11 -> insert -> Module -> dán code ở sau rồi chạy:
Lưu ý: code sẽ tách từng trang thành từng tập tin và lưu. Code sẽ tìm lần xuất hiện đầu tiên của "(b?)" và lấy đoạn sau nó làm tên tập tin để lưu. Trong tập tin nguồn của bạn sau đoạn "Điều 1. Nâng bậc lương thường xuyên cho ông " sẽ có "(bà)", và code sẽ lấy đoạn sau là "Lê Thị Thu Dung" để làm tên tập tin. Như thế thì không cần dùng tập tin Excel.
Tất nhiên code tách từng trang không chỉ làm việc với dạng tập tin như của bạn nên nếu là tập tin khác mà không có "(b?)" thì code sẽ lưu với các tên 1.docx, 2.docx, ...
Code dán vào module để chạy
Mã:
Sub PageToFile()
Dim start As Long, PagesCount As Long, currPage As Long, filename As String
Dim doc As Document
Application.ScreenUpdating = False
currPage = 1
PagesCount = ThisDocument.Range.Information(wdNumberOfPagesInDocument)
Do While currPage <= PagesCount
If currPage = PagesCount Then
Selection.End = ThisDocument.Range.End
Else
Selection.GoTo wdGoToPage, wdGoToAbsolute, currPage + 1
End If
Selection.start = start
Selection.End = Selection.End - 1
Selection.Copy
With Documents.Add
Selection.PasteAndFormat (wdPasteDefault)
Selection.End = 0
filename = ""
With Selection.Find
.MatchWildcards = True
.text = "\(b?\)"
If .Execute Then
Selection.Collapse wdCollapseEnd
Selection.MoveEnd wdLine
filename = Trim(Left(Selection.text, InStr(1, Selection.text, vbCr) - 1))
End If
End With
If Len(filename) = 0 Then filename = currPage
.SaveAs2 ThisDocument.Path & "\" & filename & ".docx"
.Close
End With
currPage = currPage + 1
start = Selection.End + 1
Loop
Application.ScreenUpdating = True
End Sub
Cái người ta trình bầy là phải có các Heading (chèn bằng cách: Home -> mục Styles -> Heading 1). Mỗi Heading cùng với các dòng text đi kèm sẽ được ghi thành 1 tập tin.
Tập tin từ trộn thư của tác giả không có Heading. Nếu làm theo cách này thì hoặc chèn cho mỗi trang một Heading (số trang ít) hoặc dùng code để chèn (số trang nhiều). Sau đó mới thử như hướng dẫn.
Bài đã được tự động gộp:
Có nhiều cách làm trong đó có:
1. Dùng Bookmark.
Tạo tập tin Word mẫu chỉ có 1 trang. Ở những chỗ mà khi trộn thư bạn chèn các trường từ Excel thì bây giờ bạn chèn bookmark. Vd. sau khi viết xong
"Điều 1. Nâng bậc lương thường xuyên cho ông (bà) " thì Insert -> bookmark -> bookmark name = hoten -> Add
Làm tương tự cho các chỗ khác. Sau cùng thì lưu lại tập tin mẫu.
Trong trường hợp này code sẽ mở tập tin mẫu -> đọc dòng đầu trong Excel -> bắn dữ liệu vào các bookmark -> lưu lại với tên đọc từ Excel -> đọc dòng tiếp theo trong Excel -> bắn dữ liệu vào các bookmark -> lưu lại với tên đọc từ Excel -> cứ như thế cho tới hết dữ liệu trong Excel.
2. Dùng tập tin kết quả của trộn thư như tập tin đính kèm ở bài #1.
Mở tập tin nguồn -> Alt + F11 -> insert -> Module -> dán code ở sau rồi chạy:
Lưu ý: code sẽ tách từng trang thành từng tập tin và lưu. Code sẽ tìm lần xuất hiện đầu tiên của "(b?)" và lấy đoạn sau nó làm tên tập tin để lưu. Trong tập tin nguồn của bạn sau đoạn "Điều 1. Nâng bậc lương thường xuyên cho ông " sẽ có "(bà)", và code sẽ lấy đoạn sau là "Lê Thị Thu Dung" để làm tên tập tin. Như thế thì không cần dùng tập tin Excel.
Tất nhiên code tách từng trang không chỉ làm việc với dạng tập tin như của bạn nên nếu là tập tin khác mà không có "(b?)" thì code sẽ lưu với các tên 1.docx, 2.docx, ...
Code dán vào module để chạy
Mã:
Sub PageToFile()
Dim start As Long, PagesCount As Long, currPage As Long, filename As String
Dim doc As Document
Application.ScreenUpdating = False
currPage = 1
PagesCount = ThisDocument.Range.Information(wdNumberOfPagesInDocument)
Do While currPage <= PagesCount
If currPage = PagesCount Then
Selection.End = ThisDocument.Range.End
Else
Selection.GoTo wdGoToPage, wdGoToAbsolute, currPage + 1
End If
Selection.start = start
Selection.End = Selection.End - 1
Selection.Copy
With Documents.Add
Selection.PasteAndFormat (wdPasteDefault)
Selection.End = 0
filename = ""
With Selection.Find
.MatchWildcards = True
.text = "\(b?\)"
If .Execute Then
Selection.Collapse wdCollapseEnd
Selection.MoveEnd wdLine
filename = Trim(Left(Selection.text, InStr(1, Selection.text, vbCr) - 1))
End If
End With
If Len(filename) = 0 Then filename = currPage
.SaveAs2 ThisDocument.Path & "\" & filename & ".docx"
.Close
End With
currPage = currPage + 1
start = Selection.End + 1
Loop
Application.ScreenUpdating = True
End Sub