Tặng các bạn code AutoFit Row với Merge Cells (nhiều hàng, nhiều cột).

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,718
Giới tính
Nam
Các bài mà trước đây mà nhiều người viết trong đó có tôi đều cho ra kết quả, nhưng thật sự nó vẫn chưa fit hoàn toàn, có khi dư chiều cao hàng (Height) rất nhiều.

Sau khi ngồi tính toán lại tôi viết thủ tục dưới đây, nhằm fit lại những cái chênh lệch đó, đồng thời chúng ta có thể Fit cho các vùng merge cells nhiều hàng, nhiều cột.

Thủ tục:

Mã:
Sub MergeCellFit(ByVal MergeCells As Range)
    Dim Diff As Single
    Dim FirstCell As Range, MergeCellArea As Range
    Dim Col As Long, ColCount As Long, RowCount As Long
    Dim FirstCellWidth As Double, FirstCellHeight As Double, MergeCellWidth As Double
    If MergeCells.Count = 1 Then
        Set MergeCellArea = MergeCells.MergeArea
    Else
        Set MergeCellArea = MergeCells
    End If
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    With MergeCellArea
        ColCount = .Columns.Count
        RowCount = .Rows.Count
        .WrapText = True
        If RowCount = 1 And ColCount = 1 Then
            .EntireRow.AutoFit
            GoTo ExitSub
        End If
        Set FirstCell = .Cells(1, 1)
        FirstCellWidth = FirstCell.ColumnWidth
        Diff = 0.75
        For Col = 1 To ColCount
            MergeCellWidth = MergeCellWidth + .Cells(1, Col).ColumnWidth + Diff
        Next
        .MergeCells = False
        FirstCell.ColumnWidth = MergeCellWidth - Diff
        .EntireRow.AutoFit
        FirstCellHeight = FirstCell.RowHeight
        .MergeCells = True
        FirstCell.ColumnWidth = FirstCellWidth
        FirstCellHeight = FirstCellHeight / RowCount
        .RowHeight = FirstCellHeight
    End With
ExitSub:
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Cách thực hiện:

Ví dụ khối ô MergeCell cần AutoFit là: C6:L9

Ta chỉ cần lấy tham chiếu ô đầu tiên là C6 (dùng cả C6:L9 cũng OK)

Và thủ tục chạy chỉ như sau:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]C6[/COLOR][/B]")

Hoặc:

Mã:
MergeCellFit Range("[B]C6:L9[/B]")

Hoặc thậm chí chỉ là một cell nào đó trong khối mergecell:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]E6[/COLOR][/B]")
 

File đính kèm

  • AutoFitMerge.xls
    46 KB · Đọc: 915
không biết mình có hiểu sai ý bạn không, bạn thử code này
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A:B").EntireColumn.AutoFit
End Sub
với A:B là cột cần fit
 
Upvote 0
không biết mình có hiểu sai ý bạn không, bạn thử code này
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A:B").EntireColumn.AutoFit
End Sub
với A:B là cột cần fit
Thật ra dùng AutoFit vẫn chưa ăn thua đâu, thấy vậy chứ không vậy đâu! Và tôi cũng có một giải pháp, tuy không nói là tuyệt đối, nhưng đỡ hơn 90%.

Ý của tôi là ta vẫn AutoFit các cột, nhưng ta cho thêm 1 gia tăng độ rộng của cột, như thế sẽ có thể tránh được tình trạng này.

Code chính:

Mã:
Sub AutoFitColumn(ByVal Column As Range, ByVal ExtraWidth As Single)
    Column.EntireColumn.AutoFit
    Dim c As Integer
    For c = 1 To Column.Columns.Count
        Column(c).ColumnWidth = Column(c).ColumnWidth + ExtraWidth
    Next
End Sub

Và cách thực hiện:

Mã:
Sub Test()
    AutoFitColumn Range("A:D"), 1.5
End Sub

Sau khi thực hiện code, các bạn cũng nên Print Preview để kiểm tra xem giản nở độ rộng có ảnh hưởng đến bản in của mình hay không rồi mới in nhé.
 
