In hợp đồng trong word nhưng sử dụng vba để lấy dữ liệu trong listbox excel

Liên hệ QC

baohan2006

Thành viên mới
Tham gia
19/10/11
Bài viết
27
Được thích
1
mình định làm một file excel bao gồm 1 listbox và các textbox, mình muốn khi mình click vào hàng nào đó của listbox và bấm nút in hợp đồng thì sẻ mở file word có sẵn và lấy dữ liệu từ hàng listbox được chọn đó để in.
minh mới có ý tưởng vậy thôi, nhưng chưa nghĩ ra cách gì để làm được cả. nếu sử dụng trộn thư trong word thì quá đơn giản, ở đây mình muốn là chọn tên nào thì lấy thông tin ấy và in mà thôi
mong mọi người giúp đỡ giúp.
thanks.
 
Như các bạn đã thấy, từ đầu năm đến giờ mình có việc riêng rất bận nên ít tham gia với anh em được. Mỗi khi đọc câu hỏi có liên quan bài viết của mình lại càng sốt ruột. Mong anh em hếtb sức thông cảm cho.

Nay thấy vấn đề này có nhiều bạn quan tâm, nhưng khó sử lý. Vậy mình viết file này giúp các bạn:
-Tuỳ ý muốn thêm nội dung gì về công ty bằng cách thêm 1 dòng tại sheet Cty, code sẽ thêm cho các bạn 1 Textbox trên hợp đồng với tên theo cột A và khi in sẽ lấy theo ô tương ứng trên cột B. Nhóm này đặt tại lề trái.
-Tuỳ ý muốn thêm 1 Textbox nào đó về thông tin người LD hay nội dung HD bạn thêm 1 cột trên sheet DS và code sẽ tạo 1 Textbox có tên theo tiêu đề trên dòng 1 đặt tại nhóm trên lề phải. Khi in sẽ điền dòng tương ứng trên cột.

Các bạn dùng chuột , bàn phím để định dạng và di chuyển về đúng vị trí của nó rồi lưu lại. Nếu muốn di chuyển thật nhỏ, chính xác bạn chọn Textbox , giữ Ctrl và dung phím mũi tên để di chuyển.

Các bạn thử xem sao

Dear Anh,
Em đã làm đúng hướng dẫn, em có thêm một trường trong Sheet DS và code trong form em cũng đã sửa lại thành Rezise(,9) nhưng hợp đồng chỉ in ra những thông tin về giám đốc. Không biết em làm sai ở đâu, nhờ anh chỉ dẫn nhé. Em cảm ơn.
Mã:
Private Sub UserForm_Initialize()
Me.ListBox1.RowSource = Sheet1.Name & "!" & Sheet1.Range(Sheet1.[A2], Sheet1.[A65536].End(3)).Resize(, 9).Address
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Muốn làm được bài này trước tiên phải tạo 1 file word với 1 tên bất kỳ.
Tiếp theo là tạo ra những textbox cần đủ cho công viêc
Sau đó chạy marco này để định vị cho các textbox
PHP:
Sub taotb()
Dim Dc As Document, i
Dim Sh As Shape
Set Dc = ThisDocument
For Each Sh In Dc.Shapes
    i = i + 1
    Sh.TextFrame.TextRange.Text = Sh.Name
    Sh.Name = "Tb" & i
Next
MsgBox "Done"
End Sub

Sau đó sắp xếp những TB này vào nơi phù hợp trên văn bản
Tiếp theo là tạo 1 userform1
Sau đó tạo code này để nạp dữ liêu khi khởi động userform1

PHP:
Private Sub UserForm_Initialize()
Dim ds As Worksheet
Set ds = Sheets("DS")
Me.ListBox1.RowSource = ds.Range(ds.[A2], ds.[A65536].End(3)).Resize(, 9).Address
End Sub

Tiếp theo là tao 1 listbox1 cho userform1 để nạp dữ liệu vào khi khởi động
Sau đó ta tạo 2 nút command trên userform1 này, 1 nút để in và 1 nút để thoát
Trong nút thoát ta nhập code như sau:
PHP:
Private Sub CommandButton1_Click()
Unload Me
End Sub

Trong nút in ta tạo những dòng code sau đây,giả sử file word tên là hopdonglaodong nha.

PHP:
Private Sub CommandButton2_Click()
Dim Dc As Object, Hd As Object, i
On Error Resume Next
Set Dc = CreateObject("Word.Application")
Dc.Visible = True
Dc.Documents("\Hopdonglaodong.doc").Close
Set Hd = Dc.Documents.Open(ThisWorkbook.Path & "\Hopdonglaodong.doc")
For i = 1 To 9
    Hd.Shapes("Tb" & i).TextFrame.TextRange.Text = Me.ListBox1.Column(i - 1)
Next
Set Dc = Nothing
End Sub
Anh quanghai1969 ơi có thể cho em xin một file ví dụ về chương trình trên của anh được không ạ với dữ liệu và file word mẫu em gửi ạ, em đọc và làm theo hướng dẫn của anh nhưng không thế làm được. Mong anh thông cảm!
em cảm ơn anh
Mong được anh và các thành viên triên diễn đàn giúp đỡ ạ
 

File đính kèm

Upvote 0
Anh quanghai1969 ơi có thể cho em xin một file ví dụ về chương trình trên của anh được không ạ với dữ liệu và file word mẫu em gửi ạ, em đọc và làm theo hướng dẫn của anh nhưng không thế làm được. Mong anh thông cảm!
em cảm ơn anh
Mong được anh và các thành viên triên diễn đàn giúp đỡ ạ
Tại sao không dùng MailMerge cho nhẹ nhàng. Chất lượng ngon hơn code nhiều.
 
Upvote 0
Tại sao không dùng MailMerge cho nhẹ nhàng. Chất lượng ngon hơn code nhiều.
Em cảm ơn anh em cũng đã dùng MailMerge tuy nhiên có một số vấn đề mà MailMerge không giải quyết được anh ạ (Đó là do ý kiến chủ quản của em không biết MailMerge có giải quyết được không) do vậy em mới phải tìm đến Code VBA anh ạ
VD như khi với điều kiện những Cell nào không có dữ liệu thì khi trộn dữ liệu sang word nó sẽ hiển thị là ................ hoặc là ...../..../...... anh ạ
Em cảm ơn sự giúp đỡ của anh và các thành viên trên diễn đàn ạ!
 
Upvote 0
Em cảm ơn anh em cũng đã dùng MailMerge tuy nhiên có một số vấn đề mà MailMerge không giải quyết được anh ạ (Đó là do ý kiến chủ quản của em không biết MailMerge có giải quyết được không) do vậy em mới phải tìm đến Code VBA anh ạ
VD như khi với điều kiện những Cell nào không có dữ liệu thì khi trộn dữ liệu sang word nó sẽ hiển thị là ................ hoặc là ...../..../...... anh ạ
Em cảm ơn sự giúp đỡ của anh và các thành viên trên diễn đàn ạ!
Vì không hiểu được bạn nên chỉ có thể hướng dẫn tổng quát. Bạn tự nghiên cứu và áp dụng cho bài toán cá nhân.
Code này sẽ giúp cho các bạn tạo ra 1 file word mới, tự động chèn vào file 5 textbox và lưu lại với tên là Sample.doc.
Các Textbox được đặt tên theo thứ tự là TB1, TB2... TB5 để thuận tiện cho việc gán dữ liệu sau này.

PHP:
Sub WordDocumentCreate()
   Dim i As Long
   With CreateObject("Word.Application")
      .Visible = True
      With .Documents.Add
         For i = 1 To 5
            With .Shapes.AddTextbox(1, 50, 50 * i, 100, 20)
               .Name = "TB" & i
            End With
         Next
         .SaveAs ThisWorkBook.path & "\Sample.doc"
         .Close
      End With
      .Quit
   End With
End Sub
Trong trường hợp ta đã có sẵn 1 file word có tên là Sample.doc sẵn rồi, giờ chỉ muốn tạo Textbox cho file này thì dùng code này. Sau khi có TB rồi bạn hãy kéo các TB về vị trí đúng của nó và xóa đi cái khung bao của TB
PHP:
Sub Add_TB()
Dim i As Long
With CreateObject("Word.Application")
   .Visible = True
    With .Documents.Open(ThisWorkBook.path & "\Sample.doc")
      For i = 1 To 5
            With .Shapes.AddTextbox(1, 50, 50 * i, 100, 20)
               .Name = "TB" & i
            End With         
      Next
      '.Close True
   End With
   '.Quit
End With
End Sub
Muốn gán giá trị cho TB thì dùng code thế này
PHP:
Sub Add_Value_To_TB()
Dim i As Long
With CreateObject("Word.Application")
   .Visible = True
    With .Documents.Open(ThisWorkbook.Path & "\Sample.doc")
      For i = 1 To 5
         .Shapes("TB" & i).TextFrame.TextRange = i
      Next
      .Close True
   End With
   .Quit
End With
End Sub
Bạn chịu khó vận dụng cho phù hợp. Chúc bạn thành công.
 
Upvote 0
hép mi

Mình thấy bài này đã vài bữa, nhưng bận quá không sao được. Nay tranh thủ tham gia với bạn 1 chút. Mình tham gia nên dùng Textbox để đặt dữ liệu. Minh làm tạm vùng đầu Hợp đồng, bạn hoàn thiện nốt nha.
Lưu ý: Dạng file này phải tải về ổ máy mới chạy được.


Cám ơn bạn, rất hay...mình hơi kém chút lên muốn hỏi thêm.

Mình muốn thêm nhiều trường cần chèn bên word thì làm thế nào? bạn có video hướng dẫn không? +-+-+-+
 
Upvote 0
em gửi các anh chị file mẫu em mới làm, em muốn khi chọn vào listbox để chọn danh sách nào đó thì khi bấm vào nút in hợp đồng, sẻ mở file sẵn và lấy dự liệu trong listbox đó và in ra

Theo quan điểm của tôi thì dùng 1 sheet làm hợp đồng và 1 sheet theo dõi hợp đồng.

1/ Với sheet làm hợp đồng khi gõ nhập thông tin đầy đủ thì in hợp đồng và lưu thông tin dữ liệu vào sheet theo dõi hợp đồng (làm dạng này rất thích hợp với hóa đơn bán hàng nhập hàng vì sử dụng ListBox ta có thể chọn nhập cùng lúc nhiều loại hàng hóa theo chủng loại, đơn vị tính, giá hàng hóa).

2/ Với sheet theo dõi hợp đồng dùng nó để tổng hợp các loại thông tin và lấy dữ liệu ngược lại sheet làm hợp đồng để sửa thông tin khi cần hoặc in lại hợp đồng mới.

Với kiểu làm trên thì sẽ ít bị lỗi khi di chuyển File này đi bất kỳ nơi đâu, còn sử dụng Mail merge thì tôi không thích.

Cách làm trên, tham khảo File tại bài #13 của Topic sau:

http://www.giaiphapexcel.com/forum/showthread.php?113640-Trộn-thư/page2
 
Lần chỉnh sửa cuối:
Upvote 0
bài viết rất hay ạ. Ước j mình cũng có thể tạo ra một sản phẩm tự tay mình làm
 
Upvote 0
Web KT

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

Back
Top Bottom