Chuyên đề giải đáp những thắc mắc về code VBA

kimmi268

Thành viên mới
Tham gia ngày
25 Tháng hai 2019
Bài viết
8
Được thích
0
Điểm
13
Tuổi
28
Tôi nghĩ là VBA làm được nhưng chỉ nói chung chung "từng dòng (hoặc 1 vài dòng)" thì không ai hiểu bạn muốn gì.
tức là code này giúp mình xuất ra tất cả các bản ghi (file word) cho 1 click, mỗi bản ghi tương ứng với 1 dòng dữ liệu mình có trong bảng excel. ý tưởng của mình là trong trường hợp mình chỉ muốn xuất 1 bản ghi tương ứng với dòng dữ liệu đầu tiên hoặc 3 bản ghi tương ứng với dòng dữ liệu 5,8,16 (giống như việc mình print all hay print page đó) thì có thể không? trân trọng!
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,803
Được thích
4,171
Điểm
560
tức là code này giúp mình xuất ra tất cả các bản ghi (file word) cho 1 click, mỗi bản ghi tương ứng với 1 dòng dữ liệu mình có trong bảng excel. ý tưởng của mình là trong trường hợp mình chỉ muốn xuất 1 bản ghi tương ứng với dòng dữ liệu đầu tiên hoặc 3 bản ghi tương ứng với dòng dữ liệu 5,8,16 (giống như việc mình print all hay print page đó) thì có thể không? trân trọng!
Tôi hiểu 5,8,16 là chỉ số dòng trên sheet của dòng dữ liệu cần lấy.

Thế 5,8,16 bạn nhập ở đâu? Hay là hiện InputBox để nhập?

Bạn quá kiệm lời. Bạn muốn người khác viết code cho cả 2 trường hợp? Vì nếu không người ta chỉ viết cho 1 trường hợp thì bạn sẽ nói là bạn muốn trường hợp 2 và người ta lại sửa?

Nếu vấn đề là của mình thì mình nên chăm hơn tất cả các người khác, bỏ công càng nhiều để những người sẽ giúp mình bỏ công ra càng ít.

Tôi làm cho cách 1: nhập 5,8,16 hoặc 5, 8, 16 vào NTCV!Q1 (tự sửa trong code nếu nhập chỗ khác), tập tin Excel và Word đặt trong cùng thư mục.
Mã:
Sub bbntcv()
Const wdReplaceAll = 2
    Dim dong
    Dim num_of_column As Long
    Dim k As Long, i As Long, j As Long
    Dim template As Object, t As Object

    num_of_column = 14
    
    With Sheet6.Range("Q1")
        If Trim(.Value) = "" Then Exit Sub
        dong = Split(Trim(.Value), ",")
    End With
    With CreateObject("word.application")
'        .Visible = True
        For i = 0 To UBound(dong)
            k = Trim(dong(i))
            Set template = .documents.Open(ThisWorkbook.Path & "\BBNTCV.doc")
            Set t = template.Content
            For j = 1 To num_of_column
                t.Find.Execute findtext:=Sheet6.Cells(1, j).Value, ReplaceWith:=Sheet6.Cells(k, j).Text, Replace:=wdReplaceAll
            Next j
            With template
                .SaveAs Filename:=ThisWorkbook.Path & "\" & i & "-BBNTCV.doc"
                .Close
            End With
        Next i
        .Quit
    End With
    Set t = Nothing
    Set template = Nothing
    
End Sub
 

kimmi268

Thành viên mới
Tham gia ngày
25 Tháng hai 2019
Bài viết
8
Được thích
0
Điểm
13
Tuổi
28
Tôi hiểu 5,8,16 là chỉ số dòng trên sheet của dòng dữ liệu cần lấy.

Thế 5,8,16 bạn nhập ở đâu? Hay là hiện InputBox để nhập?

Bạn quá kiệm lời. Bạn muốn người khác viết code cho cả 2 trường hợp? Vì nếu không người ta chỉ viết cho 1 trường hợp thì bạn sẽ nói là bạn muốn trường hợp 2 và người ta lại sửa?

Nếu vấn đề là của mình thì mình nên chăm hơn tất cả các người khác, bỏ công càng nhiều để những người sẽ giúp mình bỏ công ra càng ít.

