Xóa dòng trống một cách tự động tại dòng không có dữ liệu của bảng tính sau khi mail merge (hay dùng template gì đó ạ..)

Liên hệ QC

thuongdehoang

Thành viên mới
Tham gia
14/5/08
Bài viết
6
Được thích
1
EM KÍNH CHÀO ANH CHỊ
Em có 1 file báo nợ cho khách hàng
1/ file word
2/file excel
File excel là danh sách các khách hàng dùng để mail merger(hoặc dùng template em nghĩ vậy) vào file word,.
Xong vấn đề ở chỗ file word có bảng tính
Nhu cầu bảng tính chỉ thể hiện loại phí nợ , còn dòng nào o nợ thì o thể hiện
Tuy nhiên khi em merge vào thì không biết cách xóa dòng o có nợ được nên o đúng yêu cầu
Do đó các anh chị giỏi giúp em code để cắt dòng không nợ nếu như số tiền nợ o có (LÝ DO : 1000 CĂN HỘ EM KHÔNG CẮT ROW = TAY ĐƯỢC Ạ)
CÁM ƠN ANH CHỊ
 

File đính kèm

  • DỮ LIỆU NGUỒN HỎI DD.xlsx
    10.4 KB · Đọc: 9
  • hỏi diễn đàn.docx
    12.6 KB · Đọc: 10
Topic cũ đã có thành viên trả lời bạn thì bạn nên đổi tiêu đề để nhận sự trợ giúp không nên lập topic mới nữa nha
Bài đã được tự động gộp:

Bài Ở đây
 
Upvote 0
Lần sau bạn không nên viết tắt - các ký tự "o" trong bài viết.

Bạn dùng code cần cù sau đây.

Mở tập tin Word -> Alt + F11 -> chọn ThisDocument của Project vừa mở -> menu Insert -> Module -> dán code dưới đây -> ghi lại thành tập tin DOCM.

Khi cần trộn thư thì: mở tập tin DOCM -> chèn các trường cần thiết -> trộn thư -> sau khi trộn thư, tức khi có tập tin thứ 2 từ trộn thư thì chạy sub EditTables. Nếu lần khác trong tập tin Word cột cần kiểm tra RỖNG không phải là cột 3 thì sửa check_col. Tương tự nếu cột STT khác 1 thì sửa, nếu không có cột STT thì truyền no_col = 0. Nếu không có dòng tiêu đề thì truyền header = False.
Mã:
Option Explicit

Private Sub DeleteEmptyRows(ByVal check_col As Long, Optional ByVal header As Boolean = True, Optional no_col As Long = 0)
'    code loại bỏ các dòng trống ở cột check_col
'    no_col: chỉ số cột có chứa STT. Neu no_col = 0 thì không cột nào đánh STT
'    header: nếu no_col = 0, tức không cột nào chứa STT thì bỏ qua tham so header. Nếu no_col > 0 thì:
'    - header = True -> đánh lại STT từ dòng 2
'    - header = False -> đánh lại STT từ dòng 1
Dim r As Long, c As Long, curr_row As Long, text As String, doc As Document, tabl As Table
    If check_col < 1 Then Exit Sub
    For Each doc In Application.Documents
        If Not doc Is ThisDocument Then
            Application.ScreenUpdating = False
            For Each tabl In doc.Tables
                curr_row = 0
                For r = 1 To tabl.Rows.Count
                    If Len(tabl.Cell(r, check_col).Range.text) > 2 Then
                        curr_row = curr_row + 1
                        For c = 1 To tabl.Columns.Count
                            If no_col > 0 And curr_row > -header And c = no_col Then
                                tabl.Cell(curr_row, c).Range.text = curr_row + header
                            Else
                                text = tabl.Cell(r, c).Range.text
                                tabl.Cell(curr_row, c).Range.text = Left(text, Len(text) - 2)
                            End If
                        Next c
                    End If
                Next r
                If curr_row < tabl.Rows.Count Then
                    tabl.Rows(curr_row + 1).Select
                    Selection.MoveDown wdParagraph, tabl.Rows.Count - curr_row - 1, wdExtend
                    Selection.Rows.Delete
                End If
            Next tabl
            Application.ScreenUpdating = True
            Exit For
        End If
    Next doc
