Mã VBA để Đánh số Trang Liên tục + Tạo mục lục cho excel

1. Mở Trình chỉnh sửa VBA (VBA Editor)

  • Mở file Excel của bạn.
  • Nhấn tổ hợp phím Alt + F11.

2. Chèn Module mới và dán Mã

  • Trong cửa sổ Project – VBAProject, nhấp chuột phải vào dự án của Workbook hiện tại (ví dụ: VBAProject (Ten_file_cua_ban.xlsm)).
  • Chọn Insert →→ Module.
  • Dán đoạn mã sau vào Module vừa tạo:

Link tải mã: https://drive.google.com/file/d/1PQUPij28G59kJbgs2OZY8WV91GSgkvS8/view?usp=sharing

3. Chạy Macro

  1. Trong Trình chỉnh sửa VBA, đặt con trỏ vào bất kỳ đâu trong đoạn mã Sub ContinuousPageNumbering().
  2. Nhấn F5 hoặc nhấp vào nút Run Sub/UserForm (biểu tượng mũi tên xanh).

Kết quả

Macro sẽ tự động:

  1. Duyệt qua Sheet 1.
  2. Đếm số trang của Sheet 1 (ví dụ: 3 trang).
  3. Đặt số trang bắt đầu của Sheet 1 là 1.
  4. Lưu lại PageCount là 1+3=41+3=4.
  5. Duyệt qua Sheet 2.
  6. Đếm số trang của Sheet 2 (ví dụ: 5 trang).
  7. Đặt số trang bắt đầu của Sheet 2 là 4.
  8. Lưu lại PageCount là 4+5=94+5=9.
  9. Và cứ tiếp tục như vậy cho đến hết các Sheet.

Khi bạn vào Print Preview (Ctrl + P), bạn sẽ thấy số trang được đánh liên tiếp từ Sheet đầu tiên đến Sheet cuối cùng.

Coppy va dán đoạn mã sau vào trong excel

Ghi chú: Nội dung cần hiển thị ở mục lục là ở ô J1″

“Sub ChuyenFontVaMauChu()

' Khai báo biến đại diện cho từng Worksheet
Dim ws As Worksheet

' Lặp qua từng Worksheet trong Workbook hiện tại
For Each ws In ActiveWorkbook.Worksheets
    ' Đặt Font cho tất cả các ô trong Worksheet đó
    ws.Cells.Font.Name = "Times New Roman"

    ' Đặt màu chữ cho tất cả các ô thành màu Đen
    ws.Cells.Font.Color = vbBlack

    ' (Tùy chọn) Nếu bạn muốn đặt cỡ chữ là 12, hãy bỏ dấu nháy đơn (') ở dòng dưới
    ' ws.Cells.Font.Size = 12 
Next ws

MsgBox "Đã chuyển font sang Times New Roman và màu chữ sang màu đen thành công!", vbInformation

End Sub
Sub DanhSoTrangLienTuc()

' Khai báo biến
Dim ws As Worksheet
Dim sInput As String
Dim startPageNum As Long ' Số trang bắt đầu
Dim currentPageNum As Long ' Số trang hiện tại (dùng để tính toán liên tục)
Dim pagesInSheet As Long ' Số trang in của mỗi sheet

' ----------------------------------------------------------------
' BƯỚC 1: YÊU CẦU NGƯỜI DÙNG NHẬP SỐ TRANG BẮT ĐẦU
' ----------------------------------------------------------------

sInput = InputBox("Nhập số trang bắt đầu cho file Excel này (ví dụ: 101):", "Nhập Số Trang Bắt Đầu")

' Kiểm tra nếu người dùng nhấn Cancel hoặc để trống
If sInput = "" Then
    MsgBox "Đã hủy thao tác.", vbExclamation
    Exit Sub
End If

' Kiểm tra xem có phải là số dương hay không
If Not IsNumeric(sInput) Or CLng(sInput) < 1 Then
    MsgBox "Vui lòng nhập một số nguyên dương hợp lệ.", vbCritical
    Exit Sub
End If

startPageNum = CLng(sInput)
currentPageNum = startPageNum ' Khởi tạo số trang bắt đầu

' ----------------------------------------------------------------
' BƯỚC 2: LẶP QUA TỪNG SHEET VÀ THIẾT LẬP SỐ TRANG
' ----------------------------------------------------------------

' Tắt tính năng cập nhật màn hình để chạy nhanh hơn
Application.ScreenUpdating = False

For Each ws In ActiveWorkbook.Worksheets
    ' Kích hoạt sheet để đảm bảo Excel cập nhật Page Setup
    ws.Activate 

    With ws.PageSetup
        ' Đặt số trang bắt đầu cho sheet hiện tại
        .FirstPageNumber = currentPageNum

        ' Thiết lập Footer (Footer giữa là ví dụ, bạn có thể thay đổi)
        ' "&P" là mã đại diện cho số trang hiện tại
        ' "&N" là mã đại diện cho tổng số trang in
        .CenterFooter = "Trang &P" ' Hoặc "Trang &P / &N" nếu muốn hiển thị tổng số trang

        ' Đặt chế độ đánh số trang là tự động (nếu trước đó đã bị chỉnh sửa)
        .Order = xlDownThenOver 

        ' Tính toán số trang in thực tế của sheet hiện tại
        ' Phương pháp này đếm số lần ngắt trang ngang và cộng thêm 1
        ' LƯU Ý: Số này chỉ chính xác nếu Print Area, Scaling đã được thiết lập trước!
        pagesInSheet = ws.HPageBreaks.Count + 1 

        ' Nếu có cả ngắt trang đứng, cần tính cả VPageBreaks (phức tạp hơn)
        ' Cách đơn giản nhất để có số trang in *chính xác* là dùng Pages.Count
        ' nhưng Pages.Count chỉ hoạt động chính xác sau khi Preview hoặc In.
        ' Ta sẽ dùng phương pháp trên (HPageBreaks) và thêm một lời nhắc.

    End With

    ' Cập nhật số trang bắt đầu cho Sheet tiếp theo
    currentPageNum = currentPageNum + pagesInSheet

