2013-02-18 94 views
3

好吧,所以我一直拉着我的头发试图让这个正确,但我觉得好像答案应该是非常简单!寻找在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 

我在正确的轨道上吗?有没有一条线我失踪?

我很感激任何人都可以提供的帮助。稍后我会以一种全新的心态回到这个问题上,我会看看我是否也能自己找到解决方案!

谢谢!

编辑:样本数据集

XXX A01 A01 XXX

XXX A02 A04 XXX

XXX A06 A05 XXX

XXX A07 A06 XXX

XXX A08 A09 XXX

所以如果顶部的A01当ActiveCell = ActiveCell.Offset(0,-1)时,右边是活动单元格,然后移动到下一行。在此,由于活动单元>邻近单元,执行Leftcut。现在,Activecell <的Adjacent cell,所以执行RightCut。另一个正切将使这两个单元格相等,所以光标将移动到下一行,然后再次移动。

+1

你应该迭代或简单地在循环内增加'i',否则将会是无止境的。 – 2013-02-18 16:43:18

+1

你能告诉我们样本数据结构吗?我确定你不需要为此设置宏... – 2013-02-18 20:04:53

+0

请参阅编辑数据集。 – user1996971 2013-02-18 20:41:56

回答

1

正如彼得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 

我没有测试它,因为我没有数据,也不明白目的,但我相信它会给你一个起点!

+0

太好了,谢谢!现在我有一个起点。虽然我还没有得到你的代码工作,但我只是花时间来破译这些步骤。你能告诉我什么设置昏暗如rng吗?你为什么把rng放入两个潜艇的论点? 谢谢! – user1996971 2013-02-18 21:24:07

+0

'Dim rng as Range'告诉VBA解释器变量rng是一个Range对象。除此之外,它允许每次使用智能感知类型'rng.',即可以看到范围类的所有方法和属性。 – 2013-02-18 21:34:37

+0

我把rng放在两个子的参数中,因为我避免使用'ActiveCell'(这是一种隐藏的方式来传递参数,即某个单元格)。选择/激活单元比较慢 - 在VBA代码中难以理解。 – 2013-02-18 21:36:53

相关问题