End Sub

Sub EditTables()
'    kiểm tra cột 3 (SỐ TIỀN), bảng có dòng tiêu đề, STT ở cột 1
    DeleteEmptyRows 3, True, 1
End Sub
 
Upvote 0
Lần sau bạn không nên viết tắt - các ký tự "o" trong bài viết.

Bạn dùng code cần cù sau đây.

Mở tập tin Word -> Alt + F11 -> chọn ThisDocument của Project vừa mở -> menu Insert -> Module -> dán code dưới đây -> ghi lại thành tập tin DOCM.

Khi cần trộn thư thì: mở tập tin DOCM -> chèn các trường cần thiết -> trộn thư -> sau khi trộn thư, tức khi có tập tin thứ 2 từ trộn thư thì chạy sub EditTables. Nếu lần khác trong tập tin Word cột cần kiểm tra RỖNG không phải là cột 3 thì sửa check_col. Tương tự nếu cột STT khác 1 thì sửa, nếu không có cột STT thì truyền no_col = 0. Nếu không có dòng tiêu đề thì truyền header = False.
Mã:
Option Explicit

Private Sub DeleteEmptyRows(ByVal check_col As Long, Optional ByVal header As Boolean = True, Optional no_col As Long = 0)
'    code loại bỏ các dòng trống ở cột check_col
'    no_col: chỉ số cột có chứa STT. Neu no_col = 0 thì không cột nào đánh STT
'    header: nếu no_col = 0, tức không cột nào chứa STT thì bỏ qua tham so header. Nếu no_col > 0 thì:
'    - header = True -> đánh lại STT từ dòng 2
'    - header = False -> đánh lại STT từ dòng 1
Dim r As Long, c As Long, curr_row As Long, text As String, doc As Document, tabl As Table
    If check_col < 1 Then Exit Sub
    For Each doc In Application.Documents
        If Not doc Is ThisDocument Then
            Application.ScreenUpdating = False
            For Each tabl In doc.Tables
                curr_row = 0
                For r = 1 To tabl.Rows.Count
                    If Len(tabl.Cell(r, check_col).Range.text) > 2 Then
                        curr_row = curr_row + 1
                        For c = 1 To tabl.Columns.Count
                            If no_col > 0 And curr_row > -header And c = no_col Then
                                tabl.Cell(curr_row, c).Range.text = curr_row + header
                            Else
                                text = tabl.Cell(r, c).Range.text
                                tabl.Cell(curr_row, c).Range.text = Left(text, Len(text) - 2)
                            End If
                        Next c
                    End If
                Next r
                If curr_row < tabl.Rows.Count Then
                    tabl.Rows(curr_row + 1).Select
                    Selection.MoveDown wdParagraph, tabl.Rows.Count - curr_row - 1, wdExtend
                    Selection.Rows.Delete
                End If
            Next tabl
            Application.ScreenUpdating = True
            Exit For
        End If
    Next doc
End Sub

Sub EditTables()
'    kiểm tra cột 3 (SỐ TIỀN), bảng có dòng tiêu đề, STT ở cột 1
    DeleteEmptyRows 3, True, 1
End Sub
B
Lần sau bạn không nên viết tắt - các ký tự "o" trong bài viết.

Bạn dùng code cần cù sau đây.

Mở tập tin Word -> Alt + F11 -> chọn ThisDocument của Project vừa mở -> menu Insert -> Module -> dán code dưới đây -> ghi lại thành tập tin DOCM.

