代码之家  ›  专栏  ›  技术社区  ›  bewislammeld

仅从同一行复制相邻单元格值,而不复制其他行,无论Instr函数的结果是否重复

  •  0
  • bewislammeld  · 技术社区  · 7 年前

    我很难知道如何对我的困境进行编码。下面是我当前的代码,它非常适合比较 第3页B列 具有 第2页B列 。一旦两者之间找到匹配项 B列的 ,然后代码从 表3列A和C ,并将答案粘贴到 表2列A和D 分别地

    Sub ID()
    Dim sheet1 As Worksheet, sheet2 As Worksheet, Sheet3 As Worksheet
        Dim isFound As Boolean: isFound = False
        Set sheet1 = Sheets(1)
        Set sheet2 = Sheets(2)
        Set Sheet3 = Sheets(3)
        Dim Sheet3ColB, Sheet2ColB As Variant
        Dim ii As Long, tt As Long, w As Long: w = 3
        Sheet3ColA = Sheet3.Range("A2:C" & Sheet3.Cells(Sheet3.Rows.Count, 2).End(xlUp).Row).Value2
        Sheet2ColB = sheet2.Range("B3:B" & sheet2.Cells(sheet2.Rows.Count, 2).End(xlUp).Row).Value2
        For ii = LBound(Sheet2ColB) To UBound(Sheet2ColB)
            isFound = False
            For tt = LBound(Sheet3ColA) To UBound(Sheet3ColA)
                'perform case insensitive (partial) comparison
                If InStr(1, LCase(Sheet2ColB(ii, 1)), LCase(Sheet3ColA(tt, 2))) > 0 Then
                     sheet2.Cells(w, 1) = Sheet3ColA(tt, 1)
                     sheet2.Cells(w, 4) = Sheet3ColA(tt, 3)
                    w = w + 1
                    isFound = True
                End If
            Next
            If Not isFound Then
                sheet2.Cells(w, 2) = Sheet2ColB(ii, 1)
                w = w + 1
            End If
        Next
    
    End Sub
    

    我唯一的问题是,我的数据将有一些重复项。因此,当Instr函数运行时,它将为单行返回多个值(最多只返回几次)。但我所需要的只是代码从它当时正在比较的行中复制和粘贴,仅此而已,所以只需要来自所讨论行的信息。我的建议是这样的,但它返回了一个错误:

    sheet2.Cells(w, 1) = Sheet3ColA(tt & Cells.row, 1)
    sheet2.Cells(w, 4) = Sheet3ColA(tt & Cells.row, 3)
    

    我只需要它从中的同一行获取数据 第3页 并将该信息仅粘贴到 第2页 ,忽略数据上方/下方可能存在的所有其他重复项。

    1 回复  |  直到 7 年前
        1
  •  0
  •   h2so4    7 年前

    一旦找到匹配项,就不需要再深入内部循环,因此我的建议是

    Sub ID()
    Dim sheet1 As Worksheet, sheet2 As Worksheet, Sheet3 As Worksheet
        Dim isFound As Boolean: isFound = False
        Set sheet1 = Sheets(1)
        Set sheet2 = Sheets(2)
        Set Sheet3 = Sheets(3)
        Dim Sheet3ColB, Sheet2ColB As Variant
        Dim ii As Long, tt As Long, w As Long: w = 3
        Sheet3ColA = Sheet3.Range("A2:C" & Sheet3.Cells(Sheet3.Rows.Count, 2).End(xlUp).Row).Value2
        Sheet2ColB = sheet2.Range("B3:B" & sheet2.Cells(sheet2.Rows.Count, 2).End(xlUp).Row).Value2
        For ii = LBound(Sheet2ColB) To UBound(Sheet2ColB)
            isFound = False
            For tt = LBound(Sheet3ColA) To UBound(Sheet3ColA)
                'perform case insensitive (partial) comparison
                If InStr(1, LCase(Sheet2ColB(ii, 1)), LCase(Sheet3ColA(tt, 2))) > 0 Then
                     sheet2.Cells(w, 1) = Sheet3ColA(tt, 1)
                     sheet2.Cells(w, 4) = Sheet3ColA(tt, 3)
                    w = w + 1
                    isFound = True
                    Exit for
                End If
            Next
            If Not isFound Then
                sheet2.Cells(w, 2) = Sheet2ColB(ii, 1)
                w = w + 1
            End If
        Next
    
    End Sub