希望在Excel中将两个VBA宏一起循环,但我想我只是错过了一些非常小的东西

时间:2013-02-18 16:25:01

标签: excel vba excel-vba

好的,所以我一直在努力做到这一点,但我觉得答案应该非常简单!

首先,我写了两个宏,我们称之为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。另一个右键将使这两个单元格相等,因此光标将移动到下一行,然后再次移动。

1 个答案:

答案 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

我没有对它进行测试,因为我没有数据并且不了解目的,但我相信它会给你一个起点!