希望在Excel中将两个VBA宏循环在一起,但我认为';我只是错过了一些很小的东西

希望在Excel中将两个VBA宏循环在一起,但我认为';我只是错过了一些很小的东西,vba,excel,Vba,Excel,好吧,所以我一直在竭尽全力想把这件事做好,但我觉得答案应该非常直截了当 首先,我编写了两个宏,我们称之为LeftCut和RightCut。这将剪切出一行四列,并将它们粘贴到图纸的其他位置。这些的VBA代码是 Sub RightCut() ActiveCell.Offset([0], [-1]).Select Range(ActiveCell, ActiveCell.Offset(0, -3)).Cut ActiveCell.Offset([0], [6]).Select Range(Ac

好吧,所以我一直在竭尽全力想把这件事做好,但我觉得答案应该非常直截了当

首先,我编写了两个宏,我们称之为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
Sub-HighAce()
我想我会坚持多久
暗淡的活动单元格作为范围
i=2
Application.ScreenUpdating=True
当我激活cell.Offset([0],-1])时执行此操作,然后
应用程序。运行“'Methylation Array.xlsm'!NewBlueCut”
ElseIf ActiveCell
我走对了吗?有没有我遗漏的一行

我感谢任何人能提供的帮助。稍后我会以一个全新的思维回到这个问题上来,我会看看自己是否也能找到解决方案

谢谢

编辑:示例数据集

x x A01 A01 x x x

x x A02 A04 x x x

x x A06 A05 x x x

x x A07 A06 x x x

x x A08 A09 x x x


因此,如果右上角的A01是活动单元格,则当ActiveCell=ActiveCell.Offset(0,-1)时,移动到下一行。这里,因为活动单元格>相邻单元格,所以执行Leftcut。现在,活动单元格<相邻单元格,因此执行RightCut。另一个右移将使这两个单元格相等,因此光标将移动到下一行,然后再次移动

正如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
次右切削(rng As范围)
rng.偏移量(,-4).调整大小(,4).剪切
调整偏移量(,5)。调整大小(,4)。向下插入
调整偏移量(,-4)。调整大小(,4)。删除xlUp
端接头
次左切削(rng As范围)
rng.调整大小(,4).剪切
调整偏移量(,10)。调整大小(,4)。向下插入
调整大小(,4)。删除xlUp
端接头
次高位()
变暗rng As范围
暗计数等于长
Application.ScreenUpdating=True
设置rng=范围(“E2”)
而rng“”和rng rng.Offset(,-1)
lngCount=lngCount+1
如果lngCount>40000,则停止
如果rng>rng偏移量(,-1),则
左切rng
ElseIf rng

我没有测试它,因为我没有数据,也不了解它的用途,但我相信它会给你一个起点

您应该在循环内迭代或简单地增加
i
,否则它将是无止境的。您能给我们展示一下示例数据结构吗?我确信你不需要使用宏…我想回答这个问题,但正如彼得·阿尔伯特所说的,我不确定其目的是什么。看起来您有两组四列,并且希望在每一行中使它们相互匹配?你能证实这一点,也许再详细说明一下吗?另外,我认为您的数据集描述有点不正确。如果活动单元格是左上角的A01,则将其与其右侧的单元格进行比较需要.Offset(0,1)而不是.Offset(0,-1)(如果我错了,请更正我)。你的描述让我更加困惑。啊,是的。我错在那里了。对不起,activecell是右边的那个。因此,我有两组四列,有数千行。我所要做的就是通过删除不属于的行,将这些行与匹配的D和E单元格对齐。我想把这些剪贴到别的地方。在上面的例子中,没有A02,所以我删掉了这个集合。没有A04或A05,所以我会删掉这些集合,但是A06和A06匹配,所以我会从那里移到下一行继续。这更有意义吗?谢谢你的帮助!!太好了,谢谢!现在我有了一个起点。虽然我还没有让你的密码工作,我只是花时间来破译步骤。你能告诉我像rng一样设置dim是什么吗?为什么你要把rng放在两个SUB的参数中?谢谢
Dim rng as Range
告诉VBA解释器变量rng是范围对象。除此之外,它允许用户在每次看到一个类型
rng.
,即range类的所有方法和属性时使用IntelliSense。我将rng放在两个子类的参数中,因为我避免使用
ActiveCell
(这是传递参数的一种隐藏方式,即某个单元格)。选择/激活单元格的速度较慢,在VBA代码中更难理解。PS:一旦你弄明白了一切,别忘了接受答案!:-)伟大的我还在想办法,做实验。不过我不会忘记接受的!;)