Upvote 0
Các bài mà trước đây mà nhiều người viết trong đó có tôi đều cho ra kết quả, nhưng thật sự nó vẫn chưa fit hoàn toàn, có khi dư chiều cao hàng (Height) rất nhiều.

Sau khi ngồi tính toán lại tôi viết thủ tục dưới đây, nhằm fit lại những cái chênh lệch đó, đồng thời chúng ta có thể Fit cho các vùng merge cells nhiều hàng, nhiều cột.

Thủ tục:

Mã:
Sub MergeCellFit(ByVal MergeCells As Range)
    Dim Diff As Single
    Dim FirstCell As Range, MergeCellArea As Range
    Dim Col As Long, ColCount As Long, RowCount As Long
    Dim FirstCellWidth As Double, FirstCellHeight As Double, MergeCellWidth As Double
    If MergeCells.Count = 1 Then
        Set MergeCellArea = MergeCells.MergeArea
    Else
        Set MergeCellArea = MergeCells
    End If
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    With MergeCellArea
        ColCount = .Columns.Count
        RowCount = .Rows.Count
        .WrapText = True
        If RowCount = 1 And ColCount = 1 Then
            .EntireRow.AutoFit
            GoTo ExitSub
        End If
        Set FirstCell = .Cells(1, 1)
        FirstCellWidth = FirstCell.ColumnWidth
        Diff = 0.75
        For Col = 1 To ColCount
            MergeCellWidth = MergeCellWidth + .Cells(1, Col).ColumnWidth + Diff
        Next
        .MergeCells = False
        FirstCell.ColumnWidth = MergeCellWidth - Diff
        .EntireRow.AutoFit
        FirstCellHeight = FirstCell.RowHeight
        .MergeCells = True
        FirstCell.ColumnWidth = FirstCellWidth
        FirstCellHeight = FirstCellHeight / RowCount
        .RowHeight = FirstCellHeight
    End With
ExitSub:
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Cách thực hiện:

Ví dụ khối ô MergeCell cần AutoFit là: C6:L9

Ta chỉ cần lấy tham chiếu ô đầu tiên là C6 (dùng cả C6:L9 cũng OK)

Và thủ tục chạy chỉ như sau:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]C6[/COLOR][/B]")

Hoặc:

Mã:
MergeCellFit Range("[B]C6:L9[/B]")

Hoặc thậm chí chỉ là một cell nào đó trong khối mergecell:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]E6[/COLOR][/B]")

Vậy khi em chọn nhiều range ở nhiều sheet khác nhau (cố định trước) thì như thế nào bác nhỉ
 
Upvote 0
Các bài mà trước đây mà nhiều người viết trong đó có tôi đều cho ra kết quả, nhưng thật sự nó vẫn chưa fit hoàn toàn, có khi dư chiều cao hàng (Height) rất nhiều.

Sau khi ngồi tính toán lại tôi viết thủ tục dưới đây, nhằm fit lại những cái chênh lệch đó, đồng thời chúng ta có thể Fit cho các vùng merge cells nhiều hàng, nhiều cột.

Thủ tục:

Mã:
Sub MergeCellFit(ByVal MergeCells As Range)
    Dim Diff As Single
    Dim FirstCell As Range, MergeCellArea As Range
    Dim Col As Long, ColCount As Long, RowCount As Long
    Dim FirstCellWidth As Double, FirstCellHeight As Double, MergeCellWidth As Double
    If MergeCells.Count = 1 Then
        Set MergeCellArea = MergeCells.MergeArea
    Else
        Set MergeCellArea = MergeCells
    End If
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    With MergeCellArea
        ColCount = .Columns.Count
        RowCount = .Rows.Count
        .WrapText = True
        If RowCount = 1 And ColCount = 1 Then
            .EntireRow.AutoFit
            GoTo ExitSub
        End If
        Set FirstCell = .Cells(1, 1)
        FirstCellWidth = FirstCell.ColumnWidth
        Diff = 0.75
        For Col = 1 To ColCount
            MergeCellWidth = MergeCellWidth + .Cells(1, Col).ColumnWidth + Diff
        Next
        .MergeCells = False
        FirstCell.ColumnWidth = MergeCellWidth - Diff
        .EntireRow.AutoFit
        FirstCellHeight = FirstCell.RowHeight
        .MergeCells = True
        FirstCell.ColumnWidth = FirstCellWidth
        FirstCellHeight = FirstCellHeight / RowCount
        .RowHeight = FirstCellHeight
    End With
