【问题标题】:Trying to insert variable in match function in vba试图在vba的匹配函数中插入变量
【发布时间】:2021-02-13 15:33:48
【问题描述】:

我在运行此代码时遇到错误,无法理解这是什么问题:

i = ActiveCell.End(xlUp).Offset(0, 1).Value

ActiveCell.Offset(0, 1).Value = Application.WorksheetFunction.VLookup(r, source, WorksheetFunction.Match("i", msource, 0), 0)

【问题讨论】:

  • edit您的问题和文本中的邮政编码也包括其余部分,以便我们提供解决方案
  • 如果查找失败,Application.WorksheetFunction.***抛出一个运行时错误,而不是像工作表函数那样将其作为Variant/Error 值返回给调用单元格。如果查找失败时ActiveCell.Offset(0, 1).Value 应该是#N/A 错误,请使用后期绑定版本(注意:没有编译器帮助!):= Application.VLookup(...) 而不是= Application.WorksheetFunction.VLookup(...)
  • .Match("i", msource, 0) 应该是 .Match(i, msource, 0)。双引号使"i" 成为字符串文字值,因此您匹配文字值“i”。删除引号以匹配 i 变量的值。

标签: excel vba match


【解决方案1】:

Application.WorksheetFunction 调用工作表函数,但在 VBA 代码的上下文中:通常在 VBA 中,当函数抛出错误时,它以 运行时错误的形式出现,那就是这些函数的作用。

所以你有两个选择。

一、处理(或吞下)VBA 运行时错误:

On Error Resume Next
ActiveCell.Offset(1, 0).Value = Application.WorksheetFunction.VLookup(...)
On Error GoTo 0

像这样,当赋值的右侧抛出错误时(即查找失败时),左侧不会受到影响,并且目标单元格保持之前的任何值。注意On Error GoTo 0,它可以恢复运行时错误。这是至关重要的;没有它On Error Resume Next 将使您的代码在一些未处理的错误状态下运行,这是隐藏错误并使其以后几乎无法诊断的唯一最佳方法。

二,使用后期绑定的版本。

当直接针对Application 调用时,工作表函数是后期绑定的。您没有获得编译器帮助,因此请注意任何拼写错误并确保参数正确(您不会获得带有用于后期绑定成员调用的参数列表的工具提示)。

ActiveCell.Offset(1, 0).Value = Application.VLookup(...)

它是相同的VLookup 函数,但现在它的行为就像在工作表上一样,返回一个错误值,而不是抛出一个运行时错误,如VBA 函数会。这使得目标单元格值在查找失败时保持#N/A 工作表错误。

同样适用于内部Match 函数;现在虽然嵌套工作表函数是我们在工作表单元格的公式中做事的方式,但在代码中这样做会使一切变得比必要的困难得多 - 将事情分开,分别评估Match,验证它是否返回错误值,然后将其传递给VLookup 除非它没有。

Dim matchResult As Variant
matchResult = Application.Match(i, msource, 0)
If IsError(matchResult) Then Exit Sub

请注意,您的代码将文字字符串值"i" 传递给Match 函数;您可能打算传递 i 变量的值:您必须删除它周围的双引号才能做到这一点。

【讨论】:

  • 不仅对新手很有帮助,因为它解释了大多数教材中遗漏的 VBA 背景知识 :+)
猜你喜欢
  • 2023-01-16
  • 1970-01-01
  • 2018-10-03
  • 2015-08-22
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多