snasui.com ยินดีต้อนรับ ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ ระบุ Version ของ Excel
Sub test1()
Dim rngMerge As Range
Dim cell As Range
Dim lr As Long
lr = Range("A" & Rows.Count).End(xlUp).Row
Set rngMerge = Range("A2:A" & lr)
Range("A2:A" & lr).MergeCells = False
MergeAgain:
Application.DisplayAlerts = False
For Each cell In rngMerge
If cell.Value = cell.Offset(1, 0).Value And IsEmpty(cell) = False Then
Range(cell, cell.Offset(1, 0)).Merge
Range(cell, cell.Offset(1, 0)).VerticalAlignment = xlTop
GoTo MergeAgain
End If
Next
Application.DisplayAlerts = True
End Sub
You do not have the required permissions to view the files attached to this post.
Sub FindMergeRange()
Dim ArrRange, CalRange
lastrow = Range("a" & Rows.Count).End(xlUp).Row
Set CalRange = Range("c2:c" & lastrow)
[c2] = "=IF(MATCH(A2,A:A,0)=ROW(),COUNTIF(A:A,A2))"
[c2].Copy (CalRange)
CalRange.Value = CalRange.Value
Set ArrRange = CalRange.SpecialCells(xlCellTypeConstants, 1)
For Each cll In ArrRange
cll.Offset(0, -2).Resize(cll.Value, 1).Select
Call Merge
Next
MsgBox "Done"
End Sub
Private Sub Merge()
MsgBox "Call Merge"
'............
End Sub
Sub TryMerge()
Dim i As Integer, iCount As Integer, iCol As Integer, _
r As Range, rMerge As Range, bOK As Boolean
With ActiveSheet
iCol = .UsedRange.Columns.Count
Set rMerge = .UsedRange.Resize(.UsedRange.Rows.Count, 1)
End With
Application.DisplayAlerts = False
For i = iCol To 1 Step -1
For Each r In rMerge.Offset(, i - 1)
If r.MergeCells Then Exit For
If Not IsEmpty(r) Then
If i > 1 Then
bOK = False
If r.Offset(0, -1).Value = _
r.Offset(1, -1).Value Then bOK = True
Else
bOK = True
End If
If r.Value = r.Offset(1, 0).Value And bOK Then
iCount = iCount + 1
Else
If iCount > 0 Then
r.Offset(-iCount, 0).Resize(iCount + 1, 1).Merge
r.Offset(-iCount, 0).VerticalAlignment = xlTop
iCount = 0
End If
End If
End If
Next r
Next i
Application.DisplayAlerts = True
End Sub
Public Sub MergeCell()
Dim DataCol1 As Range, Main As Range, m, n
Set DataCol1 = Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))
For Each c In DataCol1
If c.Value <> m Then
Set Main = c.Resize(iCount(DataCol1, c.Value), 1)
c.Offset(0, 2).Value = c.Value
c.Offset(0, 2).Resize(iCount(DataCol1, c.Value), 1).Merge
c.Offset(0, 3).Value = c.Offset(0, 1).Value
c.Offset(0, 3).Resize(iCount(Main.Offset(0, 1), c.Offset(0, 1).Value)).Merge
m = c.Value
n = c.Offset(0, 1).Value
End If
If c.Offset(0, 1).Value <> n Then
c.Offset(0, 3).Value = c.Offset(0, 1).Value
c.Offset(0, 3).Resize(iCount(Main.Offset(0, 1), c.Offset(0, 1).Value)).Merge
n = c.Offset(0, 1).Value
End If
Next
Columns("C:D").VerticalAlignment = xlTop
End Sub
Private Function iCount(R As Range, x As String) As Integer
For Each i In R
If i = x Then n = n + 1
Next i
iCount = n
End Function