VBA 宏:尝试编写"if two cells are the same, then nothing, else shift rows down"代码



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

Rambling Backstory:每个月我都会得到一个新的数据转储Excel电子表格,其中有几个可变长度的报告并排(跨列)。这些报告大多有重叠的主题,但并非完全如此。幸运的是,当他们谈论同一个话题时,会用一个数字来表示。此数字标记始终是每个报告开头的第一列。然而,由于报告的长度可变,相同的主题不在同一行中。具有数字的列从不移位(报表1的数字始终是列A,报表2的数字始终为列G,等等),并且数字始终按升序排列。

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

我试过:我写了几个"For Each"和几个DataRow+1到的循环,并调用了我认为可以进行比较的方法,但它们都失败了。我不知道是语法错误还是概念错误。此外,我的搜索都没有发现这个问题,甚至没有发现我可以拼凑的部分问题。尽管这可能更多地反映了我的谷歌搜索技能:)

如有任何帮助,我们将不胜感激

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

我想我理解你的目标,这应该可行。它没有使用你在阅读你的解释时使用的任何方法,我很清楚如何进行。如果这不是你想要的,我很抱歉。

它从预定义的列开始(请参见FIRST_ROW常量),逐行比较这两个单元格(MAIN_column和CHILD_column)。如果MAIN_COLUMN<它在SHIFT_START&SHIFT_END向下一排。它一直持续到碰到一个空行。

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

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

最新更新