【问题标题】:Excel VBA import multiple matches into different columns same rowExcel VBA将多个匹配项导入同一行的不同列
【发布时间】:2017-03-20 05:16:00
【问题描述】:

我正在尝试从另一个 wb 导入单元格。因此,如果 wb1 col H 中的单元格与 wb2 col K 中的单元格匹配,则 wb1 col k 和 L = wb2 col C 和 E 在匹配行中。现在可能有几个匹配项,所以我希望它偏移到下一列。 m 和 n 表示下一组,o 和 p 表示下一组,依此类推。

这是我目前所拥有的:

Private Sub CommandButton1_Click()

Dim rcell As Range, sValue As String
Dim lcol As Long, cRow As Long
Dim dRange As Range, sCell As Range
Dim LastRow As Integer
Dim CurrentRow As Integer


Set ws1 = ThisWorkbook
Set ws2 = Workbooks("Workbook2").Worksheets("Sheet1")
Sheet1LastRow = ThisWorkbook.Sheets("Data").Range("H2:H50000").Value 'Search criteria column
Sheet2LastRow = Workbooks("Workbook2").Worksheets("Sheet1").Range("Q" & Rows.Count).End(xlUp).Row 'Where to look for matches

 With Workbooks("Workbook2").Worksheets("Sheet1")
     For j = 1 To Sheet1LastRow
         For i = 1 To Sheet2LastRow        
             If ThisWorkbook.Sheets("Data").Range("H").Value =  ws2.Cells(i, 11).Value Then
                 ws2.Cells(i, 11).Value = ThisWorkbook.Sheets("Data").Range("C").Value
                 ws2.Cells(i, 12).Value = ThisWorkbook.Sheets("Data").Range("E").Value
             End If
             If InStr(1, ws2.Cells.Value, ws1.Cells.Value) And     Trim(ws1.Cells.Value) <> "" Then
                 rcell.Offset(0, lcol).Value = ws2.Cells.Offset(0, 2).Value
                 lcol = lcol + 1
             End If
         Next i
     Next j
 End With

End Sub

这不起作用。我基本上放弃了,因为我不知道我错过了什么。

我在寻找类似的东西,但只找到了 VlookupMatch 可以做的事情。

【问题讨论】:

  • 我真的无法理解你的措辞,也许你可以添加一些例子
  • 是的,我能理解为什么......所以我们可以说 wb.("One").Worksheets("Puppies").range("H") 有小狗的名字。 wb.("Two").Worksheets("Growth Chart").range("J") 有小狗的名字。因此,如果有匹配项,则从(“增长图表”)中获取他们的体重(col C)和身高(col E),并将其插入 wb1 col K 的体重和 col L 的身高。对于多只同名的小狗,我试图将其他匹配项放在接下来的两列但在同一行中。不知道还能如何解释。

标签: vba excel


【解决方案1】:

您可以通过跟踪在每次复制匹配后移动两个偏移量来做到这一点。我将在一个名为offs 的变量中跟踪它。 此外,我认为复制是 从 wb2 到 wb1,如文本中所述,而不是代码中的“怀疑”。

Private Sub CommandButton1_Click()
    Dim cel1 As Range, cel2 As Range
    For Each cel1 In ThisWorkbook.Sheets("Data").UsedRange.Columns("H").Cells
        Dim offs As Long: offs = 3 ' <-- Initial offset, will increase by 2 after each match
        For Each cel2 In Workbooks("Workbook2").Worksheets("Sheet1").UsedRange.Columns("K").Cells
            If cel1.Value = cel2.Value Then
                cel1.offset(, offs).Value = cel2.offset(, -8).Value ' <- wb2(C) to wb1(K)
                cel1.offset(, offs + 1).Value = cel2.offset(, -6).Value ' <- wb2(E) to wb1(L)
                offs = offs + 2 ' <-- now shift the destination column by 2 for next match
            End If
        Next
    Next
End Sub

【讨论】:

  • 这真的很接近,可以让我指出正确的方向。这给了我一个关于“如果 cel1.Value = cel2.Value Then”的 rt 错误 13 但你的假设是正确的。
  • 知道了。我们需要For Each 语句中的尾随.Cells。很确定。基本上我们比较的是列而不是单个单元格,--> 类型不匹配。
  • 就可以了。非常感谢!
  • 如何避免重复数据?我假设比较偏移量,但我不确定我会怎么做。
  • 嗨@Noisewater。我认为这应该是一个全新的问题的主题,它肯定会得到全面的答案。这是发布您更新的代码并询问具体的重复问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2021-01-07
相关资源
最近更新 更多