Tôi làm cho cách 1: nhập 5,8,16 hoặc 5, 8, 16 vào NTCV!Q1 (tự sửa trong code nếu nhập chỗ khác), tập tin Excel và Word đặt trong cùng thư mục.
Mã:
Sub bbntcv()
Const wdReplaceAll = 2
    Dim dong
    Dim num_of_column As Long
    Dim k As Long, i As Long, j As Long
    Dim template As Object, t As Object

    num_of_column = 14
  
    With Sheet6.Range("Q1")
        If Trim(.Value) = "" Then Exit Sub
        dong = Split(Trim(.Value), ",")
    End With
    With CreateObject("word.application")
'        .Visible = True
        For i = 0 To UBound(dong)
            k = Trim(dong(i))
            Set template = .documents.Open(ThisWorkbook.Path & "\BBNTCV.doc")
            Set t = template.Content
            For j = 1 To num_of_column
                t.Find.Execute findtext:=Sheet6.Cells(1, j).Value, ReplaceWith:=Sheet6.Cells(k, j).Text, Replace:=wdReplaceAll
            Next j
            With template
                .SaveAs Filename:=ThisWorkbook.Path & "\" & i & "-BBNTCV.doc"
                .Close
            End With
        Next i
        .Quit
    End With
    Set t = Nothing
    Set template = Nothing
  
End Sub
Lời đầu tiên mình rất cảm ơn bạn đã nhiệt tình giúp đỡ mình, do kiến thức còn hạn chế nên chưa thể truyền đạt rõ ý để bạn hiểu, mình rất xin lỗi về điều này.
Mình có gửi lại file mình đã chỉnh sửa code và sử dụng được lên để bạn có thể hiểu rõ hơn tình huống của mình.
nếu có thể check giùm mình bạn hãy sửa phần đường dẫn lại cho đúng khi bạn download về máy bạn giúp mình nhé (2 file để dùng 1 thư mục)
Hiện tại khi nhấp vào "xuat file" code của mình sẽ chạy và cho ra 1 loạt file kết quả ở cùng thư mục chưa file excel nguồn, mỗi dòng là 1 file kết quả (word). ý tưởng của mình là khi mình nhấp vào "xuat file" excel sẽ đưa ra cho mình 2 option là "xuất tất cả các dòng" hay "xuất dòng x" (x do mình nhập vào, theo mình hiểu thì là dạng InputBox như bạn nói). Rất mong được bạ giúp đỡ. Trân trọng!
 

File đính kèm

vubaduc1993

Thành viên mới
Tham gia ngày
10 Tháng mười một 2017
Bài viết
24
Được thích
0
Điểm
163
Tuổi
26
Có bác nào rảnh code hộ em tự động xuất file theo địa chỉ thư mục có sãn được không ạ ( em có thể về chỉnh sửa )
Thank các bác
 

File đính kèm

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,803
Được thích
4,171
Điểm
560
Hiện tại khi nhấp vào "xuat file" code của mình sẽ chạy và cho ra 1 loạt file kết quả ở cùng thư mục chưa file excel nguồn, mỗi dòng là 1 file kết quả (word). ý tưởng của mình là khi mình nhấp vào "xuat file" excel sẽ đưa ra cho mình 2 option là "xuất tất cả các dòng" hay "xuất dòng x" (x do mình nhập vào, theo mình hiểu thì là dạng InputBox như bạn nói). Rất mong được bạ giúp đỡ. Trân trọng!
Biết ngay mà. Lại phải viết lần nữa.

̣Thôi, làm lần cuối. Tập tin Ecel và Word ở cùng thư mục. Để nguyên "all" và nhấn OK hoặc nhập vd. 2, 5, 8 (2,5,8) và nhấn OK. Code không kiểm tra lỗi nhập vd. 2.3, 5, 8 hoặc 1234 khi dữ liệu chỉ có tới dòng vd. 200
Mã:
Sub bbntcv()
Const wdReplaceAll = 2
    Dim indexs As String, dong, data()
    Dim num_of_column As Long
    Dim lastRow As Long, k As Long, i As Long, j As Long
    Dim template As Object, t As Object

    With Sheet6
        lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
        If lastRow < 2 Then Exit Sub
    End With
    indexs = InputBox("Hay nhap cac chi so dong tren sheet hoac de nguyen ""all"" va nhan OK", "Nhap chi so dong", "all")
    If indexs = "" Then Exit Sub
    
    data = Sheet6.Range("A1:N" & lastRow).Value
    
    If indexs = "all" Then
        ReDim dong(0 To UBound(data) - 2)
        For k = 0 To UBound(dong)
            dong(k) = k + 2
        Next k
    Else
        dong = Split(Replace(indexs, " ", ""), ",")
    End If
    
    num_of_column = 14
    
    With CreateObject("word.application")
