我在VBA中为Excel编写了三个宏;我正在寻求帮助将他们联系在一起。

时间:2013-01-21 12:23:57

标签: excel excel-vba vba

我对编码很新,所以我会很简短。我有一个非常大的数据集来处理excel。从两个电子表格中,我汇总了数据。

所以每组有4列。一列包含数据点的字母数字名称。 (例如,NC000023,NC000224等)。我想将匹配的字母数字名称与一张纸排成另一张。我想到的第一件事就是按字母顺序排列两列,这些列最符合要求。但是,从一个工作表到另一个工作表缺少一些数据点,导致整个数据中出现多个frameshif。

我已经编写了以下用于纠正这些移码的宏。

第一个是确定两列是否在特定行中匹配

Sub Matching()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+m
'
    Range("I2").Select
    ActiveCell.FormulaR1C1 = "=EXACT(RC[-4],RC[-5])"
    Range("I2").Select
    Selection.AutoFill Destination:=Range("I2:I40028"), Type:=xlFillDefault

根据D3是否与E3匹配,D550是否与D550匹配等,这将显示一个TRUE为FALSE的新列。

然后我用FALSE找出I列中的任何单元格,并确定我需要删除哪4个单元格以纠正该匹配。该代码旨在消除罪魁祸首,将其粘贴在一起,并将下面的行向上移动以取代它。

Sub RedCut()
'
' Macro2 Macro
' Shortcut CTRL + r

'
    ActiveCell.Offset([0], [-3]).Select
    Range(ActiveCell, ActiveCell.Offset(0, 3)).Cut
    ActiveCell.Offset([0], [12]).Select
    ActiveSheet.Paste
    ActiveCell.Offset([0], [-12]).Select
    Range(ActiveCell, ActiveCell.Offset(0, 3)).Select
    Selection.Delete Shift:=xlUp

End Sub

而另一个

Sub Bluecut()
'
' Bluecut Macro
'
' Keyboard Shortcut: Ctrl+b

  ActiveCell.Offset([0], [3]).Select
    Range(ActiveCell, ActiveCell.Offset(0, -3)).Cut
    ActiveCell.Offset([0], [9]).Select
    ActiveSheet.Paste
    ActiveCell.Offset([0], [-9]).Select
    Range(ActiveCell, ActiveCell.Offset(0, -3)).Select
    Selection.Delete Shift:=xlUp
'
End Sub

写完这些宏后,我已经完成了以下步骤。

  1. 按CTRL + M调出匹配的标题行的TRUE或FALSE列表
  2. 用FALSE寻找一行。确定是否是数据集1中的四个单元格或需要删除的数据集2
  3. 再次按CTRL + M,然后更正该行。
  4. 我的问题是,如果D列中的相应单元格与向下和向左的一个单元格相同,或者执行Sub Subcut,是否可以编写一个代码“在第I列中为FALSE行执行Sub Bluecut”对于列中为FALSE的行,如果列D中的相应单元格与向上和向右的一个单元格相同。“

    很抱歉,当我开始输入时,解释起来似乎要复杂得多。我很感激你能给我的任何帮助,即使这是写一小段代码的小费。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

for / next或for / each循环应该符合您的需求。

作为一个快速投掷,我会做这样的事情,在匹配后运行:

Dim I as range
for each I in Range("I2:I40028").Cells
     I.select
     if activecell.offset(0,-5)=activecell(1,-6) then 
         bluecut
     else
         redcut
     end if
next

当然,我会在内部进行所有测试,而不是选择每个单元格,因为它会运行得更快,即使使用application.ScreenUpdating=False也不必查看所有屏幕更新