【问题标题】:Run-Time Error 1004 VBA - VLookup on second instance of for loop?运行时错误 1004 VBA - for 循环的第二个实例上的 VLookup?
【发布时间】:2021-07-12 20:57:46
【问题描述】:

我的 VBA 代码中的 VLookup 存在问题。当我没有使用 CurrentRegion 将范围作为动态大小时,它完美地工作,现在无论出于何种原因,它只适用于单个循环,并且在第一次 VLookup 时失败。我尝试过使用和不使用 with 块。我有一个变量,它将替换 for 循环中的 5 并且可以工作,但将其保留为原始变量,因此不会影响它。

如果这是重复的,我很抱歉,但我找不到答案。任何帮助将不胜感激。

Set jobTypeData = Worksheets("JobType").Range("A1").CurrentRegion

For i = 1 To 5
    jobTypeTemp = Worksheets("Employees2").Cells(i + 1, 16).Value
    jobRoleTemp = Worksheets("Employees2").Cells(i + 1, 17).Value
    
    'Creates variables relevant to the job type
    With Worksheets("JobType")
        minHours = CDec(WorksheetFunction.VLookup(jobTypeTemp, jobTypeData, 2))
        maxHours = CDec(WorksheetFunction.VLookup(jobTypeTemp, jobTypeData, 3))
        minShift = CDec(WorksheetFunction.VLookup(jobTypeTemp, jobTypeData, 5))
        maxShift = CDec(WorksheetFunction.VLookup(jobTypeTemp, jobTypeData, 6))
        shiftGap = CDec(WorksheetFunction.VLookup(jobTypeTemp, jobTypeData, 7))
    End With

这下面还有更多代码,但在使用动态数据大小之前,它们都可以正常工作并且可以正常工作。 有效的代码不会改变 jobTypeData 的内容或大小。 我还检查了 VLookup 返回的值,它们都是正确的。我唯一能想到的是它找不到第二个jobType,但是我检查过它们是相同的(没有隐藏空格)。

【问题讨论】:

  • 失败怎么办?有什么错误?对我来说效果很好。我怀疑CurrentRegion 没有返回你想要的。在For 行上放一个断点,然后在即时窗口中输入?jobTypeData.Address,看看你得到了什么。
  • 我刚刚尝试过,它返回的正是预期的内容,第一次和第二次循环结束。错误是 1004 运行时错误“应用程序定义或对象定义错误”。错误发生在 VLookup 处,我在第一个和第二个 VLookup 处设置了断点,第一次通过没有问题,第二次通过,尝试运行第一个 VLookup 后出现上述错误
  • vlookup后还有代码吗?
  • 后面有很多代码(循环中还有 118 行),但我不明白的是,它不仅在使用 CurrentRegion 之前有效,而且 CurrentRegion 没有改变(正如我之前的评论检查 .Address 所证明的那样),显示的代码中使用的值在整个其余部分都没有改变,仅用于数学方程来改变完全独立的非交互工作表上的内容。而且因为它第一次也有效,老实说我很困惑。
  • 我认为切换到动态范围只是一个巧合。除非您告诉我您可以将其更改回静态范围并且它可以工作。我认为其他事情发生了变化,而您没有意识到。您能否将 VLOOKUP 公式放在工作表的备用单元格中并查看它是否有效?

标签: excel vba for-loop vlookup


【解决方案1】:

答案似乎与 VLookup 使用“近似匹配”的方式有关。

我一直认为如果 VLookup 是一个选项,它仍然会提供精确匹配,并且因为我有严格的数据验证,所以我从没想过使用近似匹配会是一个问题。然而,事实证明,它不仅有点不可预测,而且实际上并不可靠。

检查后假设“角色名称”与“团队经理”的匹配度比“团队经理”更接近。将其更改为使用“精确匹配”后,一切正常。之前工作的代码也没有更改。 好吧,吸取教训...

当你有完全匹配时,总是使用(无论你多么自信,都以我为例):

VLOOKUP(arg1, arg2, arg3, FALSE)

不是:

VLOOKUP(arg1, arg2, arg3)

【讨论】:

  • 好收获。近似匹配选项使用二分搜索算法。我认为如果您知道算法,那是完全可以预测的,但这并没有多大帮助。如果它在第一次评估时选择了“错误”的树,它将永远找不到“团队经理”,因为它位于二叉树的另一半。我的规则是始终使用 FALSE,除非我有令人信服的理由不这样做。
  • 很公平,感谢您的意见,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2015-02-01
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多