ExitSub:
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Cách thực hiện:

Ví dụ khối ô MergeCell cần AutoFit là: C6:L9

Ta chỉ cần lấy tham chiếu ô đầu tiên là C6 (dùng cả C6:L9 cũng OK)

Và thủ tục chạy chỉ như sau:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]C6[/COLOR][/B]")

Hoặc:

Mã:
MergeCellFit Range("[B]C6:L9[/B]")

Hoặc thậm chí chỉ là một cell nào đó trong khối mergecell:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]E6[/COLOR][/B]")
anh giúp em code chỉnh file này với
áp dụng code của anh chỉnh mà nó không chính xác
 

File đính kèm

  • hoi.xlsx
    12.8 KB · Đọc: 18
Upvote 0
Các bài mà trước đây mà nhiều người viết trong đó có tôi đều cho ra kết quả, nhưng thật sự nó vẫn chưa fit hoàn toàn, có khi dư chiều cao hàng (Height) rất nhiều.

Sau khi ngồi tính toán lại tôi viết thủ tục dưới đây, nhằm fit lại những cái chênh lệch đó, đồng thời chúng ta có thể Fit cho các vùng merge cells nhiều hàng, nhiều cột.

Thủ tục:

Mã:
Sub MergeCellFit(ByVal MergeCells As Range)
    Dim Diff As Single
    Dim FirstCell As Range, MergeCellArea As Range
    Dim Col As Long, ColCount As Long, RowCount As Long
    Dim FirstCellWidth As Double, FirstCellHeight As Double, MergeCellWidth As Double
    If MergeCells.Count = 1 Then
        Set MergeCellArea = MergeCells.MergeArea
    Else
        Set MergeCellArea = MergeCells
    End If
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    With MergeCellArea
        ColCount = .Columns.Count
        RowCount = .Rows.Count
        .WrapText = True
        If RowCount = 1 And ColCount = 1 Then
            .EntireRow.AutoFit
            GoTo ExitSub
        End If
        Set FirstCell = .Cells(1, 1)
        FirstCellWidth = FirstCell.ColumnWidth
        Diff = 0.75
        For Col = 1 To ColCount
            MergeCellWidth = MergeCellWidth + .Cells(1, Col).ColumnWidth + Diff
        Next
        .MergeCells = False
        FirstCell.ColumnWidth = MergeCellWidth - Diff
        .EntireRow.AutoFit
        FirstCellHeight = FirstCell.RowHeight
        .MergeCells = True
        FirstCell.ColumnWidth = FirstCellWidth
        FirstCellHeight = FirstCellHeight / RowCount
        .RowHeight = FirstCellHeight
    End With
ExitSub:
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Cách thực hiện:

Ví dụ khối ô MergeCell cần AutoFit là: C6:L9

Ta chỉ cần lấy tham chiếu ô đầu tiên là C6 (dùng cả C6:L9 cũng OK)

Và thủ tục chạy chỉ như sau:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]C6[/COLOR][/B]")

Hoặc:

Mã:
MergeCellFit Range("[B]C6:L9[/B]")

Hoặc thậm chí chỉ là một cell nào đó trong khối mergecell:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]E6[/COLOR][/B]")
Chào anh chị! em đang dùng tác phẩm code của anh bị lỗi như nhau

Chào anh chị! nhờ anh chị xem hộ em code file này: dòng muốn dãn đánh số ở AC, AE
+ Các dòng khác chạy bình thường, chỉ riêng dòng 19 bôi đỏ như dưới hình là chạy lỗi, nhờ anh chị xem giúp em.
++ Lỗi em phát hiện
a. Đại diện đơn vị...
cho số 1 số kí tự nữa thì được
VD: 1a. Đại diện đơn vị
Nhờ anh chị xem lại code để loại bỏ lỗi đó ạ. em xin cảm ơn