'        .Visible = True
        For i = 0 To UBound(dong)
            k = dong(i)
            Set template = .documents.Open(ThisWorkbook.Path & "\BBNTCV.doc")
            Set t = template.Content
            For j = 1 To num_of_column
                If j = 4 Or j = 5 Then
                    data(k, j) = Format(data(k, j), "HH:mm")
                ElseIf j = 9 Then
                    data(k, j) = Round(data(k, j), 3)
                End If
                t.Find.Execute findtext:=data(1, j), ReplaceWith:=data(k, j), Replace:=wdReplaceAll
            Next j
            With template
                .SaveAs Filename:=ThisWorkbook.Path & "\" & k & "-BBNTCV.doc"
                .Close
            End With
        Next i
        .Quit
    End With
    Set t = Nothing
    Set template = Nothing
    
End Sub
 

harukenshiro

Thành viên mới
Tham gia ngày
13 Tháng mười hai 2018
Bài viết
12
Được thích
0
Điểm
163
Tuổi
22
Sau khi đọc bài Tổng quan về Dictionary của anh kyo , em nghĩ nó rất phù hợp để đẩy nhanh tiến độ công việc của bản thân nhưng khi áp dụng vẫn chưa thành công, em mạn phép gửi code của em lên để các anh xem nó ko phù hợp ở chỗ nào. Mục đích của em là :

- Tạo một Dictionary có cột A của file Data làm key, cột B, I (trong code em vẫn chưa có làm cột I) làm Item.
- Nạp Dictionary từ file Main, sau đó lấy cột AG làm giá trị cần tìm, làm tương tự như vlookup để xuất giá trị ở cột DD=B, cột DE = I.(Code nằm ở Module 1).

Mong các anh có thể sửa và giải thích giúp cho em để em ghi nhớ ạ. Em xin cảm ơn trước.
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,803
Được thích
4,171
Điểm
560
Sau khi đọc bài Tổng quan về Dictionary của anh kyo , em nghĩ nó rất phù hợp để đẩy nhanh tiến độ công việc của bản thân nhưng khi áp dụng vẫn chưa thành công, em mạn phép gửi code của em lên để các anh xem nó ko phù hợp ở chỗ nào. Mục đích của em là :

Mong các anh có thể sửa và giải thích giúp cho em để em ghi nhớ ạ. Em xin cảm ơn trước.
Bạn thử xem.

Đừng hỏi gì nữa vì tôi chú thích từng dòng code rồi.
Mã:
Sub thudictionary()
Dim wb As Workbook, ws As Worksheet
Dim data(), result(), dic, item
Dim i As Long, lastRow As Long
'    tap tin Main.xlsb va Data.xlsm o trong cung thu muc
    Set wb = Application.Workbooks.Open(ThisWorkbook.Path & "\Data.xlsm")
    With wb.Worksheets("Master in Google Drive")
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
'        khong co du lieu thi ket thuc
        If lastRow < 2 Then Exit Sub
'        lay du lieu vao mang data
        data = .Range("A2:I" & lastRow).Value
    End With
    wb.Close
    
'    kiem tra xem VNSO co du lieu hay khong
    Set ws = ThisWorkbook.Sheets("VNSO")
    With ws
'        neu co ket qua cu thi xoa
        lastRow = .Cells(Rows.Count, "DD").End(xlUp).Row
        If lastRow > 1 Then .Range("DD2:DE" & lastRow).ClearContents
'        dong cuoi cung co du lieu o cot AG
        lastRow = .Cells(Rows.Count, "AG").End(xlUp).Row
'        khong co du lieu thi ket thuc
        If lastRow < 2 Then Exit Sub
    End With
    
    Set dic = CreateObject("Scripting.Dictionary")
    With dic
'        duyet tung dong cua mang data, them key va item. item la mang co 2 phan tu, tu cot B va cot I
        For i = 1 To UBound(data)
            If Not .exists(data(i, 1)) Then
                ReDim item(1 To 2)
