从另一个表更新表值

use*_*592 5 excel vba

我有一个工作簿,其表大小约为20000行,52列.有时,我需要一次更新选定行的百分比.我希望使用宏来根据行中的值更新选择单元格,由第二个较小的表格映射,更新的值将输入到表1中.几乎像VLOOKUP函数,但不是如果找不到条目,​​则擦除单元格.例如,根据主机ID更改电话号码.

我尝试在下面的代码中使用数组执行此操作,以获得表1中的一组特定值,但我的值未更新.我的VBA有点生疏,所以如果有人可以查看并协助让它运行,我们将不胜感激.我想最终根据表头更新表中的任何条目.

Sub NewNameandCostCenter()
Dim myList, myRange
Dim sht As Worksheet
Dim sht2 As Worksheet
Dim LastRow As Long
Dim LastColumn As Long
Dim StartCell As Range
Dim LastRow2 As Long
Set sht = Worksheets("NewNameMacro")
Set sht2 = Worksheets("ALL")
Set StartCell = Range("A2")

'Find Last Row and Column
  LastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).Row
  LastColumn = sht.Cells(StartCell.Row, sht.Columns.Count).End(xlToLeft).Column
'set myList array
Set myList = sht.Range(StartCell, sht.Cells(LastRow, LastColumn))
LastRow2 = sht.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'set myRange array
Set myRange = Sheets("ALL").Range("J2:M" & LastRow2)
'Update values of cells adjacent
For Each cel In myList.Columns(1).Cells
myRange.Replace What:=cel.Value, Replacement:=cel.Offset(0, 1).Value, LookAt:=xlWhole
myRange.Replace What:=cel.Value, Replacement:=cel.Offset(0, 2).Value, LookAt:=xlWhole
myRange.Replace What:=cel.Value, Replacement:=cel.Offset(0, 3).Value, LookAt:=xlWhole
Next cel
End Sub
Run Code Online (Sandbox Code Playgroud)

谢谢,JD

Thu*_*ame 3

如果我正确理解您的问题,那么您正在根据映射表中的值有效地对数据运行 UPDATE 查询。

我假设如下:

  • “键”列是数据表映射表中的第一列。

  • 映射表中的列与数据表中的列具有相同的顺序和相对位置(尽管这可以轻松调整)。

  • 映射表和数据表中的键的顺序是未排序的。如果您可以确保键已排序(最好在两张表中),那么您可以通过一些细微的修改获得更好的性能。

我在示例中对范围进行了硬编码,但如果需要,您可以恢复最后一行和最后一列的方法。

我已经完成了数组而不是范围之间的所有比较,并且我已经放弃了查找方法。你会发现这确实有效,而且效率更高。

Option Explicit

Sub NewNameandCostCenter()

  Dim start As Double
  start = Timer

  Dim countOfChangedRows As Long

  'set rngMap array
  Dim rngMap As Range
  Set rngMap = Worksheets("Map").Range("A1:D51")

  'set rngData array
  Dim rngData As Range
  Set rngData = Worksheets("Data").Range("J2:M20001")

  Dim aMap As Variant
  aMap = rngMap.Value

  Dim aData As Variant
  aData = rngData.Value

  Dim mapRow As Long
  Dim datarow As Long
  Dim mapcol As Long

  For mapRow = LBound(aMap, 1) To UBound(aMap, 1)
    For datarow = LBound(aData) To UBound(aData)
      'Check the key matches in both tables
      If aData(datarow, 1) = aMap(mapRow, 1) Then
        countOfChangedRows = countOfChangedRows + 1
        'Assumes the columns in map and data match
        For mapcol = LBound(aMap, 2) + 1 To UBound(aMap, 2)
          aData(datarow, mapcol) = aMap(mapRow, mapcol)
        Next mapcol
      End If
    Next datarow
  Next mapRow

  rngData.Value = aData

  Debug.Print countOfChangedRows & " of "; UBound(aData, 1) & " rows updated in " & Timer - start & " seconds"

End Sub
Run Code Online (Sandbox Code Playgroud)

对于 50 个更新行,性能是合理的:

50 of 20000 rows updated in 0.23828125 seconds

但是,如果您需要开始更新数千行,那么确保数据已排序并相应地调整代码将使您受益匪浅。