【问题标题】:Excel Macro for vlookup Various Questions: change #n/a to zero; directly find lookup value and paste value of result用于 vlookup 的 Excel 宏 各种问题:将 #n/a 更改为零;直接查找结果的查找值和粘贴值
【发布时间】:2014-01-17 02:55:22
【问题描述】:

我记录了一个 vlookup 宏来获取 r1c1 公式,然后编写了一个简单的宏来将公式应用于整个列范围。见下面的代码

信息: •我有一个对帐选项卡,其中从第 6 行开始的列中列出了唯一 ID。ID 或行的数量是可变的,这意味着它总是可以更改,但目前大约是 15000 个 ID。这是一个包含所有 ID 的列表。 ID 是一个连续的列表。中间没有休息。请记住,我在填充的最后一个 ID 下面几行有一个 Grand Total Row。 •我在同一个工作簿中有第二张表,它在A 列中包含相同类型的ID,在C 到I 列中有不同的金额——第二张表称为“老年AR”。并非所有 ID 都可能包含在此工作表中,因为此选项卡代表不同类型的报告。

我开发了以下代码以在对帐选项卡开始 D 列第 6 行创建 Vlookup,以提取第二个工作表“老年 AR”的 C 列(第 3 列)中的金额并将其应用于整个范围D 列中的行一直到 A 列中填充的最后一个 ID。数组或查找范围正在“老化 AR”选项卡上查找,从列中选择 A 到 I 列的所有内容,因为我将在对帐上应用此公式选项卡用于从 H6 列开始的范围,并在“老年 AR”表的 H 列中提取金额。

问题: 1.如何扩展代码以将#N/A 结果更改为零值? 2.如何让所有结果将单元格格式化为值而不是离开 vlookup 公式? 3. 使用这个循环,我如何继续在 H 列中执行相同类型的循环,从侦察选项卡上的 H6 开始,查找第二张表“Aged AR”上设置的 vlookup 数组中的第 8 列? 3.我预计循环会导致宏需要一段时间,因为一旦我的项目完成到六列并且有很多行,我将应用这种类型的公式。我工作簿中的所有参考表都包含相同类型的 ID。有没有办法在不使用 vlookup 公式的情况下提取引用的信息并将其填充到我希望在“对帐”表上指定的位置。它会使宏的工作效率更高吗?

我昨天和今天早上都在阅读不同的示例,但由于我完全是使用 VBA 的业余爱好者,所以我没有注意到可以从中学到的东西

Sub findit()

Dim oRange As Range
 Dim rec As Worksheet


'reconciliation tab contains ID's in column A
 Set rec = Sheets("Reconciliation")

'Located the end of the range I would like to populate in column D by finding the last row of IDs in column A

Set oRange = rec.Range(rec.Range("D6"), rec.Range("A6").End(xlDown).Offset(0, 3))

'apply the vlookup formula to using each ID as a lookup value in column A and populating the result in column D for as far down as the IDs are populated

For Each cell In oRange

'vlookup formula is actually =vlookup(A6,'Aged Ar'!$A!:$I,3,false)

'where the lookup value A6 will increase to A7, A8,....n where n is the last row of IDs as it is applied to each row below starting at "D6"

cell.FormulaR1C1 = "=VLOOKUP(RC[-3],'Aged AR'!C1:C9,3,FALSE)"

Next cell

 End Sub

【问题讨论】:

  • 感谢您的编辑。当我复制宏时,我没有意识到它是以那种格式出现的

标签: vba excel


【解决方案1】:

你可以使用更高效的代码:

With oRange
    .Formula = "=IFERROR(VLOOKUP(A6,'Aged Ar'!$A:$I,3,FALSE),0)"
    .Value = .Value
End With

而不是你的 For Each 循环:

For Each cell In oRange

'vlookup formula is actually =vlookup(A6,'Aged Ar'!$A:$I,3,false)

'where the lookup value A6 will increase to A7, A8,....n where n is the last row of IDs as it is applied to each row below starting at "D6"

cell.FormulaR1C1 = "=VLOOKUP(RC[-3],'Aged AR'!C1:C9,3,FALSE)"

Next cell

1) 此代码将#N/A 结果更改为零值(IFERROR 函数)

2) 单元格格式化为值而不是离开 vlookup 公式(.Value = .Value 语句)

3) 这段代码将使宏的工作效率更高

4) A6 将增加到 A7, A8,..n 对应的行

【讨论】:

  • 我觉得有点像白痴。我在不同的代码上使用 With/End With 做了类似的事情。我的问题是我不知道足够多的语言来关联类似的情况。这效果要好得多。问题:语句中的“With oRange .formula ....”部分是否等同于“oRange.formula ...”?
  • 非常感谢。你的帮助真的让我在我的项目中取得了进展。这对我帮助很大,我学到了很多东西。
猜你喜欢
  • 2014-03-14
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多