Next ws

' Bật lại tính năng cập nhật màn hình
Application.ScreenUpdating = True

' Thông báo hoàn thành
MsgBox "Đã thiết lập đánh số trang liên tục. Số trang bắt đầu của file là: " & startPageNum & vbCrLf & _
       "Số trang bắt đầu của sheet tiếp theo (sau file này) sẽ là: " & currentPageNum, vbInformation

End Sub
Sub Create_TOC_On_DANH_MUC_With_Global_PageNumber_V5_Final()

Dim ws As Worksheet
Dim tocSheet As Worksheet
Dim rowIndex As Long
Dim cellJ1Value As String
Dim startPageNumber As Long
Dim pagesInSheet As Long
Dim stt As Long

' --- Thiết lập Tên Sheet Mục Lục ---
Const TOC_SHEET_NAME As String = "DANH MUC"
' --- Thiết lập Font và Cỡ chữ ---
Const FONT_NAME As String = "Times New Roman"
Const FONT_SIZE As Long = 12
' ------------------------------------

' Tắt cập nhật màn hình
Application.ScreenUpdating = False

' Kiểm tra xem Sheet DANH MUC đã tồn tại chưa và thiết lập
On Error Resume Next
Set tocSheet = ThisWorkbook.Sheets(TOC_SHEET_NAME)
If tocSheet Is Nothing Then
    Set tocSheet = ThisWorkbook.Sheets.Add(Before:=ThisWorkbook.Sheets(1))
    tocSheet.Name = TOC_SHEET_NAME
End If
On Error GoTo 0

' 1. Xóa dữ liệu cũ, thiết lập Font & Cỡ chữ chung
Application.DisplayAlerts = False
tocSheet.Cells.ClearContents
Application.DisplayAlerts = True

With tocSheet.Cells
    .Font.Name = FONT_NAME
    .Font.Size = FONT_SIZE
End With

' 2. Thiết lập Tiêu đề cột
With tocSheet
    ' Tiêu đề chính
    .Range("A1").Value = "MỤC LỤC TRANG GIẤY"
    .Range("A1").Font.Bold = True
    .Range("A1").Font.Size = 16

    ' Tiêu đề cột (Bắt đầu từ hàng 3)
    .Range("A3").Value = "STT"                                      ' Cột A: STT
    .Range("B3").Value = "Tên Trang Tính (Nội dung)"                ' Cột B: Tên Sheet
    .Range("C3").Value = "Nội dung ô J1"                            ' Cột C: Nội dung J1
    .Range("D3").Value = "Trang"                                    ' Cột D: Trang

    ' Định dạng Tiêu đề cột
    .Range("A3:D3").Font.Bold = True
    .Range("A3:D3").Interior.Color = RGB(220, 220, 220)
    .Range("A3:D3").Borders.LineStyle = xlContinuous
    .Range("A3:D3").HorizontalAlignment = xlCenter

    ' Thiết lập độ rộng cột
    .Columns("A").ColumnWidth = 8      ' STT
    .Columns("B").ColumnWidth = 35     ' Tên Trang Tính
    .Columns("C").ColumnWidth = 35     ' Nội dung J1
    .Columns("D").ColumnWidth = 10     ' Trang
End With

rowIndex = 4 ' Bắt đầu ghi dữ liệu từ hàng thứ 4
stt = 1      ' Khởi tạo số thứ tự

' 3. Duyệt qua tất cả các sheet trong Workbook
For Each ws In ThisWorkbook.Worksheets
    ' Bỏ qua sheet Mục Lục (DANH MUC)
    If ws.Name <> TOC_SHEET_NAME Then

        ' 1. GHI STT (Cột A)
        tocSheet.Cells(rowIndex, 1).Value = stt

        ' 2. TẠO HYPERLINK (Cột B: Tên Trang Tính)
        tocSheet.Hyperlinks.Add _
            Anchor:=tocSheet.Cells(rowIndex, 2), _
            Address:="", _
            SubAddress:="'" & ws.Name & "'!A1", _
            TextToDisplay:=ws.Name

        ' 3. Lấy giá trị của ô J1 và ghi vào cột C
        On Error Resume Next
        cellJ1Value = ws.Range("J1").Value
        If Err.Number <> 0 Then
            cellJ1Value = "(Lỗi đọc J1)"
            Err.Clear
        End If
        On Error GoTo 0

        tocSheet.Cells(rowIndex, 3).Value = cellJ1Value

        ' 4. Lấy và GHI SỐ TRANG BẮT ĐẦU (Cột D)
        startPageNumber = ws.PageSetup.FirstPageNumber
        If startPageNumber = xlAutomatic Then startPageNumber = 1 

        tocSheet.Cells(rowIndex, 4).Value = startPageNumber

        ' Tăng biến đếm
        rowIndex = rowIndex + 1
        stt = stt + 1
    End If
Next ws

' 5. Hoàn tất và Định dạng
tocSheet.Range("A4:A" & rowIndex - 1).HorizontalAlignment = xlCenter ' Căn giữa STT
tocSheet.Range("D4:D" & rowIndex - 1).HorizontalAlignment = xlCenter ' Căn giữa số trang

tocSheet.Activate 

Application.ScreenUpdating = True

MsgBox "Đã tạo Mục Lục thành công với STT và font Times New Roman 12!", vbInformation

End Sub

Leave a Reply

Your email address will not be published. Required fields are marked *