根据工作表中的其他值,将Excel中的值复制到另一个工作表

时间:2013-09-05 11:30:53

标签: excel vba excel-vba

好的,这个问题听起来很模糊,但我会尝试解释。

我正在尝试将某个单元格值从一个工作表复制到另一个工作表中。应将其复制到的位置由同一工作表中的另一个值确定。例如:

Sheet 1中

4040-5056 ----- 4040-5056v1.7

3409-5793 ----- 3409-5793v4.3

Sheet2

4040-5056

3409-5793

根据您看到的第一个值,sheet1中的第二列值应复制到sheet2中的相应单元格中。

我不知道如何做到这一点,任何帮助都将不胜感激!

提前致谢

编辑:

Sheet1包含必须复制到其他工作表中相应nvalues的所有值。 它必须与之对应的值分布在30张左右,但都在同一文档中。在每个工作表中,代码必须查找的值都在同一列中,因此在每个工作表中应该查看A列中的值是否相同.VLOOKUP可以工作,但仍然是一个缓慢的选项,知道这是处理36.000行。代码应该做的是,如果A列的值与另一个工作表中A列的值相对应,则将B列的值复制到其他工作表中。

我希望每个人都能理解这个解释。

2 个答案:

答案 0 :(得分:0)

您可以使用VLOOKUP功能。无需为此使用VBA。

表1:

       A          B         C
1      4040-5056  4040-5056v1.7
2      3409-5793  3409-5793V4.3
3

表2:

       A          B         C
1      4040-5056  =VLOOKUP(A1;Sheet1!$A$1:$B$2;2;FALSE)
2      3409-5793  =VLOOKUP(A2;Sheet1!$A$1:$B$2;2;FALSE)
3

单元格B1将显示“4040-5056v1.7”,单元格B2“3409-5793V4.3”

请注意,VLOOKUP的最后一个参数(此处为FALSE)在您的情况下很重要,因为数据未排序。

答案 1 :(得分:0)

使用纯VBA的另一种解决方案:

由于强烈需要性能,我建议使用dict对象,如this SO question中所示。使用字典的优点是,一旦构建,它的查找速度非常快。所以我希望我的代码在查找中非常快。另一方面,访问单个单元格(通过循环)比内置VLOOKUP更慢。

比较表现,使用30,000个条目的参考表和3个每页30,000行的查找表:

  • VLOOKUP:600秒
  • VBA /字典:3秒

因此在这种情况下使用VBA字典可以提高200倍的性能。

注意:您必须添加对“Microsoft Scripting Runtime”的引用(来自VBA窗口的tools->参考菜单)

注意:如果参考表中的数据不连续,或者存在重复数据,此解决方案将无效。

Sub FillReferences()

  Dim dict As New Scripting.Dictionary
  Dim myRow As Range
  Dim mySheet As Worksheet

  Const RefSheetName As String = "sheet1"
  ' 1. Build a dictionnary
  Set mySheet = Worksheets(RefSheetName)
  For Each myRow In mySheet.Range(mySheet.Range("A1").End(xlDown), mySheet.Range("A" & mySheet.Rows.Count).End(xlUp))
    ' Append A : B to dictionnary
    dict.Add myRow.Value, myRow.Offset(0, 1).Value
  Next myRow

  ' 2. Use it over all sheets
  For Each mySheet In Worksheets
    If mySheet.Name <> RefSheetName Then
      ' Check all cells in col A
      For Each myRow In mySheet.Range(mySheet.Range("A1").End(xlDown), mySheet.Range("A" & mySheet.Rows.Count).End(xlUp))
        ' Value exists in ref sheet ?
        If dict.exists(myRow.Value) Then
          ' Put value in col B
          myRow.Offset(0, 1).Value = dict(myRow.Value)
         End If
      Next myRow
    End If
  Next mySheet

End Sub