|
本帖最后由 hwc2ycy 于 2012-10-5 17:04 编辑
今天这道题,学到不少了。
继续改了,免得大规模的数据处理会报错。- Sub 合并6()
- '对数据源要求,要求数据源的D列最后一行必须有数据,否则影响程序判断
- Dim arr '源数据数组
- Dim i As Long, j As Long, k As Long 'I代表列数组,J代表行,K代表列
- Dim rg As Range '合并RANGE
- Dim iArr '需要合并的列号
- Dim irow '数据行数
- Dim sMerge As String '合并地址
- Dim iLstRow As Long
- Dim iMStart
- Application.ScreenUpdating = False
- Application.DisplayAlerts = False
- iLstRow = [d5].End(xlDown).Row '最后一行数据行标
- iArr = Array(1, 2, 5, 6, 7, 8, 9)
- arr = Range("a5:i" & [d5].End(xlDown).Row).Value '数组,取数据区域
- irow = UBound(arr) '数组维数
- For i = 0 To UBound(iArr)
- k = iArr(i)
- For j = 1 To irow
- If j = irow Then Exit For '最后一行,不做判断,如果是能合并的单元格,下面的代码会做合并。
- iMStart = j + 4 '保存合并区起码行号
- 'Set rg = Cells(iMStart, k) '行数据与数组中的行数相差为4
- Do While arr(j, k) = arr(j + 1, k) And arr(j, k) <> ""
- j = j + 1
- If j = irow Then Exit Do
- Loop
-
- If j + 4 > iMStart Then
-
- If Len(sMerge & Range(Cells(iMStart, k), Cells(j + 4, k)).Address(False, False) & ",") >= 250 Then
- sMerge = Left(sMerge, Len(sMerge) - 1)
- Range(sMerge).Merge
- sMerge = Range(Cells(iMStart, k), Cells(j + 4, k)).Address(False, False) & ","
- Else
- sMerge = sMerge & Range(Cells(iMStart, k), Cells(j + 4, k)).Address(False, False) & ","
- End If
-
- If k = 1 Then
- If Len(sMerge & Range(Cells(iMStart, 3), Cells(j + 4, 3)).Address(False, False) & ",") >= 250 Then
- sMerge = Left(sMerge, Len(sMerge) - 1)
- Range(sMerge).Merge
- sMerge = Range(Cells(iMStart, 3), Cells(j + 4, 3)).Address(False, False) & ","
- Else
- sMerge = sMerge & Range(Cells(iMStart, 3), Cells(j + 4, 3)).Address(False, False) & ","
- End If
-
- End If
- End If
- Next
- Next
- With Columns("A:L")
- .HorizontalAlignment = xlCenter
- .VerticalAlignment = xlCenter
- End With
- End Sub
复制代码 |
|