Khi cần trộn thư thì: mở tập tin DOCM -> chèn các trường cần thiết -> trộn thư -> sau khi trộn thư, tức khi có tập tin thứ 2 từ trộn thư thì chạy sub EditTables. Nếu lần khác trong tập tin Word cột cần kiểm tra RỖNG không phải là cột 3 thì sửa check_col. Tương tự nếu cột STT khác 1 thì sửa, nếu không có cột STT thì truyền no_col = 0. Nếu không có dòng tiêu đề thì truyền header = False.
Mã:
Option Explicit

Private Sub DeleteEmptyRows(ByVal check_col As Long, Optional ByVal header As Boolean = True, Optional no_col As Long = 0)
'    code loại bỏ các dòng trống ở cột check_col
'    no_col: chỉ số cột có chứa STT. Neu no_col = 0 thì không cột nào đánh STT
'    header: nếu no_col = 0, tức không cột nào chứa STT thì bỏ qua tham so header. Nếu no_col > 0 thì:
'    - header = True -> đánh lại STT từ dòng 2
'    - header = False -> đánh lại STT từ dòng 1
Dim r As Long, c As Long, curr_row As Long, text As String, doc As Document, tabl As Table
    If check_col < 1 Then Exit Sub
    For Each doc In Application.Documents
        If Not doc Is ThisDocument Then
            Application.ScreenUpdating = False
            For Each tabl In doc.Tables
                curr_row = 0
                For r = 1 To tabl.Rows.Count
                    If Len(tabl.Cell(r, check_col).Range.text) > 2 Then
                        curr_row = curr_row + 1
                        For c = 1 To tabl.Columns.Count
                            If no_col > 0 And curr_row > -header And c = no_col Then
                                tabl.Cell(curr_row, c).Range.text = curr_row + header
                            Else
                                text = tabl.Cell(r, c).Range.text
                                tabl.Cell(curr_row, c).Range.text = Left(text, Len(text) - 2)
                            End If
                        Next c
                    End If
                Next r
                If curr_row < tabl.Rows.Count Then
                    tabl.Rows(curr_row + 1).Select
                    Selection.MoveDown wdParagraph, tabl.Rows.Count - curr_row - 1, wdExtend
                    Selection.Rows.Delete
                End If
            Next tabl
            Application.ScreenUpdating = True
            Exit For
        End If
    Next doc
End Sub

Sub EditTables()
'    kiểm tra cột 3 (SỐ TIỀN), bảng có dòng tiêu đề, STT ở cột 1
    DeleteEmptyRows 3, True, 1
End Sub
Biết ơn bác Batman nhiều vì lời dặn có tính xây dựng. Sẽ thử code của bác rồi phản hồi lại ạ. Một lần nữa cám ơn bác
 
Upvote 0
B

Biết ơn bác Batman nhiều vì lời dặn có tính xây dựng. Sẽ thử code của bác rồi phản hồi lại ạ. Một lần nữa cám ơn bác
Chào Bác.Em đã thực hiện code của Bác cho . File chạy rất ok Bác ạ.
Xong đúng như Bác nói là code cần cù ạ. Mỗi lần chạy mới phải copy lại code và mailling lại ạ.
Em rất muốn thao tác in bên file excel, chỉ nhất nút và word tự in cập nhật (cũng vẫn là không in dòng trống).
Bác hướng dẫn giúp em . Mong muốn này đối với em quá khó.
Chân thành cám ơn Bác.
 

File đính kèm

  • DỮ LIỆU NGUỒN HỎI DD.xlsx
    11.3 KB · Đọc: 9
  • hỏi diễn đàn.docx
    12.6 KB · Đọc: 9