Untitled.png
 

File đính kèm

  • BB Dan dong.xlsm
    106.5 KB · Đọc: 37
Upvote 0
Các bài mà trước đây mà nhiều người viết trong đó có tôi đều cho ra kết quả, nhưng thật sự nó vẫn chưa fit hoàn toàn, có khi dư chiều cao hàng (Height) rất nhiều.

Sau khi ngồi tính toán lại tôi viết thủ tục dưới đây, nhằm fit lại những cái chênh lệch đó, đồng thời chúng ta có thể Fit cho các vùng merge cells nhiều hàng, nhiều cột.

Thủ tục:

Mã:
Sub MergeCellFit(ByVal MergeCells As Range)
    Dim Diff As Single
    Dim FirstCell As Range, MergeCellArea As Range
    Dim Col As Long, ColCount As Long, RowCount As Long
    Dim FirstCellWidth As Double, FirstCellHeight As Double, MergeCellWidth As Double
    If MergeCells.Count = 1 Then
        Set MergeCellArea = MergeCells.MergeArea
    Else
        Set MergeCellArea = MergeCells
    End If
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    With MergeCellArea
        ColCount = .Columns.Count
        RowCount = .Rows.Count
        .WrapText = True
        If RowCount = 1 And ColCount = 1 Then
            .EntireRow.AutoFit
            GoTo ExitSub
        End If
        Set FirstCell = .Cells(1, 1)
        FirstCellWidth = FirstCell.ColumnWidth
        Diff = 0.75
        For Col = 1 To ColCount
            MergeCellWidth = MergeCellWidth + .Cells(1, Col).ColumnWidth + Diff
        Next
        .MergeCells = False
        FirstCell.ColumnWidth = MergeCellWidth - Diff
        .EntireRow.AutoFit
        FirstCellHeight = FirstCell.RowHeight
        .MergeCells = True
        FirstCell.ColumnWidth = FirstCellWidth
        FirstCellHeight = FirstCellHeight / RowCount
        .RowHeight = FirstCellHeight
    End With
ExitSub:
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Cách thực hiện:

Ví dụ khối ô MergeCell cần AutoFit là: C6:L9

Ta chỉ cần lấy tham chiếu ô đầu tiên là C6 (dùng cả C6:L9 cũng OK)

Và thủ tục chạy chỉ như sau:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]C6[/COLOR][/B]")

Hoặc:

Mã:
MergeCellFit Range("[B]C6:L9[/B]")

Hoặc thậm chí chỉ là một cell nào đó trong khối mergecell:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]E6[/COLOR][/B]")

Lào sao để gắn nút được ạ, với có lệnh tự động không Bác :3
 
Upvote 0
Thật ra dùng AutoFit vẫn chưa ăn thua đâu, thấy vậy chứ không vậy đâu! Và tôi cũng có một giải pháp, tuy không nói là tuyệt đối, nhưng đỡ hơn 90%.

Ý của tôi là ta vẫn AutoFit các cột, nhưng ta cho thêm 1 gia tăng độ rộng của cột, như thế sẽ có thể tránh được tình trạng này.

Code chính:

Mã:
Sub AutoFitColumn(ByVal Column As Range, ByVal ExtraWidth As Single)
    Column.EntireColumn.AutoFit
    Dim c As Integer
    For c = 1 To Column.Columns.Count
        Column(c).ColumnWidth = Column(c).ColumnWidth + ExtraWidth
    Next
End Sub

Và cách thực hiện:

Mã:
Sub Test()
    AutoFitColumn Range("A:D"), 1.5
End Sub

Sau khi thực hiện code, các bạn cũng nên Print Preview để kiểm tra xem giản nở độ rộng có ảnh hưởng đến bản in của mình hay không rồi mới in nhé.
Sao mình thử ko đc nhỉ.
 
