我有三个用VBA为Excel编写的宏;I';我在寻求帮助把他们联系在一起。

我有三个用VBA为Excel编写的宏;I';我在寻求帮助把他们联系在一起。,excel,vba,Excel,Vba,我对编码相当陌生,所以我会简单介绍。我有一个非常大的数据集要在excel中处理。从两张电子表格中,我汇集了数据 所以每个集合有4列。一列包含数据点的字母数字名称。(例如,NC000023、NC000224等)。我想把匹配的字母数字名称从一张纸排到另一张纸。首先想到的是按字母顺序对这两列进行排序,这两列最匹配。但是,从一张图纸到另一张图纸缺少一些数据点,导致整个数据中出现多个移帧 我编写了以下宏来纠正这些移帧 第一个是确定两列在特定行中是否匹配 Sub Matching() ' ' Macro1

我对编码相当陌生,所以我会简单介绍。我有一个非常大的数据集要在excel中处理。从两张电子表格中,我汇集了数据

所以每个集合有4列。一列包含数据点的字母数字名称。(例如,NC000023、NC000224等)。我想把匹配的字母数字名称从一张纸排到另一张纸。首先想到的是按字母顺序对这两列进行排序,这两列最匹配。但是,从一张图纸到另一张图纸缺少一些数据点,导致整个数据中出现多个移帧

我编写了以下宏来纠正这些移帧

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

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 of FALSE

然后,我查找I列中任何带有FALSE的单元格,并确定需要删除哪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
编写了这些宏之后,我已经完成了以下步骤

  • 点击CTRL+M为匹配的标题行调出TRUE或FALSE列表
  • 找出一个错误的争吵。确定需要删除的是数据集1或数据集2中的四个单元格
  • 再次按CTRL+M,并更正该行
  • 我的问题是,是否可以编写这样一个代码:“如果D列中的对应单元格与左下方的一个单元格相同,则对I列中的FALSE行执行Sub-Bluecut,或者如果D列中的对应单元格与右上方的一个单元格相同,则对列中的FALSE行执行Sub-Redcut。”

    对不起,当我开始打字时,解释起来似乎不那么复杂了。如果您能给我任何帮助,我将不胜感激,即使这只是编写这段代码的一小部分的提示


    提前谢谢

    a 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
    

    当然,我会在内部进行所有测试,而不是选择每个单元格,因为即使使用
    应用程序,它也会运行得更快。ScreenUpdate=False
    要停止查看所有屏幕更新,您可以使用
    调用routineX
    从routineY运行特定的例程。看起来您需要将您的
    更改为
    函数
    ,以便它们可以接受参数…以便它们知道目标行。谢谢!但是,我想做的不是获取一个特定的值,而是根据列I中的布尔值剪切并粘贴目标单元格。函数而不是子函数是否允许我这样做?由于输出不是一个值,所以可以这么说?不要使用函数,sub应该能够接受参数SSO,在填写您要循环
    列I
    的True和False之后,根据特定条件,是否执行RedCut或BlueCut?你可以把它放在例行的
    匹配中
    是的,这正是我想要做的。然而,每一个红切或蓝切都会改变其余的是真是假,因为我以后可能会修改一个移帧。