如果值相同,则从其他工作表复制通道

时间:2018-10-05 08:36:08

标签: excel vba excel-vba

我在工作表1中有5列,在工作表2中有相同的列。产品的名称在A中。但是有时候,产品的特性(在B,C,D,E中)可以在工作表2中更改。希望它能实现Sheet1中的特征。

我尝试了一个Vlookup,但是它只能在一个单元格中工作

String toString(int value) {
  const units = <int, String>{
    1000000000: 'B',
    1000000: 'M',
    1000: 'K',
  };
  return units.entries
      .map((e) => '${value ~/ e.key}${e.value}')
      .firstWhere((e) => !e.startsWith('0'), orElse: () => '$value');
}

此外,我无法复制所有行,因为列F不应更改...并且A列中sheet1中的产品不够整洁,并且得到了一些重复...

1 个答案:

答案 0 :(得分:1)

为此,您需要一个循环来更新每一行,并且还需要更新每一列。

我建议改为使用WorksheetFunction.Match,因此您只需每行匹配一次即可获取行号,然后可以复制该行的所需值。

Option Explicit

Public Sub UpdateData()
    Dim WsDest As Worksheet 'destination workbook to write in
    Set WsDest = ThisWorkbook.Worksheets("Feuil1")

    Dim WsSrc As Worksheet 'source workbook to match with
    Set WsSrc = ThisWorkbook.Worksheets("Feuil2")

    Dim LastRow As Long 'last used row in workbook
    LastRow = WsDest.Cells(WsDest.Rows.Count, "A").End(xlUp).Row

    Dim iRow As Long, MatchedRow As Long
    For iRow = 1 To LastRow 'loop through all rows from row 1 to last used row and update each row
        MatchedRow = 0 'initialize
        On Error Resume Next 'if no match found then ignore error
        MatchedRow = WorksheetFunction.Match(WsDest.Cells(iRow, "A"), WsSrc.Columns("A"), 0) 'get the row number of the match
        On Error GoTo 0 'reactivate error reporting

        'if it didn't match then MatchedRow is still 0

        If MatchedRow > 0 Then 'if a match was found then copy values
            WsDest.Cells(iRow, "B").Value = WsSrc.Cells(MatchedRow, "B").Value
            WsDest.Cells(iRow, "C").Value = WsSrc.Cells(MatchedRow, "C").Value
            WsDest.Cells(iRow, "D").Value = WsSrc.Cells(MatchedRow, "D").Value
            WsDest.Cells(iRow, "E").Value = WsSrc.Cells(MatchedRow, "E").Value
        Else
            'didn't find a match
            'you can remove the Else part if you want to do nothing here
        End If
    Next iRow
End Sub

如果要复制的列是连续的,例如B,C,D,E,则可以执行一次复制操作,该操作比4个复制操作(每列1个)要快:

WsDest.Range("B" & iRow & ":E" & iRow).Value = WsSrc.Range("B" & MatchedRow & ":E" & MatchedRow).Value