VBA trong word

Liên hệ QC

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,192
Được thích
105
Em thấy diễn đàn có nhiều giải pháp trong vba excel, vậy còn word thì sao ạ? Đặt trường hợp mình làm file hợp đồng bằng mail merge (số lượng 200 chẳng hạn). Nhưng mình còn phải xuất file mềm (mỗi người một file). Vậy có cách nào để làm việc đó một cách tự động không ạ?
 
Em thấy diễn đàn có nhiều giải pháp trong vba excel, vậy còn word thì sao ạ? Đặt trường hợp mình làm file hợp đồng bằng mail merge (số lượng 200 chẳng hạn). Nhưng mình còn phải xuất file mềm (mỗi người một file). Vậy có cách nào để làm việc đó một cách tự động không ạ?
1) Mail merge có chức năng xuất ra nhiều kết quả mà bạn, như vậy đã là tự động rồi mà!?
2) Lập trình trong word thì cũng nhấn Alt + F11 và Insert/Module như trong excel.
 
Upvote 0
Em thấy diễn đàn có nhiều giải pháp trong vba excel, vậy còn word thì sao ạ? Đặt trường hợp mình làm file hợp đồng bằng mail merge (số lượng 200 chẳng hạn). Nhưng mình còn phải xuất file mềm (mỗi người một file). Vậy có cách nào để làm việc đó một cách tự động không ạ?
Mạnh thì ứng dụng mỗi cái tiếng việt trong đó thôi ....lâu lâu có làm một Cái Msgbox Thì Record Macro lên Lấy thôi Ví dụ code sau trong Word
Còn code thấy ít người hứng thú với nó
PHP:
Sub Macro1()
'' Macro1 Macro''
    Selection.TypeText Text:="Ki" & ChrW(7873) & "u V" & ChrW(259) & "n M" & _ChrW(7841) & "nh"
End Sub
 
Upvote 0
1) Mail merge có chức năng xuất ra nhiều kết quả mà bạn, như vậy đã là tự động rồi mà!?
2) Lập trình trong word thì cũng nhấn Alt + F11 và Insert/Module như trong excel.

