Ví dụ ta đang có trang tính như sau:Nhờ các anh chị trong GPE hướng dẫn cách sort dữ liệu mà trong bảng tính có những ô bị trộn Merge and center
Option Explicit
Sub SortMerge()
Dim eRw As Long, jJ As Long
Dim mRng As Range: Dim StrC As String
eRw = [I65500].End(xlUp).Row: Columns("I:I").Select
Selection.Insert Shift:=xlToRight:: [I1].Value = [h1].Value
For jJ = 2 To eRw
With Cells(jJ, "H")
If .MergeCells Then
If .Value <> "" And StrC <> .Value Then _
StrC = .Value
.Offset(, 1).Value = StrC
Else
.Offset(, 1).Value = .Value: StrC = ""
End If
End With
Next jJ
StrC = "": Application.DisplayAlerts = False
For jJ = 2 To eRw
With Cells(jJ, "I")
If .Value <> StrC And mRng Is Nothing Then
StrC = .Value: Set mRng = .Cells()
ElseIf .Value = StrC And Not mRng Is Nothing Then
Set mRng = Union(mRng, .Cells())
ElseIf .Value <> StrC And Not mRng Is Nothing Then
mRng.MergeCells = True
If .Value = .Offset(1).Value Then
Set mRng = .Cells()
Else
Set mRng = Nothing
End If
End If
End With
Next jJ
Columns("H:H").Delete Shift:=xlToLeft
Application.DisplayAlerts = True
End Sub
Theo tôi, bạn không nên sort khi dữ liệu có Merge and center (cho dù bạn can thiệp tự động bằng VBA hay Excel chấp nhận sort) vì mối quan hệ dữ liệu không được tổ chức dạng bảng dữ liệu (1 dòng là 1 mẫu tin, 1 cột là 1 loại dữ liệu) nên sau khi sort dữ liệu dễ bị mất mối quan hệ dòng, cột.Nhờ các anh chị trong GPE hướng dẫn cách sort dữ liệu mà trong bảng tính có những ô bị trộn Merge and center
Ví dụ ta đang có trang tính như sau:
H | I | J
DiaChi|QH|HTen
|CH|Vo An
01 Le Duan|Ch|A Sang
|V| Tran Anh
52 Le Loi|CH|V. Hong
|C|Le My
02 Le Lai|CH|Le Anh
|V|Do Thy
Khi chạy macro sau:
Ta có kết quả thể hiện ở bảng sau:PHP:Option Explicit Sub SortMerge() Dim eRw As Long, jJ As Long Dim mRng As Range: Dim StrC As String eRw = [I65500].End(xlUp).Row: Columns("I:I").Select Selection.Insert Shift:=xlToRight:: [I1].Value = [h1].Value For jJ = 2 To eRw +1 '<=|' With Cells(jJ, "H") If .MergeCells Then If .Value <> "" And StrC <> .Value Then _ StrC = .Value .Offset(, 1).Value = StrC Else .Offset(, 1).Value = .Value: StrC = "" End If End With Next jJ StrC = "": Application.DisplayAlerts = False For jJ = 2 To eRw With Cells(jJ, "I") If .Value <> StrC And mRng Is Nothing Then StrC = .Value: Set mRng = .Cells() ElseIf .Value = StrC And Not mRng Is Nothing Then Set mRng = Union(mRng, .Cells()) ElseIf .Value <> StrC And Not mRng Is Nothing Then mRng.MergeCells = True If .Value = .Offset(1).Value Then Set mRng = .Cells() Else Set mRng = Nothing End If End If End With Next jJ Columns("H:H").Delete Shift:=xlToLeft Application.DisplayAlerts = True End Sub
H | I | J
DiaChi|QH|HTen
|CH|Vo An
01 Le Duan|Ch|A Sang
|V| Tran Anh
52 Le Loi|CH|V. Hong
|C|Le My
02 Le Lai|CH|Le Anh
|V|Do Thy