【问题标题】:How can I vlookup the max value in VBA?如何查找 VBA 中的最大值?
【发布时间】:2022-12-22 02:59:11
【问题描述】:

我想构建一个表单,该表单可以选择使用之前提交的内容进行预填充。
有人可以每三个月提交一次表格(评估)并随着时间的推移审查他们的进度。通过预先填充以前提交的内容,他们不必从头开始。

我相信我需要使用 vlookup 来查看提交日期并返回与最近(或最大)日期对应的值。

我收到:

运行时错误“1004”:对象“WorksheetFunction”的方法“VLookup”失败。

Sub vlookup1()

    Set myrange = Range("data_table")

    Name = Application.WorksheetFunction.Max(Range("date_range"))

    answer.Value = Application.WorksheetFunction.vlookup(Name, myrange, 4, False)

【问题讨论】:

  • myrange 是否至少有 4 列? myrange 最左边的列中是否可以找到最大日期?
  • 是的 - myrange 大约有 50 列,日期存储在最左边的列中
  • 您能否 1) 将 Name 更改为另一个变量,因为它会隐藏 Name 语句,以及 2) Debug.Print 新变量(在您使用 Max 之后)并报告立即窗口中显示的输出?
  • "date_range"myrange 中左栏的范围相同吗?如果它们是两个不同的范围,那么由于单元格的数字格式,您可能会隐藏时间方面。这将使找到完全匹配变得非常困难。
  • 一种选择是在日期列上对 myrange 进行排序,然后在 Vlookup 上使用相对搜索:True 而不是 False

标签: excel vba excel-formula vlookup


【解决方案1】:

通过在调用 Vlookup 时删除 WorksheetFunction,您可以避免在找不到匹配项的情况下触发运行时错误。

这对我来说很好:

Sub Tester()

    Dim maxDt, myrange As Range, result
    
    Set myrange = Range("data_table")

    maxDt = Application.WorksheetFunction.Max(Range("date_range"))
    Debug.Print "Max date:", Format(maxDt, "yyyy-mm-dd")
    
    result = Application.VLookup(maxDt, myrange, 4, False) 'no `WorksheetFunction`
    If Not IsError(result) Then
        Debug.Print result
    Else
        Debug.Print "No match!"
    End If
    
End Sub

【讨论】:

  • 嗨蒂姆,谢谢你,这很有帮助,我现在没有收到错误!当我希望以这种方式预填充表单时(即将多个查找匹配到多个命名单元格中,有没有一种方法可以定义答案应该去哪里,然后复制它以获得大约 50 个响应?
  • 您可以将该 Sub 变成一个函数并传入(例如)“data_table”和“date_range”,然后从该函数返回 result
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 2015-06-16
  • 2017-06-09
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多