|
发表于 2012-11-5 23:29
|
显示全部楼层
本楼为最佳答案
研究了半天算是搞懂了,中间的剪切 位置有可能与你想的不一样,因为没有更多相关数据,所以就只有根据附件来判断了
如果是插入固定的列数 则修改 L = L + .Range(.Cells(X, "I"), .Cells(X, Lx)).Columns.Count
比如固定插入10列,则 L=L+10
其它的代码都有说明,你自己慢慢研究下,应该能自己修改!
- Sub 调整()
- Dim Arr(), Hx As Long, X As Long, Ma As Integer, Lx As Integer
- Dim L As Integer, H As Long
- Application.ScreenUpdating = False '关闭屏幕更新
- With Sheets("Sheet1") '指定要操作的表
- Hx = .Range("I65536").End(xlUp).Row '提取 I 列使用到的最后一行的行号
- With .Range("T1:V" & Hx) '指定操作 T,V 列
- Arr = .Value '将值放到数组
- .ClearContents '清除单元格中的值
- End With
- L = 19 '要插入数据的初始列数 19 列则是 S 列
- For X = Hx To 1 Step -1 '倒循环
- If Len(.Cells(X, "H")) = 0 Then '如果 H 列中没有值,就执行下面的代码
- Lx = .Cells(X, "IV").End(xlToLeft).Column '提取该行使用到的最一列的列号
- H = .Cells(X, "H").End(xlUp).Row '提取该行往上 有数据行 的行号
-
- .Range(.Cells(X, "I"), .Cells(X, Lx)).Cut .Cells(H, L)
- '将数据区域 剪切 到 单元格(h行,l列)
-
- L = L + .Range(.Cells(X, "I"), .Cells(X, Lx)).Columns.Count
- '计算下一个数据要剪切到的 列 号,
- Else
- If L > Ma Then Ma = L '记录使用的最大的列号
- L = 19 '初始 列号
- End If
- Next
- .Cells(1, Ma).Resize(UBound(Arr), UBound(Arr, 2)) = Arr '将原 T:V 列的数据重新写回新的单元格位置
- .Columns("G:G").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
- '使用 定位》空值 功能,整行删除 G:G 列中有空值的行
- End With
- Application.ScreenUpdating = True '打开屏幕更新
- End Sub
复制代码 |
|