Xin giúp đỡ: dùng excel điều khiển word đặt tab stop position

Liên hệ QC

bebi109

Thành viên mới
Tham gia
17/4/10
Bài viết
20
Được thích
1
Em có 1 file excel chứa mã vba: Book1.xlsm ; 1 file word không chứa mã vba
Em muốn dùng mã trong excel mở file word và đặt tab stop position (cái đánh đấu căn tab trên thanh rule của word: Menu Home --> paragraph --> tabs... --> tab stop position)
trong file Excel -->em có 1 sub như sau:
Mã:
Public Sub Dat_tab()
Const MyTab = 1.27
Dim oWord As Object, oFileNew As Object
    Set oWord = CreateObject("Word.Application")
        oWord.Visible = True
    Set oFileNew = oWord.Documents.Open(ThisWorkbook.Path & "\a.docx")
        oFileNew.Tables(1).Rows(1).Select
            oWord.Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(MyTab), Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces
            oWord.Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints((18 + 3 * MyTab) / 4), Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces
            oWord.Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints((18 + MyTab) / 2), Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces
            oWord.Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints((54 + MyTab) / 4), Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces
        oFileNew.Save
        oFileNew.Close
        oWord.Quit
    Set oFileNew = Nothing
    Set oWord = Nothing
End Sub

Lần 1: chạy đoạn code trên thấy báo lỗi bôi ở CentimetersToPoints em có tham khảo Help nhưng không hiểu rõ vấn đề
Lần 2: em vào VBA --> Tools --> referensce... --> tích chọn Microsoft Word 14.0 Object Library (em dùng office 2010) --> OK --> chạy lại đoạn code vừa rồi --> chạy được.
Nhưng vấn đề ở chỗ là nếu em khóa mật khẩu VBA và mang file excel này sang máy khác dùng office 2013 hay 2016 chạy thì lỗi. em hiểu là máy khác do không có cái Microsoft Word 14.0 Object Library.

Rất mong các bác, các chú, cô, anh, chị, em giúp đỡ em sửa code này chạy được mà không cần phải vào VBA --> Tools --> referensce... --> tích chọn Microsoft Word 14.0 Object Library. Hoặc bằng 1 cách nào đó mà cách thức trên có thể chạy trên nhiều phiên bản office. Em đã đính kèm 2 file mẫu ở bài này.
Em xin chân thành cảm ơn!
 

File đính kèm

  • a.docx
    12.8 KB · Đọc: 2
  • Book1.xlsm
    16 KB · Đọc: 2
Lần chỉnh sửa cuối:
xin mod chuyển hộ em bài viết này sang chuyên mục phù hợp với ạ. hình như là em đăng bài bị sai mục. em cảm ơn!
 
Tôi không tải 2 tập tin của bạn nhưng tôi "nhìn" thấy thế này ...

1. Vấn đề không chỉ là CentimetersToPoints mà còn ở wdAlignTabLeft và wdTabLeaderSpaces vì chúng là những hằng số của Word. Khi bạn không có references tới Word thì VBA không biết chúng là gì nên coi chúng là những biến không được khai báo tường minh. Khi đó chúng sẽ có giá trị mặc định vào thời điểm "Chào buổi sáng" là 0. Nhưng đúng là 2 hằng số này ở bên Word có giá trị bằng 0 thật nên kết quả vẫn đúng với mong đợi. Nhưng tương lai nếu bạn thay (dùng) bằng 2 hằng số khác thì kết quả sẽ không như mong đợi, vì thế nên luôn định nghĩa các hằng số sẽ dùng. Ngoài ra có thể bỏ
Mã:
, Leader:=wdTabLeaderSpaces
vì wdTabLeaderSpaces (= 0) là giá trị mặc định.

Tóm lại để chuẩn không chỉ về kết quả mà chuẩn cả về phương pháp thì phải định nghĩa 2 hằng số của Word (hoặc dùng references)
Mã:
Const wdAlignTabLeft = 0
Const wdTabLeaderSpaces = 0