Upvote 0
Các bài mà trước đây mà nhiều người viết trong đó có tôi đều cho ra kết quả, nhưng thật sự nó vẫn chưa fit hoàn toàn, có khi dư chiều cao hàng (Height) rất nhiều.

Sau khi ngồi tính toán lại tôi viết thủ tục dưới đây, nhằm fit lại những cái chênh lệch đó, đồng thời chúng ta có thể Fit cho các vùng merge cells nhiều hàng, nhiều cột.

Thủ tục:

Mã:
Sub MergeCellFit(ByVal MergeCells As Range)
    Dim Diff As Single
    Dim FirstCell As Range, MergeCellArea As Range
    Dim Col As Long, ColCount As Long, RowCount As Long
    Dim FirstCellWidth As Double, FirstCellHeight As Double, MergeCellWidth As Double
    If MergeCells.Count = 1 Then
        Set MergeCellArea = MergeCells.MergeArea
    Else
        Set MergeCellArea = MergeCells
    End If
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    With MergeCellArea
        ColCount = .Columns.Count
        RowCount = .Rows.Count
        .WrapText = True
        If RowCount = 1 And ColCount = 1 Then
            .EntireRow.AutoFit
            GoTo ExitSub
        End If
        Set FirstCell = .Cells(1, 1)
        FirstCellWidth = FirstCell.ColumnWidth
        Diff = 0.75
        For Col = 1 To ColCount
            MergeCellWidth = MergeCellWidth + .Cells(1, Col).ColumnWidth + Diff
        Next
        .MergeCells = False
        FirstCell.ColumnWidth = MergeCellWidth - Diff
        .EntireRow.AutoFit
        FirstCellHeight = FirstCell.RowHeight
        .MergeCells = True
        FirstCell.ColumnWidth = FirstCellWidth
        FirstCellHeight = FirstCellHeight / RowCount
        .RowHeight = FirstCellHeight
    End With
ExitSub:
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Cách thực hiện:

Ví dụ khối ô MergeCell cần AutoFit là: C6:L9

Ta chỉ cần lấy tham chiếu ô đầu tiên là C6 (dùng cả C6:L9 cũng OK)

Và thủ tục chạy chỉ như sau:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]C6[/COLOR][/B]")

Hoặc:

Mã:
MergeCellFit Range("[B]C6:L9[/B]")

Hoặc thậm chí chỉ là một cell nào đó trong khối mergecell:

Mã:
MergeCellFit Range("[B][COLOR=#FF0000]E6[/COLOR][/B]")
Anh cho em hỏi. giờ em muốn chỉnh thêm ô và khối ô ở sheet2 thì chỉnh lại code thế nào ạ
 

File đính kèm

  • AutoFitMerge2.xls
    46 KB · Đọc: 15
Upvote 0
Nhờ anh chị làm giúp em file này với
 

File đính kèm

  • AutoFitMerge (cần tạo code giúp).xls
    238 KB · Đọc: 17
Upvote 0
Giả sử trong khối ô từ C1:C14 có chứa Merge thì dùng thủ tục này:

Mã:
Sub FitAll()
    Dim Cls As Range
    For Each Cls In Range("C1:C14")
        MergeCellFit Cls
    Next
End Sub

Tức nó chỉ nhận các ô đầu chứa Merge mà thực hiện theo hàng đó thôi.
Anh ơi đoạn code này copy vào sheet hay vào module đó ạ?
Em chạy code thấy báo lỗi như hình sau là do đâu vậy anh?1111.png
Nhờ anh hướng dẫn chi tiết giúp em mới ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Chào tất cả ae, tôi cũng đang quan tâm việc này và thấy vấn đề chưa được giải quyết triệt để, ví dụ tôi muốn autofit nhiều dòng (đã trộn nhiều cột " Merge") thì làm thế nào?
 
Upvote 0
Chào anh,

Anh cho em hỏi, Excel có làm được giãn các dòng như trong word không?

Untitled.png
 
Upvote 0
Web KT

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

Back
Top Bottom