【问题标题】:Update values of a column using Index & Match (Excel/VBA)使用索引和匹配 (Excel/VBA) 更新列的值
【发布时间】:2018-01-09 15:17:20
【问题描述】:

波纹管是我的代码的一部分,我的编码已经差不多完成了,但是现在我发现了一个大问题,需要纠正。

我在超过 10000 行的工作表上使用此代码,我的目的是使用索引和匹配函数更新列。它所做的是用另一张纸上的相应值替换 J 列中范围的所有单元格。最大的问题是我不希望没有匹配项的单元格被替换为 #N/A 并且它们保留旧值。

我该怎么办?

Dim SourceRange As Range
Dim fillRange As Range

'bellow formula in A1 notation:
'=INDEX('[myWB.xls]Sheet1'!$A:$B;
'IF(INDEX('[myWB.xls]Sheet1'!$A:$A;MATCH(C4;'[myWB.xls]Sheet1'!$A:$A))=C4;
'    MATCH(C4;'[myWB.xls]Sheet1'!$A:$A);
'    NA());
'    2)

ActiveCell.FormulaR1C1 = _
"=INDEX([myWB.xls]Sheet1!C1:C2,IF(INDEX([myWB.xls]Sheet1!C1,MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1))=R[-11]C[-12],MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1),NA()),2)"

' autofill formula in column
Set SourceRange = Cells(2, 10)
Set fillRange = Range(Cells(2, 10), Cells(10000, 10))

With SourceRange
   .AutoFill Destination:=fillRange, Type:=xlCopy
End With

'replace formula with its value
With Range(Cells(2, 10), Cells(10000, 10))
   .Value = .Value
End With

更新

这是我当前的代码,有一些改进。感谢 Rob Anthony 的帮助。

Dim calc As XlCalculation
Dim f as String

With Workbooks(FinalWB.xls).Worksheets(1)  'Worksheet to be updated
    calc = Application.Calculation
    Application.Calculation = xlCalculationAutomatic  'Ensure automatic calculation is ON
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    'Copy Column J to Column Z
    Range(.Cells(2, 26), .Cells(10000, 26)).Value = _  ' Col Z =
    Range(.Cells(2, 10), .Cells(10000, 10)).Value      ' Col J

    f = "=if(ISERROR(INDEX([myWB.xls]Sheet1!C1:C2,IF(INDEX([myWB.xls]Sheet1!C1,MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1))=R[-11]C[-12],MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1),NA()),2)),RC[16],INDEX([myWB.xls]Sheet1!C1:C2,IF(INDEX([myWB.xls]Sheet1!C1,MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1))=R[-11]C[-12],MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1),NA()),2))"

    With Range(.Cells(2, 10), .Cells(10000, 10))
       .FormulaR1C1 = f    'fill formula without Autofill
       .Value = .Value     'replace formula with its value
    End With

    'Delete Column Z
    .Columns(26).EntireColumn.Delete
End With

Application.Calculation = calc
Application.ScreenUpdating = True
Application.EnableEvents = True

'This is above formula. now seems so easy to understand :)
'    f = 
'    "=IF(                                   'if calculations result an error...
'        ISERROR(
'               INDEX([myWB.xls]Sheet1!C1:C2,
'                    IF(
'                      INDEX([myWB.xls]Sheet1!C1,
'                           MATCH(R[-11]C[-12],
'                                [myWB.xls]Sheet1!C1)
'                           )=R[-11]C[-12],
'                      MATCH(R[-11]C[-12],
'                           [myWB.xls]Sheet1!C1),
'                      NA()
'                      ),
'                    2
'                    )
'               ),
'        RC[16],                             'use previousely copied value of the cell...
'        INDEX([myWB.xls]Sheet1!C1:C2,       'else use that calculations 
'             IF(
'               INDEX([myWB.xls]Sheet1!C1,
'                    MATCH(R[-11]C[-12],
'                         [myWB.xls]Sheet1!C1)
'                    )=R[-11]C[-12],
'               MATCH(R[-11]C[-12],
'                    [myWB.xls]Sheet1!C1),
'               NA()
'               ),
'             2
'             )
'        )
'    "

【问题讨论】:

    标签: excel insert-update vba


    【解决方案1】:

    解决此问题的最简单方法是将列 J 复制并粘贴到新列(例如 Z)中。然后,把这个公式放到J列

    =if(ISERROR(INDEX([myWB.xls]Sheet1!C1:C2,IF(INDEX([myWB.xls]Sheet1!C1,MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1))=R[-11]C[-12],MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1),NA()),2)),RC[16],INDEX([myWB.xls]Sheet1!C1:C2,IF(INDEX([myWB.xls]Sheet1!C1,MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1))=R[-11]C[-12],MATCH(R[-11]C[-12],[myWB.xls]Sheet1!C1),NA()),2))
    

    我检查公式是否返回有效值,如果没有,则输入 Z 列中的值(根据您之前的评论,我假设 RC[16] 是对此的有效参考) , 否则我输入计算的值。

    如果没有看到您的电子表格,就很难确切地看到您要执行的操作。或许可以缩短这个函数。

    【讨论】:

    • 这似乎不起作用。如果我说,RC [16],参考。对于 Z 列,它实际上导致将一个不相关的数字(= Z 列与该行交叉的单元格的内容)作为行号传递给外部索引函数,实际上是不存在项目的假行号。所以我们不会保留原始值。当然原始值仍然存在于 Z 列中。
    • 太棒了!它正在工作......但我应该深入研究它,你的公式对我来说并不那么明显。我将尝试制作一个简化的工作示例以分享
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2014-12-10
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多