vba - 宏在 运行 时产生不正确的结果,但在进入结果时是正确的
vba - Macro producing incorrect results when run, but when stepping into results are correct
我有一个将 VLOOKUP
插入到列中的宏。在另一个 sheet.
中查找该数字之前,宏必须将一个数字存储为文本并将其转换为数字
宏总是产生相同的结果,例如在开始产生错误结果之前到达第 43 行,但是当使用 F8
逐步执行代码时,不会产生这些不正确的结果。
错误的结果是第 13 列中的值不等于存储为文本的数字。大多数情况下,似乎来自上方和下方行的值,有时下方的 2 行被插入到第 13 列。在我看来,几乎好像 2 个不同的线程正在 运行 以 2 种不同的速度或类似的速度运行?
如果有人可以查看导致错误的循环,我将不胜感激。
For counter = 2 To NumRowsList
checker = CInt(Sheets("Sheet2").Cells(counter, 3)
Sheets("Sheet2").Cells(counter, 13).Value = checker
'Call WaitFor(0.5)
If checker < 4000 Then
Sheets("Sheet2").Cells(counter, 14) = "=VLOOKUP(M" & counter & ",Sheet4!E2:F126,2,FALSE)"
Else
Sheets("Sheet2").Cells(counter, 14) = "=VLOOKUP(M" & counter & ",Sheet5!B2:C200,2,FALSE)"
End If
Next counter
我尝试了此代码的一些类似变体,例如直接使用第 13 列中存储的值而不是使用 VLOOKUP
中的单元格引用,总是产生相同的结果。
我什至使用 waitfor 函数尝试创建一个延迟,希望它可以同步操作,但它没有帮助,使用超过 0.5 的延迟会导致宏的 运行 时间太大了。
更新:
我没有找到完美的解决方案,只有长期的工作。我只是将 Vlookup 组合到一个 sheet 上,并将存储为文本的数字转换为 vba 例程之外的数字。这消除了数字计算的错误(只是 C * 1 列),然后 vlookup 正在查找正确的值。无论如何,谢谢你的帮助。
以下对我的测试数据有效,但你需要看看它是否适合你...(你是否也关闭了计算或事件?我不知道这是否有问题?)
我发现设置对您要使用的 sheet 的引用比直接访问它更可取,这可能有帮助吗?
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet2")
Dim VLURange As String, checker As Long
For counter = 2 To 200 ' NumRowsList
checker = CLng(ws.Cells(counter, 3).Value)
ws.Cells(counter, 13) = checker
VLURange = IIf(checker < 4000, "Sheet4!E2:F126", "Sheet5!B2:C200")
ws.Cells(counter, 14) = "=VLOOKUP(M" & counter & ", " & VLURange & ", 2, FALSE)"
Next counter
你可以避免循环,checker
和所有那些 If-Then-Else
,如下所示
编辑以根据VlookUp
值
计算VlookUp
范围
With Worksheets("Sheet2")
.Range("N2", .Cells(NumRowsList, 14)).FormulaR1C1 = "=VLOOKUP(Value(RC3),IF(Value(RC3)<4000,Sheet4!R2C5:R126C6,Sheet4!R2C2:R200C3),2,FALSE)"
End With
我有一个将 VLOOKUP
插入到列中的宏。在另一个 sheet.
宏总是产生相同的结果,例如在开始产生错误结果之前到达第 43 行,但是当使用 F8
逐步执行代码时,不会产生这些不正确的结果。
错误的结果是第 13 列中的值不等于存储为文本的数字。大多数情况下,似乎来自上方和下方行的值,有时下方的 2 行被插入到第 13 列。在我看来,几乎好像 2 个不同的线程正在 运行 以 2 种不同的速度或类似的速度运行?
如果有人可以查看导致错误的循环,我将不胜感激。
For counter = 2 To NumRowsList
checker = CInt(Sheets("Sheet2").Cells(counter, 3)
Sheets("Sheet2").Cells(counter, 13).Value = checker
'Call WaitFor(0.5)
If checker < 4000 Then
Sheets("Sheet2").Cells(counter, 14) = "=VLOOKUP(M" & counter & ",Sheet4!E2:F126,2,FALSE)"
Else
Sheets("Sheet2").Cells(counter, 14) = "=VLOOKUP(M" & counter & ",Sheet5!B2:C200,2,FALSE)"
End If
Next counter
我尝试了此代码的一些类似变体,例如直接使用第 13 列中存储的值而不是使用 VLOOKUP
中的单元格引用,总是产生相同的结果。
我什至使用 waitfor 函数尝试创建一个延迟,希望它可以同步操作,但它没有帮助,使用超过 0.5 的延迟会导致宏的 运行 时间太大了。
更新: 我没有找到完美的解决方案,只有长期的工作。我只是将 Vlookup 组合到一个 sheet 上,并将存储为文本的数字转换为 vba 例程之外的数字。这消除了数字计算的错误(只是 C * 1 列),然后 vlookup 正在查找正确的值。无论如何,谢谢你的帮助。
以下对我的测试数据有效,但你需要看看它是否适合你...(你是否也关闭了计算或事件?我不知道这是否有问题?)
我发现设置对您要使用的 sheet 的引用比直接访问它更可取,这可能有帮助吗?
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet2")
Dim VLURange As String, checker As Long
For counter = 2 To 200 ' NumRowsList
checker = CLng(ws.Cells(counter, 3).Value)
ws.Cells(counter, 13) = checker
VLURange = IIf(checker < 4000, "Sheet4!E2:F126", "Sheet5!B2:C200")
ws.Cells(counter, 14) = "=VLOOKUP(M" & counter & ", " & VLURange & ", 2, FALSE)"
Next counter
你可以避免循环,checker
和所有那些 If-Then-Else
,如下所示
编辑以根据VlookUp
值
VlookUp
范围
With Worksheets("Sheet2")
.Range("N2", .Cells(NumRowsList, 14)).FormulaR1C1 = "=VLOOKUP(Value(RC3),IF(Value(RC3)<4000,Sheet4!R2C5:R126C6,Sheet4!R2C2:R200C3),2,FALSE)"
End With