Upvote 0
Chào Bác.Em đã thực hiện code của Bác cho . File chạy rất ok Bác ạ.
Xong đúng như Bác nói là code cần cù ạ. Mỗi lần chạy mới phải copy lại code và mailling lại ạ.
Em rất muốn thao tác in bên file excel, chỉ nhất nút và word tự in cập nhật (cũng vẫn là không in dòng trống).
Bác hướng dẫn giúp em . Mong muốn này đối với em quá khó.
Chân thành cám ơn Bác.
Tôi không hiểu. Tại sao phải copy lại code và mailing lại? Nói chuyện thì nên nói rõ vì người kia có thể do chậm hiểu mà không hiểu ý mình.
Mở tập tin Word -> thực hiện mail merge -> có kết quả vd. letter1 với bảng có dòng trống -> chạy code -> có letter1 với bảng không có dòng trống -> lưu lại với tên letter.docx. Từ lúc này trở đi muốn in 1000 lần thì 1000 lần mở letter1.docx rồi in. Nếu dữ liệu trong Excel không thay đổi thì chả lý gì phải làm lại mail merge. Còn nếu một ngày đẹp trời dữ liệu Excel thay đổi thì dù không muốn cũng vẫn phải làm lại mail merge và chạy code. Vậy thì ý "Mỗi lần chạy mới phải copy lại code và mailling lại" là gì? "Mỗi lần chạy" cái gì? Tập tin "hỏi diễn đàn.docx" sau khi thêm code rồi ghi lại thành "hỏi diễn đàn.docm" rồi lưu lại thì mãi mãi code có trong hỏi "diễn đàn.docm" rồi chứ sao lại phải "copy lại code"? Còn nếu ý khác thì nói rõ ra.
 
