2012-11-23 36 views
0

我需要以一种非常特定的方式整理来自3个Excel电子表格的数据,但我绝对没有找到我需要使用的功能或命令的机会,甚至谷歌今天也没有帮助我。Select All For Each - Excel Macro或VB Equivalent

对于Sheet1的每一行,我想“在Sheet2上查找所有行WHERE Sheet1 ColumnA是LIKE Sheet 2 ColumnA AND Sheet1 ColumnB是LIKE Sheet2 ColumnB”。我想我可以使用EQUALS而不是LIKE和通配符。

然后,对于第一个查询找到的每个结果,我想要在Sheet1中的当前行下面插入一个新行,并将Sheet2 ColumnC中的数据复制到新插入的行ColumnC中。我想我还需要计算第一个查询返回的行数,以便我可以告诉它在重复循环之前跳过那么多行,但即使它在这些新行上执行循环,也应该反正找不到任何结果。

很明显,有人想为我写代码,我会很高兴! :) 但即使任何人都能让我知道我需要的每一个位的最佳功能,我仍然会非常感激,并且只是研究它们并把我自己的东西放在一起。

由于提前,

编辑

添加以下的实施例,第一片材1,则片材2,然后片材1之后的宏已运行的期望的结果。上面还我说我会搜索“LIKE”的比赛,但是这将是更准确的说我要搜索哪儿细胞含有

Sheet 1 Before Macro

Sheet 2 Containing Info

Sheet 1 After Macro

+0

你计划做多久这个匹配,复制粘贴?直到行完成?哪个版本的excel? – bonCodigo

+0

嗨,感谢您的回复。是的,直到行完成后,Sheet1上有大约1500行,但是Sheet2上有大约60,000行,所以我一步一步做的宏并不理想。我正在使用Excel 2007 – JoeP

+0

你可以发布你的三张床单的屏幕截图吗? – bonCodigo

回答

1

好,以下是我的解决方案。顺便说一句,如果您可以保证单元格已经排序,那么可以优化代码以减少比较时间。

//Code is not tested 
Sub Collate() 

    Dim row1 As Long 
    Dim row2 As Long 
    Dim match As Boolean 

    Dim lastRow1 As Long 
    Dim lastRow2 As Long 

    Dim valA1 As String 
    Dim valB1 As String 
    Dim valA2 As String 
    Dim valB2 As String 
    Dim valC2 As String 

    lastRow1 = Sheet1.Cells.SpecialCells(xlCellTypeLastCell).Row 
    lastRow2 = Sheet2.Cells.SpecialCells(xlCellTypeLastCell).Row 

    row1 = 2 
    While row1 <= lastRow1 
     valA1 = "*" & Sheet1.Cells.Range("A" & row1).Value & "*" 
     valB1 = "*" & Sheet1.Cells.Range("B" & row1).Value & "*" 
     For row2 = 2 To lastRow2 
      valA2 = Sheet2.Cells.Range("A" & row2).Value 
      valB2 = Sheet2.Cells.Range("B" & row2).Value 
      valC2 = Sheet2.Cells.Range("C" & row2).Value 
      If valA2 Like valA1 And valB2 Like valB1 Then 
       match = True 
       row1 = row1 + 1 
       lastRow1 = lastRow1 + 1 
       Sheet1.Cells.Range("A" & row1).EntireRow.Insert 
       Sheet1.Cells.Range("C" & row1).Value = valC2 
      End If 
     Next row2 

     row1 = row1 + 1 
    Wend 

End Sub 
+0

谢谢!它不能完美“开箱即用”,但我需要的是在此代码中。再次,谢谢你 – JoeP