将行与相同的信息字段组合在一起

时间:2015-11-23 02:41:27

标签: excel vba

我有一个工作簿(C:\ DOORS.xlsm),其中包含以下数据:

 A           B            C               D
100       Type A     Description1      Remarks1
102       Type A     Description1      Remarks1
103       Type C     Description2      Remarks2
104       Type D     Description3      Remarks3

我还在学习VBA,想知道我应该研究什么才能将上述数据排序为这样。

    A           B            C               D
 100, 102    Type A     Description1      Remarks1
   103       Type C     Description2      Remarks2
   104       Type D     Description3      Remarks3

我想我会使用一个循环来通过每个单元格并验证它是否与另一个条目匹配,仍然试图绕着循环的概念包围我,但我被告知如果可能的话避免使用它们。那么我相信你会在循环中使用像sort函数这样的东西?如果我可以改进我的问题或澄清任何事情,请告诉我。我想提出好的问题,并且会喜欢一些建设性的批评=)。

原标题:尝试学习VBA并需要帮助指出我正确的方向

1 个答案:

答案 0 :(得分:1)

  1. 在编写任何代码之前,请转到VBE的工具►选项,并在编辑器选项卡上的需要变量声明旁边打勾。如果在键入代码时拼错变量,这将节省您的调试时间。此记录将被记住,以下内容将自动放入您创建的每个新模块代码表的声明区域中。
      

    选项明确

  2. 开始创建子程序并输入您已经知道的任何变量。
      

    Sub data_Rollup()
      Dim rw为Long,strA为String,strB为String
      很多人去这里   结束子

  3. 使用一个或多个With ... End With statements定义您的工作环境。使用Range.CurrentRegion property将行和列引用与源自工作表A1单元格的数据“孤岛”隔离。
      

    使用工作表(“Sheet1”)
      使用.Cells(1,1).CurrentRegion
      '这里所有的工作代码   以。结束   结束与

  4. Range.Sort您的数据首先是A列,然后是B,C和D列。您一次只能对三个键列进行排序,因此您需要先对A列进行排序,然后再对B,C进行排序。和D匹配重复。您应该知道您的数据是否具有列标题标签。不要依赖Excel xlGuess
      

    .Cells.Sort Key1:=。列(1),Order1:= xlAscending,_

      方向:= xlTopToBottom,标题:= xlYes
      .Cells.Sort Key1:=。列(2),Order1:= xlAscending,_
      Key2:=。列(3),Order2:= xlAscending,_
      Key3:=。列(4),Order3:= xlAscending,_
      方向:= xlTopToBottom,标题:= xlYes

  5. 从底部到顶部循环。您将要删除与相同行组合的行,如果在删除行时从上到下进行,则存在跳过行的风险。例如你删除一行,一切都向上移动;你增加(循环)并继续前进到下一行,但实际上,你已经跳过刚刚向上移动的那一行。
      

    对于rw =.Rows.Count¹到2步-1   '更多来到这里
      下一个rw

  6. 将B,C和D列的字符串连接在一起,用于当前行和上面的行。使用LCase functionUCase function从文本字符串比较中删除区分大小写。如果找到三个信息列之间的匹配项,Join行的列A内容带有分隔符,则使用Range.Delete method永久删除该行。
      

    strA = Join(数组(.Cells(rw,2),. Cells(rw,3),. Cells(rw,4)),ChrW(8203))
      strB = Join(数组(.Cells(rw - 1,2),. Cells(rw - 1,3),. Cells(rw - 1,4)),ChrW(8203))
      如果LCase(strA)= LCase(strB)则为   .Cells(rw - 1,1)= Join(数组(.Cells(rw - 1,1),. Cell(rw,1)),“,”)
      .Rows(RW).EntireRow.Delete
      结束如果

  7. 当您认为它看起来正确时,请使用 Alt + D + L 进行编译。根据需要处理未声明的变量或缺失子句。
  8. 当它无错误地编译时,将光标放在过程中的任何位置并开始点击 F8 。这将逐步逐步引导您完成整个过程,以便您可以看到正在发生的事情。使用观察窗口并将光标悬停在变量上以查看当前状态和值。如果您对某个部分有信心,请将光标放在该部分下方的工作代码行上,然后点击 Ctrl + F8 到* Run-to-cursor。
  9. 当它可靠地运行而没有错误时,您可以考虑添加Application.ScreenUpdating property等运行时优化。
  10. 没什么。

    ¹由于您在Range.CurrentRegion property内工作,.Rows.Count是.CurrentRegion中的总行数。