【问题标题】:Replace Existing Values on one Tab With Values From a Table on Another tab用另一个选项卡上的表中的值替换一个选项卡上的现有值
【发布时间】:2021-11-14 15:08:40
【问题描述】:

我正在尝试找到一种方法,将 Excel 工作簿第二个选项卡上的所有值替换为相应值右侧不同选项卡 1 单元格中的表中的值。在 Sheet1 上有 2 列。第一个称为 ID,第二个称为新 ID。在 Sheet2 上有一个名为 ID 的列。我正在寻找一种方法,以便当我运行宏时,Sheet2 上的值将被 Sheet1 中相应的新 ID 替换。例如,在 Sheet2 上,第一个 ID 是 ABC。在 Sheet1 上,ABC 的相应 New ID 值为 123。我希望 VBA 脚本将 Sheet2 上的所有 ABC 替换为 123。我需要这个来处理不同数量的数据。

Sheet1 Sheet2

到目前为止,我已经尝试了以下方法,但它不会改变单元格 子测试1()

Dim N As Long, L As Long
Dim rLook As Range

Sheets("Sheet1").Select
N = Cells(Rows.Count, "A").End(xlUp).Row
aryA = Range("A2:A" & N)
aryB = Range("B2:B" & N)

Sheets("Sheet2").Select
Set rLook = Range("A2:A" & N)
For L = 1 To N
    rLook.Replace aryA(L, 1), aryB(L, 1)
Next L

结束子

当我运行宏时,它只更改与 Sheet1 相同的行数,所以我只剩下以下内容:

Result

运行此程序后,我收到一个错误,提示下标超出范围。

【问题讨论】:

    标签: excel vba replace


    【解决方案1】:

    你的错误基本上是你重用了 N,它是 sheet1 中的行数来定义 sheet2 上的范围。

    所以我的建议是对变量使用更明确的名称来解释变量“包含”什么。

    此外,如果您不使用隐式 Cells(xxx) 而是使用显式 Thisworkbook.Worksheets("Sheet1"),则可以省略工作表的选择(从而减少引用错误范围的错误的可能性)。

    另外:您可以将 sheet1 的两列读入一个数组

    Option Explicit
    
    Public Sub updateSheet2IDs()
    
    Dim wsSource As Worksheet
    Set wsSource = ThisWorkbook.Worksheets("Sheet1")
    
    Dim wsTarget As Worksheet
    Set wsTarget = ThisWorkbook.Worksheets("Sheet2")
    
    Dim cntRowsSheet1 As Long
    Dim arrSource As Variant
    With wsSource
        cntRowsSheet1 = .Cells(.Rows.Count, "A").End(xlUp).Row
        
        'array includes both columns: arrsource(1,1) = A2, arrsource(1,2) = B2
        arrSource = .Range("A2:B" & cntRowsSheet1)
    End With
    
    Dim cntRowsSheet2 As Long, rgTarget As Range
    With wsTarget
        cntRowsSheet2 = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set rgTarget = .Range("A2:A" & cntRowsSheet2)
        
        Dim i As Long
        For i = 1 To UBound(arrSource, 1)   'ubound gives you the upper bound of the array
            rgTarget.Replace arrSource(i, 1), arrSource(i, 2)
        Next
    End With
    
    End Sub
    

    您可以通过使用currentregion 省略整个“cntRows” - 它返回一个单元格周围被空行和空列包围的区域(请参阅https://docs.microsoft.com/en-us/office/vba/api/excel.range.currentregion)。

    这意味着 wsSource.Range("A1").CurrentRegion 将返回所有单元格,直到第一个空行和第一个空列 - 我认为这正是您正在寻找的。 sheet2 也一样。

    要省略第一行,可以使用offset

    set rgTarget = wsTarget.Range("A1").CurrentRegion.Offset(1)

    然后代码看起来像

    Option Explicit
    
    Public Sub updateSheet2IDs()
    
    Dim wsSource As Worksheet
    Set wsSource = ThisWorkbook.Worksheets("Sheet1")
    
    Dim wsTarget As Worksheet
    Set wsTarget = ThisWorkbook.Worksheets("Sheet2")
    
    
    'array includes both columns: arrsource(1,1) = A2, arrsource(1,2) = B2
    Dim arrSource As Variant
    arrSource = wsSource.Range("A1").CurrentRegion.Offset(1)
    
    
    Dim rgTarget As Range
    Set rgTarget = wsTarget.Range("A1").CurrentRegion.Offset(1)
    
    Dim i As Long
    For i = 1 To UBound(arrSource, 1)   'ubound gives you the upper bound of the array
        rgTarget.Replace arrSource(i, 1), arrSource(i, 2)
    Next
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多