我的目标:从同一行中的多个报告(已在同一电子表格中)中获取有关同一主题的所有数据。
漫游背景故事:每个月我都会收到一个新的datadump Excel电子表格,其中包含多个并排可变长度的报告(跨列)。大多数报告都有重叠的主题,但并非完全如此。幸运的是,当他们谈论相同的主题时,会注意到一个数字。此数字标记始终是每个报告开头的第一列。但是,由于报告的长度可变,因此相同的主题不在同一行中。具有数字的列永远不会移位(report1的数字始终为A列,report2的列始终为G列,等等),数字始终按升序排列。
我的目标解决方案:由于具有升序编号的列不会更改,我一直在尝试为宏编写VBA代码,以比较(例如)活动数据行的编号与来自列A和列G.如果数字相同,则不执行任何操作,否则将该行(及其下方)中的所有数据从列G:J向下移动一行。然后转到下一个数据行。
我试过了:我写过几个“For Each”和一些带有DataRow + 1的循环并调用我认为可以进行比较的内容,但它们都失败了草草收场。我不知道我是在解决语法错误还是错误的概念。此外,我的所有搜索都没有出现这个问题,甚至是我可以哄骗和拼凑的部分内容。虽然这可能更多地反映了我的谷歌搜索技巧:)
欢迎任何和所有帮助!
注意:如果重要,列会有标题。我刚刚使用DataRow = Found.Row + 1来规避。另外,我对此非常陌生并且自学成才,所以请随时详细解释
答案 0 :(得分: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
我修改了代码以作为宏工作。您应该能够从宏对话框中创建它并从那里运行它。只需粘贴代码,确保 Sub 和 End Sub 行不会重复。它不再接受工作表名称,而是针对当前活动的工作表运行。