Upvote 0
Tôi không hiểu. Tại sao phải copy lại code và mailing lại? Nói chuyện thì nên nói rõ vì người kia có thể do chậm hiểu mà không hiểu ý mình.
Mở tập tin Word -> thực hiện mail merge -> có kết quả vd. letter1 với bảng có dòng trống -> chạy code -> có letter1 với bảng không có dòng trống -> lưu lại với tên letter.docx. Từ lúc này trở đi muốn in 1000 lần thì 1000 lần mở letter1.docx rồi in. Nếu dữ liệu trong Excel không thay đổi thì chả lý gì phải làm lại mail merge. Còn nếu một ngày đẹp trời dữ liệu Excel thay đổi thì dù không muốn cũng vẫn phải làm lại mail merge và chạy code. Vậy thì ý "Mỗi lần chạy mới phải copy lại code và mailling lại" là gì? "Mỗi lần chạy" cái gì? Tập tin "hỏi diễn đàn.docx" sau khi thêm code rồi ghi lại thành "hỏi diễn đàn.docm" rồi lưu lại thì mãi mãi code có trong hỏi "diễn đàn.docm" rồi chứ sao lại phải "copy lại code"? Còn nếu ý khác thì nói rõ ra.
[/QUOTE
Tôi không hiểu. Tại sao phải copy lại code và mailing lại? Nói chuyện thì nên nói rõ vì người kia có thể do chậm hiểu mà không hiểu ý mình.
Mở tập tin Word -> thực hiện mail merge -> có kết quả vd. letter1 với bảng có dòng trống -> chạy code -> có letter1 với bảng không có dòng trống -> lưu lại với tên letter.docx. Từ lúc này trở đi muốn in 1000 lần thì 1000 lần mở letter1.docx rồi in. Nếu dữ liệu trong Excel không thay đổi thì chả lý gì phải làm lại mail merge. Còn nếu một ngày đẹp trời dữ liệu Excel thay đổi thì dù không muốn cũng vẫn phải làm lại mail merge và chạy code. Vậy thì ý "Mỗi lần chạy mới phải copy lại code và mailling lại" là gì? "Mỗi lần chạy" cái gì? Tập tin "hỏi diễn đàn.docx" sau khi thêm code rồi ghi lại thành "hỏi diễn đàn.docm" rồi lưu lại thì mãi mãi code có trong hỏi "diễn đàn.docm" rồi chứ sao lại phải "copy lại code"? Còn nếu ý khác thì nói rõ ra.
Tôi không hiểu. Tại sao phải copy lại code và mailing lại? Nói chuyện thì nên nói rõ vì người kia có thể do chậm hiểu mà không hiểu ý mình.
Mở tập tin Word -> thực hiện mail merge -> có kết quả vd. letter1 với bảng có dòng trống -> chạy code -> có letter1 với bảng không có dòng trống -> lưu lại với tên letter.docx. Từ lúc này trở đi muốn in 1000 lần thì 1000 lần mở letter1.docx rồi in. Nếu dữ liệu trong Excel không thay đổi thì chả lý gì phải làm lại mail merge. Còn nếu một ngày đẹp trời dữ liệu Excel thay đổi thì dù không muốn cũng vẫn phải làm lại mail merge và chạy code. Vậy thì ý "Mỗi lần chạy mới phải copy lại code và mailling lại" là gì? "Mỗi lần chạy" cái gì? Tập tin "hỏi diễn đàn.docx" sau khi thêm code rồi ghi lại thành "hỏi diễn đàn.docm" rồi lưu lại thì mãi mãi code có trong hỏi "diễn đàn.docm" rồi chứ sao lại phải "copy lại code"? Còn nếu ý khác thì nói rõ ra.

Em xin trình bày lại: Đã thực hiện code Bác cho và ra kết quả đúng lắm. Tuy nhiên phải làm như thế này:
1/ em mở file word-chép code của Bác-xong rồi gán merge cell xong(A)-- mới tạo letter-----kết quả đúng 100%.
2/ Xong rồi muốn thử chạy lại lettter -không tài nào chạy lại được file merge cell đã có code ban nãy(A) mà phải làm lại từ đầu số 1 ạ.
3/ Em thử vài chục lần làm merge cell -ra letter có dòng trống - rồi mới chép code letter để chạy bỏ dòng trống --thì file không ra, chưa chạy được lúc nào
4 Hay Bác giúp em làm file excel để chỉ định in trong word luôn đi Bác. vẫn xuất ra word không dòng trống -giống như đính kèm á Bác
Thành thật biết ơn Bác
 

File đính kèm

  • DỮ LIỆU NGUỒN HỎI DD.xlsx
    11.5 KB · Đọc: 9
Upvote 0
Em xin trình bày lại: Đã thực hiện code Bác cho và ra kết quả đúng lắm. Tuy nhiên phải làm như thế này:
1/ em mở file word-chép code của Bác-xong rồi gán merge cell xong(A)-- mới tạo letter-----kết quả đúng 100%.
2/ Xong rồi muốn thử chạy lại lettter -không tài nào chạy lại được file merge cell đã có code ban nãy(A) mà phải làm lại từ đầu số 1 ạ.
3/ Em thử vài chục lần làm merge cell -ra letter có dòng trống - rồi mới chép code letter để chạy bỏ dòng trống --thì file không ra, chưa chạy được lúc nào
4 Hay Bác giúp em làm file excel để chỉ định in trong word luôn đi Bác. vẫn xuất ra word không dòng trống -giống như đính kèm á Bác
Thành thật biết ơn Bác
Hãy làm như tôi hướng dẫn trong bài #3.

Mở tập tin Word -> Alt + F11 -> chọn ThisDocument của Project vừa mở -> menu Insert -> Module -> dán code dưới đây -> ghi lại thành tập tin DOCM.

Nhưng để không gặp rắc rối thì trước khi làm điều trên thì: trước khi mở tập tin Word thì mở tập tin Excel -> xóa (Delete) tất cả các dòng trên cùng sao cho dòng 1 chứa các TIÊU ĐỀ -> lưu lại tập tin Excel.

Lưu ý: để chắc chắn thì xóa khoảng 100 dòng trống sau bảng trong tập tin Excel trước khi trộn thư. Nên biết rằng các dòng sau bảng có thể trống nhưng nếu chúng có vd. định dạng gì đó thì khi trộn thư Word sẽ trộn cả những dòng trống đó. Vd. trong tập tin ở bài #7 nếu xóa giá trị trong C11 và C17 thì khi trộn thư Word vẫn trộn cả 10 dòng trống 8-17 vì dòng cuối cùng có chứa định dạng (được tô mầu) là dòng 17 (C17 được tô mầu).

Sau khi làm như trên thì:
1. Mở tập tin Word đã có chèn các trường + code + lưu thành DOCM -> chọn Mailings -> Finish & Merge -> Edit ... -> vd. All -> có tập tin trộn thư -> Alt + F11 -> chạy EditTables -> đã có tập tin với các bảng không có dòng trống -> lưu lại tập tin trộn thư và đóng nó -> lại chọn Finish & Merge -> Edit ... -> vd. All -> có tập tin trộn thư -> Alt + F11 -> chạy EditTables -> đã có tập tin với các bảng không có dòng trống -> lưu lại tập tin trộn thư và đóng nó -> cứ như thế vài lần luôn luôn không phải làm gì thêm.

Tiếp đó đóng tập tin DOCM -> mở lại tập tin DOCM -> trộn thư vài lần. Không lần nào phải làm lại. Nếu không có đỏ đỏ như ở trên thì sẽ có rắc rối như bạn nói.
 
Upvote 0
EM KÍNH CHÀO ANH CHỊ
Em có 1 file báo nợ cho khách hàng
1/ file word
2/file excel
File excel là danh sách các khách hàng dùng để mail merger(hoặc dùng template em nghĩ vậy) vào file word,.
Xong vấn đề ở chỗ file word có bảng tính
Nhu cầu bảng tính chỉ thể hiện loại phí nợ , còn dòng nào o nợ thì o thể hiện
Tuy nhiên khi em merge vào thì không biết cách xóa dòng o có nợ được nên o đúng yêu cầu
Do đó các anh chị giỏi giúp em code để cắt dòng không nợ nếu như số tiền nợ o có (LÝ DO : 1000 CĂN HỘ EM KHÔNG CẮT ROW = TAY ĐƯỢC Ạ)
CÁM ƠN ANH CHỊ
Nên xử lý từ Dữ liệu trước khi mail merged
Nếu là Template thì sửa Template chuẩn trước khi sử dụng nó
 
Upvote 0
Hãy làm như tôi hướng dẫn trong bài #3.



Nhưng để không gặp rắc rối thì trước khi làm điều trên thì: trước khi mở tập tin Word thì mở tập tin Excel -> xóa (Delete) tất cả các dòng trên cùng sao cho dòng 1 chứa các TIÊU ĐỀ -> lưu lại tập tin Excel.

Lưu ý: để chắc chắn thì xóa khoảng 100 dòng trống sau bảng trong tập tin Excel trước khi trộn thư. Nên biết rằng các dòng sau bảng có thể trống nhưng nếu chúng có vd. định dạng gì đó thì khi trộn thư Word sẽ trộn cả những dòng trống đó. Vd. trong tập tin ở bài #7 nếu xóa giá trị trong C11 và C17 thì khi trộn thư Word vẫn trộn cả 10 dòng trống 8-17 vì dòng cuối cùng có chứa định dạng (được tô mầu) là dòng 17 (C17 được tô mầu).

Sau khi làm như trên thì:
1. Mở tập tin Word đã có chèn các trường + code + lưu thành DOCM -> chọn Mailings -> Finish & Merge -> Edit ... -> vd. All -> có tập tin trộn thư -> Alt + F11 -> chạy EditTables -> đã có tập tin với các bảng không có dòng trống -> lưu lại tập tin trộn thư và đóng nó -> lại chọn Finish & Merge -> Edit ... -> vd. All -> có tập tin trộn thư -> Alt + F11 -> chạy EditTables -> đã có tập tin với các bảng không có dòng trống -> lưu lại tập tin trộn thư và đóng nó -> cứ như thế vài lần luôn luôn không phải làm gì thêm.

Tiếp đó đóng tập tin DOCM -> mở lại tập tin DOCM -> trộn thư vài lần. Không lần nào phải làm lại. Nếu không có đỏ đỏ như ở trên thì sẽ có rắc rối như bạn nói.
Em đã thực hiện như lời Bác và kết quả thật là mỹ mãn ạ. Cám ơn bác batman1 thật nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom