Sub merge()
Dim LR As Long, i As Long, Arr As Range, Rng As Range
LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row
Set Arr = Sheets("du lieu").Range("B2:B" & LR)
For Each Rng In Arr
With Sheets("du lieu")
If Rng = .Range("M2") Or Rng = .Range("N2") Or Rng = .Range("O2") Then
Rng.Offset(0, -1).Value = "A11"
End If
If Rng = .Range("M3") Or Rng = .Range("N3") Or Rng = .Range("O3") Then
Rng.Offset(0, -1).Value = "A12"
End If
End With
Next Rng
'-------------meger
Application.DisplayAlerts = False
For i = LR To 2 Step -1
With Sheets("du lieu")
If Cells(i, "A") = Cells(i + 1, "A") Then
Range(Cells(i, "A"), Cells(i + 1, "A")).merge
End If
End With
Next i
Application.DisplayAlerts = True
Set Arr = Nothing
End Sub
cảm ơn bạn nhé,cho mình hỏi là 2 code này ý nghĩa là gì hả bạn ?tạm vậy đi
Mã:Sub merge() Dim LR As Long, i As Long, Arr As Range, Rng As Range LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row Set Arr = Sheets("du lieu").Range("B2:B" & LR) For Each Rng In Arr With Sheets("du lieu") If Rng = .Range("M2") Or Rng = .Range("N2") Or Rng = .Range("O2") Then Rng.Offset(0, -1).Value = "A11" End If If Rng = .Range("M3") Or Rng = .Range("N3") Or Rng = .Range("O3") Then Rng.Offset(0, -1).Value = "A12" End If End With Next Rng '-------------meger Application.DisplayAlerts = False For i = LR To 2 Step -1 With Sheets("du lieu") If Cells(i, "A") = Cells(i + 1, "A") Then Range(Cells(i, "A"), Cells(i + 1, "A")).merge End If End With Next i Application.DisplayAlerts = True Set Arr = Nothing End Sub
cảm ơn bạn nhé,cho mình hỏi là 2 code này ý nghĩa là gì hả bạn ?
LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row
Set Arr = Sheets("du lieu").Range("B2:B" & LR)
LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row '==> Dòng cuối cùng có dữ liệu của cột B
Set Arr = Sheets("du lieu").Range("B2:B" & LR) ' ==> đặt biến mảng thôi
trongbaif chỉ có 2 "STT" nếu có tới 10 "STT" thì đoạn code này phải làm 10 lần hả bạn?tạm vậy đi
Mã:Sub merge() Dim LR As Long, i As Long, Arr As Range, Rng As Range LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row Set Arr = Sheets("du lieu").Range("B2:B" & LR) For Each Rng In Arr With Sheets("du lieu") If Rng = .Range("M2") Or Rng = .Range("N2") Or Rng = .Range("O2") Then Rng.Offset(0, -1).Value = "A11" End If If Rng = .Range("M3") Or Rng = .Range("N3") Or Rng = .Range("O3") Then Rng.Offset(0, -1).Value = "A12" End If End With Next Rng '-------------meger Application.DisplayAlerts = False For i = LR To 2 Step -1 With Sheets("du lieu") If Cells(i, "A") = Cells(i + 1, "A") Then Range(Cells(i, "A"), Cells(i + 1, "A")).merge End If End With Next i Application.DisplayAlerts = True Set Arr = Nothing End Sub
sửa lại thànhtrongbaif chỉ có 2 "STT" nếu có tới 10 "STT" thì đoạn code này phải làm 10 lần hả bạn?
If Rng = .Range("M2") Or Rng = .Range("N2") Or Rng = .Range("O2") Then
Rng.Offset(0, -1).Value = "A11"
End If
If Rng = .Range("M3") Or Rng = .Range("N3") Or Rng = .Range("O3") Then
Rng.Offset(0, -1).Value = "A12"
Sub merge()
Dim LR As Long, i As Long, Arr As Range, Rng As Range
Dim k As Long, LR1 As Long
LR1 = Sheets("du lieu").Cells(Rows.Count, "L").End(xlUp).Row
LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row
Set Arr = Sheets("du lieu").Range("B2:B" & LR)
For Each Rng In Arr
With Sheets("du lieu")
For k = 2 To LR1
If Rng = .Range("M" & k) Or Rng = .Range("N" & k) Or Rng = .Range("O" & k) Then
Rng.Offset(0, -1).Value = .Range("L" & k)
End If
Next k
End With
Next Rng
'-------------meger
Application.DisplayAlerts = False
For i = LR To 2 Step -1
With Sheets("du lieu")
If .Cells(i, "A") = .Cells(i - 1, "A") Then
.Range(Cells(i, "A"), Cells(i - 1, "A")).merge
End If
End With
Next i
Application.DisplayAlerts = True
Set Arr = Nothing
End Sub
i= LR -1For i = LR To 2 Step -1
em cảm ơn anh ại= LR -1
cảm ơn nhasửa lại thành
Mã:Sub merge() Dim LR As Long, i As Long, Arr As Range, Rng As Range Dim k As Long, LR1 As Long LR1 = Sheets("du lieu").Cells(Rows.Count, "L").End(xlUp).Row LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row Set Arr = Sheets("du lieu").Range("B2:B" & LR) For Each Rng In Arr With Sheets("du lieu") For k = 2 To LR1 If Rng = .Range("M" & k) Or Rng = .Range("N" & k) Or Rng = .Range("O" & k) Then Rng.Offset(0, -1).Value = .Range("L" & k) End If Next k End With Next Rng '-------------meger Application.DisplayAlerts = False For i = LR To 2 Step -1 With Sheets("du lieu") If .Cells(i, "A") = .Cells(i - 1, "A") Then .Range(Cells(i, "A"), Cells(i - 1, "A")).merge End If End With Next i Application.DisplayAlerts = True Set Arr = Nothing End Sub
từ Rng lùi lại "1" cột và "0" dòng, đặt giá trị của ô đó là bằng ".Range("L" & k)"cảm ơn nha
mà code này nó có ý nghĩa gì vậy bạn ?
Rng.Offset(0, -1).Value = .Range("L" & k)
Em tưởng cái Arr là Range chứ. Sao nó lại là mảng ạMã:LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row '==> Dòng cuối cùng có dữ liệu của cột B Set Arr = Sheets("du lieu").Range("B2:B" & LR) ' ==> đặt biến mảng thôi
Srr là RangeEm tưởng cái Arr là Range chứ. Sao nó lại là mảng ạ
bạn ơi hiện tại code mà bạn viết nó chỉ Merge theo số lượng cấu kiện ví dụ số lượng cấu kiện là 3 thì nó chỉ merge là 3,mà nó không thể nào nhận định được tên cấu kiệnSrr là Range
Minh ko hiểu ý bạn lắm. Nghĩa là tên cấu kiện không liền nhau đúng ko?bạn ơi hiện tại code mà bạn viết nó chỉ Merge theo số lượng cấu kiện ví dụ số lượng cấu kiện là 3 thì nó chỉ merge là 3,mà nó không thể nào nhận định được tên cấu kiện
bạn có thể giúp mình làm cho nó nhận định được tên cấu kiện để merge ko ?
cảm ơn bạn nhé
Hị hị trên Excel tối kỵ là hòa ô mừ anhMinh ko hiểu ý bạn lắm. Nghĩa là tên cấu kiện không liền nhau đúng ko?
đúng rồi bạn, dữ liệu ở cột "B"sau khi merge nó phải liền nhau, bạn có thể tham khảo sheet"KET QUA mong muon" mà mình gửi kèm theoMinh ko hiểu ý bạn lắm. Nghĩa là tên cấu kiện không liền nhau đúng ko?
Cảm ơn nhé. Thực ra file của mình cũng ít khi mẻge lắmHị hị trên Excel tối kỵ là hòa ô mừ anh
Dạ. Em cũng theo dõi Topic này từ khi Chủ Topic đăng bài. Nhưng em thấy cái gì gì ấy (Khó nói). Vì thấy Anh khổ cực em nhắc vậy thui. Có gì anh bỏ qua cho em nhaCảm ơn nhé. Thực ra file của mình cũng ít khi mẻge lắm
Khổ gì đâu. Thời gian rảnh nen mình chon làm những gì mình thích thôi màDạ. Em cũng theo dõi Topic này từ khi Chủ Topic đăng bài. Nhưng em thấy cái gì gì ấy (Khó nói). Vì thấy Anh khổ cực em nhắc vậy thui. Có gì anh bỏ qua cho em nha
vậy thêm 1 bước sort nữa trước khi chạy đoạn code merge là được mà, bạn biết record macro chứ?đúng rồi bạn, dữ liệu ở cột "B"sau khi merge nó phải liền nhau, bạn có thể tham khảo sheet"KET QUA mong muon" mà mình gửi kèm theo
ok bạn mình biết rồi, cảm ơn nhiều nhévậy thêm 1 bước sort nữa trước khi chạy đoạn code merge là được mà, bạn biết record macro chứ?
cái này củng ko được vì số cấu kiện nó sắp xếp ko theo thứ tựvậy thêm 1 bước sort nữa trước khi chạy đoạn code merge là được mà, bạn biết record macro chứ?
bạn thử code này xemok bạn mình biết rồi, cảm ơn nhiều nhé
Bài đã được tự động gộp:
cái này củng ko được vì số cấu kiện nó sắp xếp ko theo thứ tự
sub merge
Dim LR As Long, i As Long, Arr As Range, Rng As Range
Dim k As Long, LR1 As Long
LR1 = Sheets("du lieu").Cells(Rows.Count, "L").End(xlUp).Row
LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row
Sheets("du lieu").Range("A2:A" & LR).UnMerge
Set Arr = Sheets("du lieu").Range("B2:B" & LR)
For Each Rng In Arr
With Sheets("du lieu")
For k = 2 To LR1
If Rng = .Range("L" & k) Or Rng = .Range("M" & k) Or Rng = .Range("N" & k) Then
Rng.Offset(0, -1).Value = .Range("K" & k)
End If
Next k
End With
Next Rng
'---------- sort
Sheet5.Range("A2:B" & LR).Sort [B2], xlAscending, [A2], Value, xlAscending
'-------------meger
Application.DisplayAlerts = False
For i = LR To 2 Step -1
With Sheets("du lieu")
If .Cells(i, "A") = .Cells(i - 1, "A") Then
.Range(Cells(i, "A"), Cells(i - 1, "A")).merge
End If
End With
Next i
Application.DisplayAlerts = True
Set Arr = Nothing
end sub
VÌ DỬ LIỆU TRONG BẢNG RANGE(K1:N3) với STT "A12" có các cấu kiện được sắp xếp theo từ B114-B109-B108bạn thử code này xem
(xem thêm file đính kèm vì vùng dữ liệu của bạn đã thay đổi)
Mã:sub merge Dim LR As Long, i As Long, Arr As Range, Rng As Range Dim k As Long, LR1 As Long LR1 = Sheets("du lieu").Cells(Rows.Count, "L").End(xlUp).Row LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row Sheets("du lieu").Range("A2:A" & LR).UnMerge Set Arr = Sheets("du lieu").Range("B2:B" & LR) For Each Rng In Arr With Sheets("du lieu") For k = 2 To LR1 If Rng = .Range("L" & k) Or Rng = .Range("M" & k) Or Rng = .Range("N" & k) Then Rng.Offset(0, -1).Value = .Range("K" & k) End If Next k End With Next Rng '---------- sort Sheet5.Range("A2:B" & LR).Sort [B2], xlAscending, [A2], Value, xlAscending '-------------meger Application.DisplayAlerts = False For i = LR To 2 Step -1 With Sheets("du lieu") If .Cells(i, "A") = .Cells(i - 1, "A") Then .Range(Cells(i, "A"), Cells(i - 1, "A")).merge End If End With Next i Application.DisplayAlerts = True Set Arr = Nothing end sub
mình nhầm khúc này, sorry ban nhavậy sao sheet kết quả mong muốn lại viết như vậy?
View attachment 204045
Giải pháp của mình đây,mình nhầm khúc này, sorry ban nha
sub merge()
Dim LR As Long, i As Long, Arr As Range, Rng As Range
Dim k As Long, LR1 As Long
LR1 = Sheets("du lieu").Cells(Rows.Count, "L").End(xlUp).Row
LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row
Sheets("du lieu").Range("A2:A" & LR).UnMerge
Set Arr = Sheets("du lieu").Range("B2:B" & LR)
For Each Rng In Arr
With Sheets("du lieu")
For k = 2 To LR1
If Rng.Value = .Range("L" & k).Value Or Rng.Value = .Range("M" & k).Value Or Rng.Value = .Range("N" & k).Value Then
Rng.Offset(0, -1).Value = .Range("K" & k)
End If
If Rng.Value = .Range("L" & k).Value Then
Rng.Font.Color = 100
End If
If Rng.Value = .Range("M" & k).Value Then
Rng.Font.Color = 2000
End If
If Rng.Value = .Range("N" & k).Value Then
Rng.Font.Color = 30000
End If
Next k
End With
Next Rng
'---------- sort
Sheet5.Sort.SortFields.Clear
With ActiveSheet.Sort
.SortFields.Add Key:=[A2], SortOn:=xlSortOnValues, Order:=xlAscending
.SortFields.Add([B2], xlSortOnFontColor).SortOnValue.Color = 100
.SortFields.Add([B2], xlSortOnFontColor).SortOnValue.Color = 2000
.SortFields.Add([B2], xlSortOnFontColor).SortOnValue.Color = 30000
.SetRange Range("A1:B" & LR)
.Header = xlYes
.Apply
End With
Sheet5.Range("A1:B" & LR).Font.Color = 0
'-------------meger
Application.DisplayAlerts = False
For i = LR To 2 Step -1
With Sheets("du lieu")
If .Cells(i, "A") = .Cells(i - 1, "A") Then
.Range(Cells(i, "A"), Cells(i - 1, "A")).merge
End If
End With
Next i
Application.DisplayAlerts = True
Set Arr = Nothing
End Sub
hay quá bạn ơi, cho mình hỏi tý về code này tý nhéGiải pháp của mình đây,
Mã:sub merge() Dim LR As Long, i As Long, Arr As Range, Rng As Range Dim k As Long, LR1 As Long LR1 = Sheets("du lieu").Cells(Rows.Count, "L").End(xlUp).Row LR = Sheets("du lieu").Cells(Rows.Count, "B").End(xlUp).Row Sheets("du lieu").Range("A2:A" & LR).UnMerge Set Arr = Sheets("du lieu").Range("B2:B" & LR) For Each Rng In Arr With Sheets("du lieu") For k = 2 To LR1 If Rng.Value = .Range("L" & k).Value Or Rng.Value = .Range("M" & k).Value Or Rng.Value = .Range("N" & k).Value Then Rng.Offset(0, -1).Value = .Range("K" & k) End If If Rng.Value = .Range("L" & k).Value Then Rng.Font.Color = 100 End If If Rng.Value = .Range("M" & k).Value Then Rng.Font.Color = 2000 End If If Rng.Value = .Range("N" & k).Value Then Rng.Font.Color = 30000 End If Next k End With Next Rng '---------- sort Sheet5.Sort.SortFields.Clear With ActiveSheet.Sort .SortFields.Add Key:=[A2], SortOn:=xlSortOnValues, Order:=xlAscending .SortFields.Add([B2], xlSortOnFontColor).SortOnValue.Color = 100 .SortFields.Add([B2], xlSortOnFontColor).SortOnValue.Color = 2000 .SortFields.Add([B2], xlSortOnFontColor).SortOnValue.Color = 30000 .SetRange Range("A1:B" & LR) .Header = xlYes .Apply End With Sheet5.Range("A1:B" & LR).Font.Color = 0 '-------------meger Application.DisplayAlerts = False For i = LR To 2 Step -1 With Sheets("du lieu") If .Cells(i, "A") = .Cells(i - 1, "A") Then .Range(Cells(i, "A"), Cells(i - 1, "A")).merge End If End With Next i Application.DisplayAlerts = True Set Arr = Nothing End Sub
hiện em chỉ biết có 1 cách là: sort dữ liệu rồi dùng for đi từng cell để merge thôi ạ.Mình thấy mọi người trên GPE toàn gom lại rồi Merged từng nhóm
cái này mình mới thêm ".value" vì sợ màu chữ khác thì điều kiện if sẽ falsehay quá bạn ơi, cho mình hỏi tý về code này tý nhé
If Rng.Value = .Range("L" & k).Value Or Rng.Value = .Range("M" & k).Value Or Rng.Value = .Range("N" & k).Value Or Rng.Value = .Range("O" & k).Value Or Rng.Value = .Range("p" & k).Value Then
Rng.Offset(0, -1).Value = .Range("K" & k)
Góp ý với chủ topic là không nên sử dụng cách này để xử lý dữ liệu. Sau này sẽ hối tiếc sau trước đây mình lại làm như vậy
Gợi ý là dùng công thức để gán dữ liệu vào cột A. Sau này bạn sẽ thấy được sự lợi hại của cách này. Cứ từ từ mà thấm nhé
Excel tối kỵ việc Merged cells nếu muốn xử lý data nhanh và thuận tiện. Còn nếu dùng để in báo cáo thì cứ ẩn cột đầy đủ lại, tạo thêm cột phụ rồi trộn cells chỉ cột đó thôi. Theo kinh nghiệm là vậy.
@ Nguyenthuy13388
Nếu có vài chục ngàn dòng mà trộn từng cell thì chậm lắm. Có chăng nên dùng kỹ thuật Autofilter để trộn sẽ nhanh hơn rất nhiều. Mình thấy mọi người trên GPE toàn gom lại rồi Merged từng nhóm.
Đang rảnh nên tào lao tí, không vừa ý thì bỏ qua hén
View attachment 204056
cảm ơn bạn nhé, tuy nhiên mình chỉ hiểu nôm na vụ Mergecells là autofilter thành từng nhóm và merge lại. chứ code này chắc phải thời gian nữa mình mới hiểu dc hếtto Nguyenthuy:
Trong file là cách mình học mergecells từ GPE
to chủ topic:
Bố trí dữ liệu rất quan trọng. Càng khoa học thì càng dễ chỉnh sửa thêm bớt sau này
Mình gởi bạn một mẫu dữ liệu đơn giản và cách mình thực hiện yêu cầu của bạn. Khi cần thêm cấu kiện bạn cứ việc thêm vào ở sheet STT như mẫu là được