好的,所以我一直在努力做到这一点,但我觉得答案应该非常简单!
首先,我写了两个宏,我们称之为LeftCut和RightCut。这些将删除一行四列并将它们粘贴到工作表中的其他位置。这些的VBA代码是
Sub RightCut()
ActiveCell.Offset([0], [-1]).Select
Range(ActiveCell, ActiveCell.Offset(0, -3)).Cut
ActiveCell.Offset([0], [6]).Select
Range(ActiveCell, ActiveCell.Offset(0, 3)).Select
Selection.Insert Shift:=xlDown
ActiveCell.Offset([0], [-6]).Select
Range(ActiveCell, ActiveCell.Offset(0, -3)).Select
Selection.Delete Shift:=xlUp
End Sub
Sub LeftCut
Range(ActiveCell, ActiveCell.Offset(0, 3)).Cut
ActiveCell.Offset([0], [10]).Select
Range(ActiveCell, ActiveCell.Offset(0, 3)).Select
Selection.Insert Shift:=xlDown
ActiveCell.Offset([0], [-10]).Select
Range(ActiveCell, ActiveCell.Offset(0, 3)).Select
Selection.Delete Shift:=xlUp
End Sub
这两项都是独立完成的。现在,我想要做的就是将这些循环在一起,所以如果满足某个条件,比如说,如果左边的四列与右边的四列不匹配,需要切掉一行,那么这两个宏中的一个是调用。
现在,我有一个为Do While循环编写的伪代码,但这是否接近我正在寻找的内容?主要问题是在工作表的某些点上,需要剪切和粘贴多达20行,所以我希望上面的宏一遍又一遍地使用,直到ActiveCell = ActiveCell.Offset(0,-1) 。这是否可以使用Do While循环??
Sub HighAce()
Dim i As Long
Dim ActiveCell As Range
i = 2
Application.ScreenUpdating = True
Do While i <= 40043
Set ActiveCell = Range("E" & i)
If ActiveCell = ActiveCell.Offset([0], [-1]) Then
ActiveCell.Offset([1], [0]).Select
ElseIf ActiveCell > ActiveCell.Offset([0], [-1]) Then
Application.Run "'Methylation Array.xlsm'!NewBlueCut"
ElseIf ActiveCell < ActiveCell.Offset([0], [-1]) Then
Application.Run "'Methylation Array.xlsm'!NewBlueCut"
Else: Stop
End If
Loop
End Sub
我在这里走在正确的轨道上吗?有没有我错过的一条线?
我感谢任何人都能提供的任何帮助。我稍后会以一种清醒的头脑回到这个问题,我会看看自己是否也能找到解决方案!
谢谢!
编辑:样本数据集
x x x A01 A01 x x x
x x x A02 A04 x x x
x x x A06 A05 x x x
x x x A07 A06 x x x
x x x A08 A09 x x x
因此,如果右上角的A01是活动单元格,则当ActiveCell = ActiveCell.Offset(0,-1)时,则移动到下一行。这里,由于活动单元>相邻的细胞,执行左切。现在,Activecell&lt;相邻的单元格,所以执行RightCut。另一个右键将使这两个单元格相等,因此光标将移动到下一行,然后再次移动。
答案 0 :(得分:1)
正如Peter L.所提到的,你至少应该在你的循环中增加i
。
但是,我建议您更好地熟悉.Offset
和.Resize
范围。这样可以显着减少代码。
我将循环使用以下构造:
Set rng = Range("E2")
While _condition_
...Do something
Set rng = rng.offset(1)
Wend
我最终得到了这个最终代码,也重新修改了你的剪辑:
Sub RightCut(rng As Range)
rng.Offset(, -4).Resize(, 4).Cut
rng.Offset(, 5).Resize(, 4).Insert xlDown
rng.Offset(, -4).Resize(, 4).Delete xlUp
End Sub
Sub LeftCut(rng As Range)
rng.Resize(, 4).Cut
rng.Offset(, 10).Resize(, 4).Insert xlDown
rng.Resize(, 4).Delete xlUp
End Sub
Sub HighAce()
Dim rng As Range
Dim lngcount as Long
Application.ScreenUpdating = True
Set rng = Range("E2")
While rng <> "" And rng <> rng.Offset(, -1)
lngCount = lngCount + 1
If lngCount > 40000 Then Stop
If rng > rng.Offset(, -1) Then
LeftCut rng
ElseIf rng < rng.Offset(, -1) Then
RightCut rng
Else
lngCount = 1
Set rng = rng.Offset(1)
End If
'This assign the next row
Wend
End Sub
我没有对它进行测试,因为我没有数据并且不了解目的,但我相信它会给你一个起点!