'                tu cot B
                item(1) = data(i, 2)
'                tu cot I
                item(2) = data(i, 9)
'                them vao tu dien
                .Add data(i, 1), item
            End If
        Next
    End With
'    cho cac gia tri can tim tu cot AG cua sheet VNSO vao mang data. Lay du 1 dong
    data = ws.Range("AG2:AG" & lastRow + 1).Value
    ReDim result(1 To UBound(data) - 1, 1 To 2)
'    duyet mang data, khong xet dong cuoi cung lay them
    For i = 1 To UBound(data) - 1
        If dic.exists(data(i, 1)) Then
'            doc ra cot B va I tu tap tin Data.xlsm, da ghi trong item
            item = dic.item(data(i, 1))
'            ghi ket qua vao mang result
            result(i, 1) = item(1)
            result(i, 2) = item(2)
        End If
    Next
'    dap mang result xuong sheet
    ws.Range("DD2").Resize(UBound(result), 2).Value = result
    
    Set dic = Nothing
End Sub
 

kimmi268

Thành viên mới
Tham gia ngày
25 Tháng hai 2019
Bài viết
8
Được thích
0
Điểm
13
Tuổi
28
Biết ngay mà. Lại phải viết lần nữa.

̣Thôi, làm lần cuối. Tập tin Ecel và Word ở cùng thư mục. Để nguyên "all" và nhấn OK hoặc nhập vd. 2, 5, 8 (2,5,8) và nhấn OK. Code không kiểm tra lỗi nhập vd. 2.3, 5, 8 hoặc 1234 khi dữ liệu chỉ có tới dòng vd. 200
Mã:
Sub bbntcv()
Const wdReplaceAll = 2
    Dim indexs As String, dong, data()
    Dim num_of_column As Long
    Dim lastRow As Long, k As Long, i As Long, j As Long
    Dim template As Object, t As Object

    With Sheet6
        lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
        If lastRow < 2 Then Exit Sub
    End With
    indexs = InputBox("Hay nhap cac chi so dong tren sheet hoac de nguyen ""all"" va nhan OK", "Nhap chi so dong", "all")
    If indexs = "" Then Exit Sub
   
    data = Sheet6.Range("A1:N" & lastRow).Value
   
    If indexs = "all" Then
        ReDim dong(0 To UBound(data) - 2)
        For k = 0 To UBound(dong)
            dong(k) = k + 2
        Next k
    Else
        dong = Split(Replace(indexs, " ", ""), ",")
    End If
   
    num_of_column = 14
   
    With CreateObject("word.application")
'        .Visible = True
        For i = 0 To UBound(dong)
            k = dong(i)
            Set template = .documents.Open(ThisWorkbook.Path & "\BBNTCV.doc")
            Set t = template.Content
            For j = 1 To num_of_column
                If j = 4 Or j = 5 Then
                    data(k, j) = Format(data(k, j), "HH:mm")
                ElseIf j = 9 Then
                    data(k, j) = Round(data(k, j), 3)
                End If
                t.Find.Execute findtext:=data(1, j), ReplaceWith:=data(k, j), Replace:=wdReplaceAll
            Next j
            With template
                .SaveAs Filename:=ThisWorkbook.Path & "\" & k & "-BBNTCV.doc"
                .Close
            End With
        Next i
        .Quit
    End With
    Set t = Nothing
    Set template = Nothing
   
End Sub
Tuyệt vời, mình rất rất cảm ơn bạn. Chúc bạn và gia đình luôn hạnh phúc! :)
 

anh1234

Thành viên mới
Tham gia ngày
9 Tháng chín 2008
Bài viết
20
Được thích
0
Điểm
663
Tuổi
31
Dear Các bác.
Sau khi chuyển máy, chuyển từ excel 2007 lên office 2010, toàn bộ các Code VBA liên quan đến gửi mail, đều báo lỗi:
Run-time error'-2147417851(80010105)'.
Method 'To' of object '_Mailtem'faied.
Em không rõ là lỗi code, hay em chưa cài đầy đủ các phần trong ofice 2010. Các code này, em chuyển sang máy cũ của em 2007 vẫn dùng vẫn bình thường, sang máy mới cài ofice 2010 là không chạy được.