Cách 1 nó gộp hết thành 1file chứ không tách ra.
Cách 2 mình đang nghiên cứu xem có cách nào dùng vòng lặp được không :(
 
Upvote 0
Cách 1 nó gộp hết thành 1file chứ không tách ra.
Cách 2 mình đang nghiên cứu xem có cách nào dùng vòng lặp được không :(
Mình chôm được code này trong VBA express, dùng với Word 2003. Sau khi dùng chức năng merge to new document, bạn lưu file mới lại rồi copy đoạn code vào module của file mới và chạy nó.
Mã:
 Option Explicit 
Sub AllSectionsToSubDoc()
     
    Dim x               As Long
    Dim Sections        As Long
    Dim Doc             As Document
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
    Set Doc = ActiveDocument
    Sections = Doc.Sections.Count
    For x = Sections - 1 To 1 Step -1
        Doc.Sections(x).Range.Copy
        Documents.Add
        ActiveDocument.Range.Paste
        ActiveDocument.SaveAs (Doc.Path & "\" & x & ".doc")
        ActiveDocument.Close False
    Next x
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
     
End Sub
 
Upvote 0
Mình chôm được code này trong VBA express, dùng với Word 2003. Sau khi dùng chức năng merge to new document, bạn lưu file mới lại rồi copy đoạn code vào module của file mới và chạy nó.
Mã:
 Option Explicit 
Sub AllSectionsToSubDoc()
     
    Dim x               As Long
    Dim Sections        As Long
    Dim Doc             As Document
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
    Set Doc = ActiveDocument
    Sections = Doc.Sections.Count
    For x = Sections - 1 To 1 Step -1
        Doc.Sections(x).Range.Copy
        Documents.Add
        ActiveDocument.Range.Paste
        ActiveDocument.SaveAs (Doc.Path & "\" & x & ".doc")
        ActiveDocument.Close False
    Next x
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
     
End Sub

Tuyệt vời ông mặt trời, cảm ơn bác nhé.
 
Upvote 0
Có một thực tế là nó không giữ nguyên toàn bộ định dạng :(
 
Upvote 0
Có một thực tế là nó không giữ nguyên toàn bộ định dạng :(
Sau khi thiết lập xong Mail Merge, bạn thử dùng code sau để xuất file.
PHP:
Sub MailMergeToMultiFile()
Application.ScreenUpdating = False
Dim i As Long, Doc As Document
Set Doc = ActiveDocument
ChangeFileOpenDirectory Doc.Path
With Doc.MailMerge
    If .Destination < 0 Then
        MsgBox "File hien hanh chua thiet lap Mail Merge"
    Else
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = False
        For i = 1 To .DataSource.RecordCount
            .DataSource.FirstRecord = i
            .DataSource.LastRecord = i
            .Execute Pause:=True
            ActiveDocument.SaveAs FileName:="MailMerge " & Format(i, "000")
            ActiveDocument.Close
        Next
    End If
End With
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Sau khi thiết lập xong Mail Merge, bạn thử dùng code sau để xuất file.
PHP:
Sub MailMergeToMultiFile()
Application.ScreenUpdating = False
Dim i As Long, Doc As Document
Set Doc = ActiveDocument
ChangeFileOpenDirectory Doc.Path
With Doc.MailMerge
    If .Destination < 0 Then
        MsgBox "File hien hanh chua thiet lap Mail Merge"
    Else
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = False
        For i = 1 To .DataSource.RecordCount
            .DataSource.FirstRecord = i
            .DataSource.LastRecord = i
            .Execute Pause:=True
            ActiveDocument.SaveAs FileName:="MailMerge " & Format(i, "000")
            ActiveDocument.Close
        Next
    End If
End With
Application.ScreenUpdating = True
End Sub

VBA trong word còn hạn hẹp quá mặc dù em nghĩ với những yêu cầu này không đòi hỏi gì cao cả.
Code này xuất file nhưng không như em mong muốn. Nó xuất thành nhiều file thật nhưng các file ấy đều giống file tổng, nó giống như là file tổng copy ra vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
VBA trong word còn hạn hẹp quá mặc dù em nghĩ với những yêu cầu này không đòi hỏi gì cao cả.

VBA trong word còn hạn hẹp quá nghĩa là sao bạn?
VBA trong word có đầy đủ, vấn đề là bạn có biết sử dụng hay không mà thôi.

Nó xuất thành nhiều file thật nhưng các file ấy đều giống file tổng, nó giống như là file tổng copy ra vậy.
Bạn đã 'Insert Merge Field' chưa?

Uống lưỡi bảy lần...
 
Upvote 0
Em Insert rồi anh nhưng lắp code nhầm file. Được rồi anh ạ, cảm ơn anh nhé.
Em nói hạn hẹp là ở mức trao đổi kiến thức trên forum còn rất ít. Có chăng thì toàn topic từ rất lâu rồi và nội dung cũng không phong phú. Giá như trên diễn đàn có anh chị nào hiểu và xây dựng một bài cơ bản VBA trong word thì hay quá.
 
Upvote 0
Em Insert rồi anh nhưng lắp code nhầm file. Được rồi anh ạ, cảm ơn anh nhé.
Em nói hạn hẹp là ở mức trao đổi kiến thức trên forum còn rất ít. Có chăng thì toàn topic từ rất lâu rồi và nội dung cũng không phong phú. Giá như trên diễn đàn có anh chị nào hiểu và xây dựng một bài cơ bản VBA trong word thì hay quá.
Có cầu thì mới có cung. Có người hỏi mới có người trả lời. Nếu có nhiều người hỏi thì tự nhiên nội dung sẽ phong phú hơn. Không ai rảnh để mà tự đặt vấn đề rồi tự giải quyết vấn đề mà quan trọng nhất là chưa biết có ai cần hay không.
 
Upvote 0
Cho mình hỏi:
Có cách nào tìm kiếm và thay thế theo điều kiện nào đó không?
Ví dụ:
<1> Bước 1
<2> Bước 2 <>
Để phân biệt Dòng 1 và dòng 2 dựa vào ký tự ở cuối câu.
Mình muốn thay thế <1> ở dòng 1 thành =1
<2> thành =2
thì phải làm như thế nào?
 
Upvote 0
Có cầu thì mới có cung. Có người hỏi mới có người trả lời. Nếu có nhiều người hỏi thì tự nhiên nội dung sẽ phong phú hơn. Không ai rảnh để mà tự đặt vấn đề rồi tự giải quyết vấn đề mà quan trọng nhất là chưa biết có ai cần hay không.
Câu này rất hay nè, có cầu mới có cung. Xưa nay thấy ít ai xài vba cho word nhưng không phải không có, bản thân mình cũng dùng vba word cho các việc đơn giản như : auto save as, auto print chứ thực sự chưa biết sẽ ứng dụng nhiều vào cái gì.
Vậy ai hãy bắt đầu những topic mới về vba word để vba thêm phong phú trong word cho người Việt chứ không chỉ ở excel.
Như ở forum mr ecel, mình thẩy cả word, outlook, autocard, access nữa cơ!
 
Upvote 0
Câu này rất hay nè, có cầu mới có cung. Xưa nay thấy ít ai xài vba cho word nhưng không phải không có, bản thân mình cũng dùng vba word cho các việc đơn giản như : auto save as, auto print chứ thực sự chưa biết sẽ ứng dụng nhiều vào cái gì.
Vậy ai hãy bắt đầu những topic mới về vba word để vba thêm phong phú trong word cho người Việt chứ không chỉ ở excel.
Như ở forum mr ecel, mình thẩy cả word, outlook, autocard, access nữa cơ!
Tôi cũng xài nè :D
 
Upvote 0
...
Vậy ai hãy bắt đầu những topic mới về vba word để vba thêm phong phú trong word cho người Việt chứ không chỉ ở excel.
Như ở forum mr ecel, mình thẩy cả word, outlook, autocard, access nữa cơ!
Muốn code thì ít nhất phải biết qua cơ cấu của Word.
Ở đây có mấy người biết? Điển hình, cái Styles trong Word nó có bao nhiêu chức năng chính? Và cái anchor của nó nằm ở đâu trong câu?

10 ngừoi mở Word ra có đến 9 chỉ biết gõ văn bản xong rồi dùng chuột kéo tới kéo lui, đề co này nọ. Một chút khái niệm về câu cú chương dòng còn không có.
 
Upvote 0
Sau khi thiết lập xong Mail Merge, bạn thử dùng code sau để xuất file.
PHP:
Sub MailMergeToMultiFile()
Application.ScreenUpdating = False
Dim i As Long, Doc As Document
Set Doc = ActiveDocument
ChangeFileOpenDirectory Doc.Path
With Doc.MailMerge
    If .Destination < 0 Then
        MsgBox "File hien hanh chua thiet lap Mail Merge"
    Else
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = False
        For i = 1 To .DataSource.RecordCount
            .DataSource.FirstRecord = i
            .DataSource.LastRecord = i
            .Execute Pause:=True
            ActiveDocument.SaveAs FileName:="MailMerge " & Format(i, "000")
            ActiveDocument.Close
        Next
    End If
End With
Application.ScreenUpdating = True
End Sub
Anh cho em hỏi, em muốn đặt tên file khác nhau theo list có sẵn trong excel có được không ạ. Ví dụ : tương ứng với mỗi document merge sẽ tương ứng với 1 tên file ở cột A chẳng hạn ( cột này là 1 merged field )
Em cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Anh cho em hỏi, em muốn đặt tên file khác nhau theo list có sẵn trong excel có được không ạ. Ví dụ : tương ứng với mỗi document merge sẽ tương ứng với 1 tên file ở cột A chẳng hạn ( cột này là 1 merged field )
Em cám ơn
Câu trả lời là được nhưng bây giờ tôi không có thời gian làm cho bạn.
Cách đơn giản nhất là đặt bookmark tại trường muốn đặt tên, trong code khi lưu file kết quả thì lấy giá trị tại bookmark này. Muốn tổng quát - cho chọn trường khi kết xuất - thì phức tạp hơn.
 
Upvote 0
Câu trả lời là được nhưng bây giờ tôi không có thời gian làm cho bạn.
Cách đơn giản nhất là đặt bookmark tại trường muốn đặt tên, trong code khi lưu file kết quả thì lấy giá trị tại bookmark này. Muốn tổng quát - cho chọn trường khi kết xuất - thì phức tạp hơn.
Vâng, bao giờ rảnh anh giúp em sau cũng được a. Em cám ơn
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom