Trình bày 1 đoạn code VBA trong trang văn bản Word.

Liên hệ QC

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,762
Được thích
5,716
Donate (Momo)
Donate
Giới tính
Nam
Tôi đang có việc luôn phải chép code VBA đến trang văn bản Word và tất nhiên phải trình bày thụt lề các khối mã With... End With, For...Next, If...Else...End If v.v... cho dễ đọc cho giống như vẫn phải làm (và thấy) trong cửa sổ VB Editor.

Do khối lượng việc này quá nhiều cần tiết kiệm công sức, mà sẵn vừa dịch xong cuốn Lập trình VBA cho MS Word cũng cần nghiên cứu áp dụng thứ gì đó, nên tôi cũng gắng viết đoạn code để làm việc này xem sao.

Dù biết chẳng mấy ai làm cái việc như mình, nhưng tôi cũng chia sẻ ra đây cho ai tình cờ cần đến:
Rich (BB code):
'Trình bày doan ma VBA trong file Word => Quét chon doan ma truoc khi chay Code
'wdCharacter = 1, wdWord = 2, wdLine = 5, wdExtend = 1, wdMove = 0
Sub FormatCodeVBAWord()
    Dim WordApp As Object, myDoc As Object, MySlt As Object, rng As Object, currentWord As Object
    Dim iPara&, i&, Sch$, sKT$, sKey$, bCase As Boolean, bThen As Boolean, tmr
    On Error GoTo Thoat
    tmr = Timer
    Set WordApp = GetObject(, "Word.Application")
    On Error GoTo 0
    'WordApp.Application.ScreenUpdating = False
    With WordApp.Selection
        Set myDoc = WordApp.ActiveDocument
        Set MySlt = .Range
        MySlt.Style = myDoc.Styles("Subtitle")
        iPara = MySlt.Paragraphs.Count
        Sch = Sch & vbTab
        'Xoa setting trong hop thoai Find & Replace de tim chu "Then " khong bi loi
        ClearFindAndReplaceParameters WordApp
        For i = 1 To iPara
            MySlt.Paragraphs(i).Range.Select
            'Code tìm THEN nhung khong có END IF
            With .Find
                .Text = "Then "
                .Execute
            End With
            If UCase(.Range) = "THEN " Then
                .MoveRight Unit:=1, Extend:=1
                If Right(.Range, 1) <> " " Then
                    bThen = True  'Tìm duoc THEN khong có END IF thì bThen = True
                End If
            End If
            .HomeKey Unit:=5
           
            'Xoa tab va khoang trang dau dong
            Do
                .MoveRight Unit:=2, Extend:=1
                sKT = Trim(.Range)
            Loop Until sKT <> "" And Right(sKT, 1) <> vbTab
            .MoveLeft Unit:=2, Extend:=1
            If Left(.Range, 1) = " " Or Left(.Range, 1) = vbTab Then .Delete
           
            'Code chính
St:         .MoveRight Unit:=2, Extend:=1
            sKey = UCase(Trim(.Range))
            'Các tu khóa bat dau vòng lap
            If sKey = "SUB" Or sKey = "FOR" Or sKey = "IF" Or sKey = "WITH" Or sKey = "FUNCTION" _
                Or sKey = "PRIVATE" Or sKey = "PUBLIC" Or sKey = "DO" Or sKey = "SELECT" Or sKey = "WHILE" Then
                .HomeKey Unit:=5      'Thuc hien go phím Tab
                .TypeText Text:=Sch
                If bThen = False Then 'Neu THEN có END IF thì them vbTab
                    Sch = Sch & vbTab
                Else
                    bThen = False     'THEN không có END IF thì reset bien bThen cho dòng lenh sau
                End If
            ElseIf .Range = " " Then  'Xu ly truong hop có 1 khoang trang dau dong code
                .HomeKey Unit:=5
                .Delete Unit:=1, Count:=1
                GoTo St
            ElseIf InStr(1, .Range, "  ") Then  'Xu ly truong hop có nhieu khoang trang dau dong code
                .HomeKey Unit:=5
                .MoveRight Unit:=2, Count:=1, Extend:=1
                .Delete Unit:=1, Count:=1
                GoTo St
            ElseIf sKey = "CASE" Then 'Truong hop tu khóa là CASE
                .HomeKey Unit:=5
                If bCase = False Then
                    bCase = True      'Xác dinh dúng là CASE de thut le cho các dòng duói
                Else
                    Sch = Left(Sch, Len(Sch) - 1)  'Neu khong phai CASE thì bót di 1 phím Tab
                End If
                .TypeText Text:=Sch   'Thuc hien go phím
                Sch = Sch & vbTab
            ElseIf sKey = "NEXT" Or sKey = "LOOP" Or sKey = "WEND" Then  'Truong hop ket thúc vòng lap
                .HomeKey Unit:=5
                Sch = Left(Sch, Len(Sch) - 1)
                .TypeText Text:=Sch
            ElseIf sKey = "ELSE" Or sKey = "ELSEIF" Then 'Truong hop gap Else hoac ElseIf
                .HomeKey Unit:=5
                Sch = Left(Sch, Len(Sch) - 1)
                .TypeText Text:=Sch
                Sch = Sch & vbTab
            ElseIf sKey = "END" Then  'Khi gap tu khóa END
                .MoveRight Unit:=2, Count:=1, Extend:=1
                If UCase(Trim(.Range)) = "END SELECT" Then
                    Sch = Left(Sch, Len(Sch) - 2) 'Neu End Select thì bót di 2 phím Tab
                Else
                    Sch = Left(Sch, Len(Sch) - 1) 'Neu chi là End thì bót di 1 phím Tab
                End If
                .HomeKey Unit:=5 'Go phím
                .TypeText Text:=Sch
            Else                      'Truong hop không phai là dòng có các tu khóa dac biet
                .HomeKey Unit:=5 'Go phím
                .TypeText Text:=Sch
                .MoveRight Unit:=1, Count:=1, Extend:=1
                'Xác dinh dieu kien de to màu Green cho các dòng ghi chú
                If Trim(.Range) = vbTab Then 'Neu có phím Tab truoc ký tu "'" hoac "‘"
                    .MoveRight Unit:=2, Count:=1
                    .MoveRight Unit:=1, Count:=1, Extend:=1
                    If .Range = "'" Or .Range = "‘" Then
                        .EndKey Unit:=5, Extend:=1
                        .Font.Color = 4825600
                    End If
                Else                          'Neu không có phím Tab truoc ký tu "'" hoac "‘"
                    If .Range = "'" Or .Range = "‘" Then
                        .EndKey Unit:=5, Extend:=1
                        .Font.Color = 4825600
                    End If
                End If
            End If
        Next
    End With
    Set myDoc = Nothing
    'WordApp.Application.ScreenUpdating = True
    Set WordApp = Nothing
    Debug.Print Timer - tmr & " giay"
    Exit Sub
Thoat:
    MsgBox "Khong co file Word nao dang mo."
End Sub

'Xoa cac thong tin trong hop thoai Find and Repace
Sub ClearFindAndReplaceParameters(WordApp As Object)
    With WordApp.Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = 0           'wdFindStop = 0
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
End Sub

Dưới đây là file Word, trong đó có mã VBA để chạy thử.
CÁCH DÙNG: quét chọn đoạn mã cần định dạng rồi chạy code. Muốn chạy nhanh hơn chút thì cho khả dụng 2 dòng WordApp.Application.ScreenUpdating = False và WordApp.Application.ScreenUpdating = True trong code.
P/S: Code để trong file Excel và mở sẵn file Word có mã cần định dạng.
 

File đính kèm

  • VBA-Macro_TestVBA.docx
    23.3 KB · Đọc: 26
Lần chỉnh sửa cuối:

File đính kèm

  • 1686042895327.png
    1686042895327.png
    17.1 KB · Đọc: 45
Upvote 0
Em rất khoái cái món thụt lề, trình bày rõ, dễ nhìn, và còn 1 chỗ nhỏ này không biết bác có nên cân nhắc không?
Nhìn code là em hoa mắt.

NextTCol em nghĩ nó nên thụt tí. :D :D :D
Ý bạn là dòng dưới của dòng có dấu cách _ gạch thấp chứ gì? Tôi thấy để vậy không sao nên không làm. Vả lại làm thì kéo code ra dài quá.:D :)
 
Upvote 0
Em mới phát hiện ra món khác là nếu nó dài quá thì nó lại không đẹp bác ạ. :D :D :D
Đúng rồi. Bởi vậy khi người ta viết code để trình bày trên trang văn bản Word thì họ phải tính số ký tự (kể cả khoảng trắng) nên có trên 1 dòng. Dài quá thì phải cắt bớt và xuống dòng đúng chuẩn của vba là thêm 1 khoảng trắng và dấu gạch thấp.
 
Upvote 0
Đúng rồi. Bởi vậy khi người ta viết code để trình bày trên trang văn bản Word thì họ phải tính số ký tự (kể cả khoảng trắng) nên có trên 1 dòng. Dài quá thì phải cắt bớt và xuống dòng đúng chuẩn của vba là thêm 1 khoảng trắng và dấu gạch thấp.
Em thử vì code dùng ADODB bên kia mà thêm dấu " _" để xuống dòng thì lỗi không chạy được. Do đó phải giữ dòng dài miên man trong VBA. Mà đưa sang word thì lại không đẹp. :D :D :D
 
Upvote 0
Em thử vì code dùng ADODB bên kia mà thêm dấu " _" để xuống dòng thì lỗi không chạy được. Do đó phải giữ dòng dài miên man trong VBA. Mà đưa sang word thì lại không đẹp. :D :D :D
Trong trường hợp là 1 chuỗi quá dài thì người ta ngắt chuỗi làm nhiều đoạn bọc trong ngoặc kép và xuống hàng bằng & _
 
Upvote 0
Dù chưa biết cách xài, và chưa hiểu ý của @Maika8008 lắm.
Đại ý là mình cần định dạng một đoạn mã VBA bất kỳ cho đẹp, sau thì copy vào trình soạn thảo Word ?
Nếu đúng là như vậy thì có 1 web làm được việc này, rất tiện và trình bày đẹp cũng cho phép xuất ra PDF. Chỉ cần copy >> paste >> nhấn Indent >> copy kết quả.
 

File đính kèm

  • NXJfl6Ap.pdf
    21.9 KB · Đọc: 5
Upvote 0
Dù chưa biết cách xài, và chưa hiểu ý của @Maika8008 lắm.
Đại ý là mình cần định dạng một đoạn mã VBA bất kỳ cho đẹp, sau thì copy vào trình soạn thảo Word ?
Nếu đúng là như vậy thì có 1 web làm được việc này, rất tiện và trình bày đẹp cũng cho phép xuất ra PDF. Chỉ cần copy >> paste >> nhấn Indent >> copy kết quả.
Tôi đang dịch sách, chép code mẫu từ bản gốc đang bản dịch thì phải định dạng luôn chứ chờ trang web ngoài làm chi cho chậm công việc đi. Ngoài thụt lề thì phải làm chữ xanh cho các dòng ghi ghú.
 
Upvote 0
Tôi đang dịch sách, chép code mẫu từ bản gốc đang bản dịch thì phải định dạng luôn chứ chờ trang web ngoài làm chi cho chậm công việc đi. Ngoài thụt lề thì phải làm chữ xanh cho các dòng ghi ghú.
Sao bác vất vả vụ này vậy. Có mấy cách hiển thị code trong Word đẹp mà.

- Dùng Insert - Open Document Text: cách này thì code sẽ nằm gọn trong khung tự co giãn font chữ tuỳ mình kéo.
- Dùng Insert Textbox - Simple text, rồi dán code từ VBA vào.
- Dùng Notepad++
Screen Shot 2023-06-09 at 15.35.10.png

Screen Shot 2023-06-09 at 15.36.28.png
Bài đã được tự động gộp:

À còn vụ "thụt dòng" trong code VBA nữa. Tôi thì dùng cái tool Smart Indenter của TQ cho nó nhanh.
File đính kèm bên dưới.

Screen Shot 2023-06-09 at 15.54.17.png
 

File đính kèm

  • SmartIndenterVBE-v2.76plus.rar
    1.5 MB · Đọc: 8
Lần chỉnh sửa cuối:
Upvote 0
Sao bác vất vả vụ này vậy. Có mấy cách hiển thị code trong Word đẹp mà.

- Dùng Insert - Open Document Text: cách này thì code sẽ nằm gọn trong khung tự co giãn font chữ tuỳ mình kéo.
- Dùng Insert Textbox - Simple text, rồi dán code từ VBA vào.
- Dùng Notepad++
View attachment 291242

View attachment 291243
Bạn có cách gì chép code trong file pdf sang Word mà định dạng thụt lề, tự xanh dòng ghi chú y như trong VBE mà không phải qua 2 - 3 thao tác được không? Tôi viết code làm thế cho nhanh vì biết bao nhiêu là code phải chép.

Vả lại như tôi đã nói, làm là để học nữa mà.
 
Upvote 0
Bạn có cách gì chép code trong file pdf sang Word mà định dạng thụt lề, tự xanh dòng ghi chú y như trong VBE mà không phải qua 2 - 3 thao tác được không? Tôi viết code làm thế cho nhanh vì biết bao nhiêu là code phải chép.

Vả lại như tôi đã nói, làm là để học nữa mà.
À tôi không để ý là bác copy Text từ file PDF sang chứ không phải từ VBE. Nếu vậy thì chỉ có sử dụng cái thủ tục tự tạo của bác để chỉnh sửa trực tiếp thôi.
Còn việc copy thủ công dán vào Notepadd++ sẽ giúp bác được 1 việc là: làm xanh dòng thông báo, đổi màu các từ khoá.
(vào Menu Language - chọn V - Visual basic)

Screen Shot 2023-06-09 at 16.06.13.png. ====> Screen Shot 2023-06-09 at 16.06.23.png
 
Upvote 0
Web KT

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

Back
Top Bottom