Kính mong các bác giúp em ạ.
 

File đính kèm

fukuchan

Thành viên mới
Tham gia ngày
8 Tháng tám 2017
Bài viết
7
Được thích
0
Điểm
163
Xin chào mọi người, mình mới tập tành viết code nên còn rất nhiều điều chưa biết. Vì dụ mình có 2 câu text trong 2 ô excel như sau
1. Ngày13/2/2019
2. Tổ 23 phường Hòa Hải quận Ngũ Hành Sơn Thành phố Đà Nẵng
Bây giờ mình muốn tách từng cụm từ của mỗi câu sau ra thành từng ô excel ở 1 sheet khác thì phải dùng code vba như thế nào ạ?
Nhờ mọi người giúp đỡ
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,448
Được thích
2,313
Điểm
360
Xin chào mọi người, mình mới tập tành viết code nên còn rất nhiều điều chưa biết. Vì dụ mình có 2 câu text trong 2 ô excel như sau
1. Ngày13/2/2019
2. Tổ 23 phường Hòa Hải quận Ngũ Hành Sơn Thành phố Đà Nẵng
Bây giờ mình muốn tách từng cụm từ của mỗi câu sau ra thành từng ô excel ở 1 sheet khác thì phải dùng code vba như thế nào ạ?
Nhờ mọi người giúp đỡ
Tách như thế nào cho cái vị dụ coi.:D
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,448
Được thích
2,313
Điểm
360

fukuchan

Thành viên mới
Tham gia ngày
8 Tháng tám 2017
Bài viết
7
Được thích
0
Điểm
163
Bạn phải biết quy luật của nó mới viết được code.Bạn tìm hiểu xem quy luật của bạn là gì.:D.
cái ô đầu thì quy luật là ngày/tháng/ năm sẽ cách nhau bằng dấu "/", còn câu dưới thì mình đang muốn nó tách theo từng ký tự chỉ định (tổ/phường/quận/thành phố) nhưng mà đoạn code thì không biết làm sao để mô tả được việc dòng text sẽ cách nhau tại dấu "/"
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,803
Được thích
4,171
Điểm
560
Không biết các địa chỉ khác có Tổ, Phường hay không nhưng chưa chắc có Quận, Thành phố. Một cô thôn nữ thì ở Quận nào, Thành phố nào? Mà đã chắc gì tiểu thư Sài gòn ở Thành phố? Có thể ở TP cũng nên. Tung 1 địa chỉ lên coi như là có qui luật?
 

dongkisot84

Thành viên mới
Tham gia ngày
6 Tháng mười một 2007
Bài viết
24
Được thích
7
Điểm
665
Cho em hỏi với, đoạn code sau:
Sub ..
For q = 1 To 10
For Each tr In doc1.Tables(q).Rows
tr.HeightRule = wdRowHeightAtLeast
tr.Height = 0.5
tr.Cells.VerticalAlignment = wdCellAlignVerticalCenter
tr.LeftIndent = CentimetersToPoints(-0.1)
tr.RightIndent = CentimetersToPoints(-0.1)

Next tr

....
End Sub()
LeftIndent, RightIndent có dùng được cho biến Rows không mà nó báo lỗi Method or data member not found (Error 461) Thế ạ
Em đang chuyển dữ liệu từ Excel sang Word, đến đoạn trình bày bảng biểu
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,803
Được thích
4,171
Điểm
560
tr.LeftIndent = CentimetersToPoints(-0.1)
tr.RightIndent = CentimetersToPoints(-0.1)

...
LeftIndent, RightIndent có dùng được cho biến Rows không mà nó báo lỗi Method or data member not found (Error 461) Thế ạ
Em đang chuyển dữ liệu từ Excel sang Word, đến đoạn trình bày bảng biểu
Trước đó chắc bạn có đại loại
Mã:
Set WordApp = CreateObject(...)
Vậy thì bây giờ viết
Mã:
tr.LeftIndent = WordApp.CentimetersToPoints(-0.1)
tr.RightIndent = WordApp.CentimetersToPoints(-0.1)
Nhưng tr (Row) bên Word cũng không có thuộc tính RightIndent. Ít ra là ở Word 2010 của tôi. Có thể phiên bản Word mới hơn của bạn có chăng?