2. Do cả Excel và Word đều có CentimetersToPoints nên thay CentimetersToPoints(...) bằng Application.CentimetersToPoints(...) hoặc oWord.CentimetersToPoints(...)

Tức vd. phải là
Mã:
oWord.Selection.ParagraphFormat.TabStops.Add Position:=Application.CentimetersToPoints(MyTab), Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces
 
Tôi không tải 2 tập tin của bạn nhưng tôi "nhìn" thấy thế này ...

1. Vấn đề không chỉ là CentimetersToPoints mà còn ở wdAlignTabLeft và wdTabLeaderSpaces vì chúng là những hằng số của Word. Khi bạn không có references tới Word thì VBA không biết chúng là gì nên coi chúng là những biến không được khai báo tường minh. Khi đó chúng sẽ có giá trị mặc định vào thời điểm "Chào buổi sáng" là 0. Nhưng đúng là 2 hằng số này ở bên Word có giá trị bằng 0 thật nên kết quả vẫn đúng với mong đợi. Nhưng tương lai nếu bạn thay (dùng) bằng 2 hằng số khác thì kết quả sẽ không như mong đợi, vì thế nên luôn định nghĩa các hằng số sẽ dùng. Ngoài ra có thể bỏ
Mã:
, Leader:=wdTabLeaderSpaces
vì wdTabLeaderSpaces (= 0) là giá trị mặc định.

Tóm lại để chuẩn không chỉ về kết quả mà chuẩn cả về phương pháp thì phải định nghĩa 2 hằng số của Word (hoặc dùng references)
Mã:
Const wdAlignTabLeft = 0
Const wdTabLeaderSpaces = 0

2. Do cả Excel và Word đều có CentimetersToPoints nên thay CentimetersToPoints(...) bằng Application.CentimetersToPoints(...) hoặc oWord.CentimetersToPoints(...)

Tức vd. phải là
Mã:
oWord.Selection.ParagraphFormat.TabStops.Add Position:=Application.CentimetersToPoints(MyTab), Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces
Cảm ơn pro rất nhiều.
Cho em hỏi thêm là: nếu bắt buộc phải có references tới Word (hiện tại em xài office 2010 thì references là 14.0), nếu em khóa vba project unviewenable và mang file excel sang máy khác có references tới word là 15.0 hay 16.0 thì có hoạt động bình thường được không? nếu không thì làm sao để mang references word 14.0 đi theo file excel này ạ?
 
Cảm ơn pro rất nhiều.
Cho em hỏi thêm là: nếu bắt buộc phải có references tới Word (hiện tại em xài office 2010 thì references là 14.0), nếu em khóa vba project unviewenable và mang file excel sang máy khác có references tới word là 15.0 hay 16.0 thì có hoạt động bình thường được không? nếu không thì làm sao để mang references word 14.0 đi theo file excel này ạ?
Bạn khóa hay không khóa thì khi người khác có phiên bản khác thì họ sẽ có MISSING.
Tại sao bắt buộc bạn phải có references? Nhìn code của bạn thì bạn dùng kết nối trễ
Dim oWord As Object, oFileNew As Object
Set oWord = CreateObject("Word.Application")
Vậy thì cứ như thế mà làm, references làm gì. Tất nhiên các hằng số của Word thì nên định nghĩa hoặc nhập số cứng nhắc vào (không khuyến cáo)
 
Bạn khóa hay không khóa thì khi người khác có phiên bản khác thì họ sẽ có MISSING.
Tại sao bắt buộc bạn phải có references? Nhìn code của bạn thì bạn dùng kết nối trễ

Vậy thì cứ như thế mà làm, references làm gì. Tất nhiên các hằng số của Word thì nên định nghĩa hoặc nhập số cứng nhắc vào (không khuyến cáo)
vâng. em cảm ơn pro. em đang tập tọe làm 1 dự án vì cộng đồng. có khó khăn xin pro giúp ạ!
 
Tiện đây pro cho em hỏi thêm tí xíu nữa:
Em cũng dùng excel điều khiển để export file word thành file pdf.
Trong file excel có mã sau:
Mã:
Public Sub Tao_pdf()
Dim teppdf As String
Dim oWord As Object, oFileNew As Object
    Set oWord = CreateObject("Word.Application")
        oWord.Visible = True
    Set oFileNew = oWord.Documents.Open(ThisWorkbook.Path & "\a.docx")
        teppdf = ThisWorkbook.Path & "\a.pdf"
        oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False
        oFileNew.Saved = True
        oFileNew.Close
        oWord.Quit
    Set oFileNew = Nothing
    Set oWord = Nothing
End Sub
lần 1: đã references cho word --> chạy được
lần 2: không references cho word --> chạy lỗi Invalid procedure call or argument (Error 5) , báo lỗi ở dòng
Mã:
oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False
Em google dịch nhưng không hiểu. Mong pro giúp nốt ạ
em xin cảm ơn!
 
Tiện đây pro cho em hỏi thêm tí xíu nữa:
Em cũng dùng excel điều khiển để export file word thành file pdf.
Trong file excel có mã sau:
Mã:
Public Sub Tao_pdf()
Dim teppdf As String
Dim oWord As Object, oFileNew As Object
    Set oWord = CreateObject("Word.Application")
        oWord.Visible = True
    Set oFileNew = oWord.Documents.Open(ThisWorkbook.Path & "\a.docx")
        teppdf = ThisWorkbook.Path & "\a.pdf"
        oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False
        oFileNew.Saved = True
        oFileNew.Close
        oWord.Quit
    Set oFileNew = Nothing
    Set oWord = Nothing
End Sub
lần 1: đã references cho word --> chạy được
lần 2: không references cho word --> chạy lỗi Invalid procedure call or argument (Error 5) , báo lỗi ở dòng
Mã:
oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False
Em google dịch nhưng không hiểu. Mong pro giúp nốt ạ
em xin cảm ơn!
Tôi đã viết rồi nhưng bạn không hiểu?

Khi bạn không có references tới Word thì VBA không biết chúng là gì nên coi chúng là những biến không được khai báo tường minh
...
Nhưng tương lai nếu bạn thay (dùng) bằng 2 hằng số khác thì kết quả sẽ không như mong đợi, vì thế nên luôn định nghĩa các hằng số sẽ dùng

Trong code có
Mã:
oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False

Tôi xét 2 trường hợp để bạn hiểu thêm.

1. Có references tới Microsoft Word 14.0 Object Library
Do có đính kèm thư viện Microsoft Word 14.0 Object Library mà trong đó có định nghĩa wdExportFormatPDF = 17 nên code sẽ thành
Mã:
oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=17, OpenAfterExport:=False
Lúc này sẽ có tập tin PDF.

2. Không đính kèm thư viện Microsoft Word 14.0 Object Library
Lúc này VBA không biết wdExportFormatPDF là cái gì nên khi không có Option Explicit thì nó cho rằng đấy là tên một biến không được khai báo tường minh. Với mọi biến không được khai báo tường minh thì chúng có kiểu Variant và vào thời điểm "Chào buổi sáng" (khi vào Sub, Function) chúng có giá trị Empty (sẽ được biến thành 0, "", FALSE, Nothing, Empty tùy theo ngữ cảnh dòng lệnh cụ thể). Tức trong trường hợp của bạn sẽ có
Mã:
oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=0, OpenAfterExport:=False

Rõ ràng lúc này không thể có tập tin PDF, vì giá trị cho ExportFormat phải là 17.

Nhắc lại: Mọi hằng số của Word phải được khai báo. Trong trường hợp này phải có
Mã:
Const wdExportFormatPDF = 17
Cũng có thể không khai báo như trên và sửa code thành
Mã:
oFileNew.ExportAsFixedFormat OutputFileName:=teppdf, ExportFormat:=17, OpenAfterExport:=False
Nhưng các code có những con số cứng nhắc rất khó đọc và code không "sáng sủa". Nên nhớ là tên các hằng số luôn gợi ý về ý nghĩa của chúng.
 
Em cảm ơn. Em tự mò nên k hiểu tại sao lại có số 17, và k biết các hằng số đó như thế nào. Vậy xjn nhờ pro cho em xin một vài link tham khảo để hiểu về các hằng số như vậy đc k ạ?
Bài đã được tự động gộp:

Em cảm ơn. Em tự mò nên k hiểu tại sao lại có số 17, và k biết các hằng số đó như thế nào. Vậy xjn nhờ pro cho em xin một vài link tham khảo để hiểu về các hằng số như vậy đc k ạ?
 
Em cảm ơn. Em tự mò nên k hiểu tại sao lại có số 17, và k biết các hằng số đó như thế nào. Vậy xjn nhờ pro cho em xin một vài link tham khảo để hiểu về các hằng số như vậy đc k ạ?
Có nhiều cách. Bạn có 1 kho trợ giúp mà chắc không dùng, cứ đi tìm kiếm đâu xa. Nguyên tắc là trước hết tìm trong nhà. Nếu trong nhà không có thì tìm trong phố mình ở. Nếu không tìm thấy thì tìm trong phường, quận, thành phố ... mình ở.

Đọc help VBA trong Excel tương tự

1. Mở Word -> Alt + F11 -> menu View -> Object Browser -> nhập wdExportFormatPDF ở trường bên trái icon "ống nhòm" -> nhấn "ống nhòm" (hình 1)
1.JPG

2. Hướng dẫn sử dụng ExportAsFixedFormat
Làm tương tự như trên nhưng tìm ExportAsFixedFormat. Sẽ thấy cửa sổ như hình 2.
2.JPG

Nhìn chỗ 1 thấy có viền thì có nghĩa là ExportAsFixedFormat là phương thức của đối tượng (Object) Document. Nếu click vào 2 thì sẽ thấy cửa sổ như hình 1. Nếu chọn 3 rồi sau đó click 4 hoặc nhấn F1 thì sẽ nhìn thấy hình 3. Đọc và nghiền ngẫm.
3.JPG
 
Có nhiều cách. Bạn có 1 kho trợ giúp mà chắc không dùng, cứ đi tìm kiếm đâu xa. Nguyên tắc là trước hết tìm trong nhà. Nếu trong nhà không có thì tìm trong phố mình ở. Nếu không tìm thấy thì tìm trong phường, quận, thành phố ... mình ở.

Đọc help VBA trong Excel tương tự

1. Mở Word -> Alt + F11 -> menu View -> Object Browser -> nhập wdExportFormatPDF ở trường bên trái icon "ống nhòm" -> nhấn "ống nhòm" (hình 1)
View attachment 215716

2. Hướng dẫn sử dụng ExportAsFixedFormat
Làm tương tự như trên nhưng tìm ExportAsFixedFormat. Sẽ thấy cửa sổ như hình 2.
View attachment 215717

Nhìn chỗ 1 thấy có viền thì có nghĩa là ExportAsFixedFormat là phương thức của đối tượng (Object) Document. Nếu click vào 2 thì sẽ thấy cửa sổ như hình 1. Nếu chọn 3 rồi sau đó click 4 hoặc nhấn F1 thì sẽ nhìn thấy hình 3. Đọc và nghiền ngẫm.
View attachment 215718
Cảm ơn pro nhiều nhiều. Nhờ pro mà giờ e mới biết cái này. Tuyệt quá!
 
Web KT
Back
Top Bottom