VBA宏:尝试编写“代码”;如果两个单元格相同,则无任何内容,否则向下移动行;

VBA宏:尝试编写“代码”;如果两个单元格相同,则无任何内容,否则向下移动行;,vba,excel,Vba,Excel,我的目标:从同一行的多个报告(已在同一电子表格中)中获取关于同一主题的所有数据 杂乱无章的背景故事:每个月我都会收到一份新的datadump Excel电子表格,其中有几个不同长度的报告并排(跨列)。这些报告大多有重叠的主题,但并非全部。幸运的是,当他们谈论同一个话题时,会出现一个数字。此数字标记始终是每个报告开头的第一列。但是,由于报告的长度可变,相同的主题不在同一行中。带有数字的列从不移位(report1的数字始终为A列,report2的数字始终为G列,等等),并且数字始终按升序排列 我的目

我的目标:从同一行的多个报告(已在同一电子表格中)中获取关于同一主题的所有数据

杂乱无章的背景故事:每个月我都会收到一份新的datadump Excel电子表格,其中有几个不同长度的报告并排(跨列)。这些报告大多有重叠的主题,但并非全部。幸运的是,当他们谈论同一个话题时,会出现一个数字。此数字标记始终是每个报告开头的第一列。但是,由于报告的长度可变,相同的主题不在同一行中。带有数字的列从不移位(report1的数字始终为A列,report2的数字始终为G列,等等),并且数字始终按升序排列

我的目标解决方案:由于带有升序数字的列不会更改,因此我一直在尝试为宏编写VBA代码,该宏将(例如)活动数据行的编号与列a和列G中的编号进行比较。如果编号相同,则不执行任何操作,否则移动该行(及其下)中的所有数据从G:J列向下一行。然后转到下一个数据行

我尝试过:我写了几个“For Each”和几个循环,使用DataRow+1调用我认为可以进行比较的内容,但它们都失败得很惨。我不知道我只是把语法弄错了还是这是一个错误的概念。而且,我的搜索中没有发现这个问题,甚至部分问题我都无法解决。虽然这可能更多地反映了我的谷歌搜索技能:)

任何和所有帮助都将不胜感激


注意:如果这很重要,列会有标题。我刚刚使用DataRow=Found.Row+1来规避。此外,我在这方面是个新手,自学成才,所以请随意详细解释一下

我想我理解你的目标,这应该行得通。它没有使用你在阅读你的解释时使用的任何方法,我有一个好主意如何继续。如果这不是你想要的,我道歉

它从一个预定义的列开始(请参见第一行常量),然后逐行比较两个单元格(主列和子列)。如果主列<子列,则将SHIFT\u开始和SHIFT\u结束之间的所有内容向下推一行。它将继续,直到碰到一个空行

Sub AlignData()
  Const FIRST_ROW As Long = 2       ' So you can skip a header row, or multiple rows
  Const MAIN_COLUMN As Long = 1     ' this is your primary ID field
  Const CHILD_COLUMN As Long = 7    ' this is your alternate ID field (the one we want to push down)
  Const SHIFT_START As String = "G" ' the first column to push
  Const SHIFT_END As String = "O"   ' the last column to push

  Dim row As Long
  row = FIRST_ROW
  Dim xs As Worksheet
  Set xs = ActiveSheet
  Dim im_done As Boolean
  im_done = False
  Do Until im_done
    If WorksheetFunction.CountA(xs.Rows(row)) = 0 Then
      im_done = True
    Else
      If xs.Cells(row, MAIN_COLUMN).Value < xs.Cells(row, CHILD_COLUMN).Value Then
        xs.Range(Cells(row, SHIFT_START), Cells(row, SHIFT_END)).Insert Shift:=xlDown
        Debug.Print "Pushed row: " & row & " down!"
      End If
      row = row + 1
    End If
  Loop
End Sub
Sub-AlignData()
Const FIRST_ROW的长度为2',因此您可以跳过一个标题行或多个行
Const MAIN_列的长度=1'这是您的主ID字段
Const CHILD_COLUMN As Long=7'这是您的备用ID字段(我们要向下推的字段)
Const SHIFT_START As String=“G”'要推送的第一列
常量SHIFT\u END为String=“O”'要推送的最后一列
暗排一样长
行=第一行
Dim xs As工作表
Set xs=ActiveSheet
Dim im_done As Boolean
im_done=False
直到我做完为止
如果工作表function.CountA(xs.Rows(row))=0,则
im_done=真
其他的
如果xs.Cells(行,主列).Value

我修改了代码以用作宏。您应该能够从“宏”对话框中创建它,并从那里运行它。只需将代码粘贴到位,并确保SubEnd Sub行不会重复。它不再接受工作表名称,而是针对当前活动的工作表运行。

您应该发布您尝试过的代码,尝试反向循环,因为您不想找到刚刚下移的相同数据实际上,这正是我要做的。由于这些数字是按升序排列的,它们将被向下推直到匹配为止,然后被忽略。@enderland正在查找我尝试过的一些代码。我也是一个什么都乱扔的人fast@Ellen很久以前就学会了,永远不要那样做。你怎么知道你在14次尝试之前尝试过的代码除了一件小事之外都是正确的。你花了很多时间来重写银行!这是有道理的。然而,当我尝试使用它时,VBA坚持在“const”之后需要一个“End Sub”。我以前从未使用过“函数”,我是否遗漏了什么?我刚刚读到这些函数应该直接放到一个模块中。我这样做了,但我不确定如何正确调用粘贴到新模块中的代码会很好地工作。如果您试图通过宏对话框来执行此操作,我将不得不对其进行一些更改。我现在就修改它,很快就可以编辑我的答案。太棒了!上面的代码将我的comp放入一个无限循环中,但我只是将第一个If替换为:“If xs.Cells(row,MAIN_COLUMN).Value=”“Then im_done=True”,效果很好。非常感谢你!