Excel VBA cũng không biết wdRowHeightAtLeast và wdCellAlignVerticalCenter là gì (Word hiểu được vì chúng là hằng số của Word) nên sẽ cho chúng là tên 2 biến không được khai báo tường minh. Và dĩ nhiên 2 biến đó có giá trị ban đầu là 0. Lúc đó kết quả r.HeightRule và tr.Cells.VerticalAlignment đều là 0, khác với mong đợi.

Vì thế dòng đầu nên là
Mã:
Const wdRowHeightAtLeast = ...
Const wdCellAlignVerticalCenter = ...
Kiểm tra bên Word hai hằng số này có giá trị bao nhiêu rồi điền vào chỗ ...
 
Lần chỉnh sửa cuối:

BBmall

Thành viên mới
Tham gia ngày
10 Tháng năm 2018
Bài viết
36
Được thích
2
Điểm
165
Tuổi
34
Cho mình hỏi là có cái công thức chuyển từ sheet này sang sheet khác hoạt động OK rồi nhưng mà nó chuyển cả hàm trong ô bên sheet kia nên ai có cách nào nó xóa đi giúp mình với vì mình không rành nên chỉ nhặt về thôi. Cảm ơn. Dưới là công thức
Private Sub CommandButton1_Click()
Dim Lr As Integer, Dc As Integer
Lr = Sheet5.Range("A10000").End(xlUp).Row
Dc = Sheet2.Range("A10000").End(xlUp).Row
Sheet2.Range("A2:A100" & Dc, "AG2:AG101" & Dc).Copy
Sheet5.Range ("A" & Lr + 1)
Range("a2", "c101").ClearContents
Range("e2", "h101").ClearContents
Range("j2", "m101").ClearContents
End Sub
 

CHAOQUAY

Thành viên tích cực
Tham gia ngày
24 Tháng tám 2018
Bài viết
862
Được thích
843
Điểm
360
Cho mình hỏi là có cái công thức chuyển từ sheet này sang sheet khác hoạt động OK rồi nhưng mà nó chuyển cả hàm trong ô bên sheet kia nên ai có cách nào nó xóa đi giúp mình với vì mình không rành nên chỉ nhặt về thôi. Cảm ơn. Dưới là công thức
Private Sub CommandButton1_Click()
Dim Lr As Integer, Dc As Integer
Lr = Sheet5.Range("A10000").End(xlUp).Row
Dc = Sheet2.Range("A10000").End(xlUp).Row
Sheet2.Range("A2:A100" & Dc, "AG2:AG101" & Dc).Copy
Range("a2", "c101").ClearContents
Range("e2", "h101").ClearContents
Range("j2", "m101").ClearContents
End Sub
Thay dòng trên bằng dòng dưới xem sao.
Mã:
'Sheet5.Range ("A" & Lr + 1)
Sheet5.Range("A" & Lr + 1).PasteSpecial xlPasteValues
 

dongkisot84

Thành viên mới
Tham gia ngày
6 Tháng mười một 2007
Bài viết
24
Được thích
7
Điểm
665
Nhưng tr (Row) bên Word cũng không có thuộc tính RightIndent. Ít ra là ở Word 2010 của tôi. Có thể phiên bản Word mới hơn của bạn có chăng?

Excel VBA cũng không biết wdRowHeightAtLeast và wdCellAlignVerticalCenter là gì (Word hiểu được vì chúng là hằng số của Word) nên sẽ cho chúng là tên 2 biến không được khai báo tường minh. Và dĩ nhiên 2 biến đó có giá trị ban đầu là 0. Lúc đó kết quả r.HeightRule và tr.Cells.VerticalAlignment đều là 0, khác với mong đợi.

Vì thế dòng đầu nên là
Mã:
Const wdRowHeightAtLeast = ...
Const wdCellAlignVerticalCenter = ...
Kiểm tra bên Word hai hằng số này có giá trị bao nhiêu rồi điền vào chỗ ...
Thankiu bạn, thực tế mình chỉ không hiểu LeftIndent có vận dụng được cho biến Row trong table hay không thui, các code kia mình vẫn chạy bình thường mà.
Đúng là phần trên mình đang dùng With CreateObject("Word.Application")
Tiện đây, có bác nào có bài viết chuyên sâu về điều khiển Word bằng VBa bên excel không cho mình xin với ạ
 
Top Bottom