0

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

漫无边际的背景故事:每个月我都会收到一个新的数据转储 Excel 电子表格,其中包含几个并排(跨列)长度可变的报告。这些报告中的大多数都有重叠的主题,但并非完全重叠。幸运的是,当他们谈论同一个主题时,会用数字标注。此数字标记始终是每个报告开头的第一列。但是,由于报告的长度可变,相同的主题不在同一行中。带有数字的列永远不会移动(report1 的数字始终是 A 列,report2 的始终是 G 列,等等)并且数字始终按升序排列。

我的目标解决方案: 由于具有升序数字的列没有改变,我一直在尝试为宏编写 VBA 代码,该宏将(例如)活动数据行的数量与 A 列和 G 列的数量进行比较。如果数字是一样的,什么都不做,否则将该行(及其下方)中的所有数据从 G:J 列向下移动一行。然后移动到下一个数据行。

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

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

注意:如果它很重要,列有标题。我一直在使用 DataRow = Found.Row + 1 来规避。另外,我是这方面的新手并且是自学的,所以请随时详细解释

4

1 回答 1

1

我想我理解你的目标,这应该有效。它不使用您在阅读您的解释时使用的任何方法,我很清楚如何继续。如果这不是你要找的东西,我很抱歉。

它从预定义的列开始(请参阅 FIRST_ROW 常量)并逐行比较两个单元格(MAIN_COLUMN 和 CHILD_COLUMN)。如果 MAIN_COLUMN < CHILD_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行不会重复。它不再接受工作表名称,而是针对当前活动的工作表运行。

于 2012-09-12T16:49:36.060 回答