vba - 宏在运行时产生不正确的结果,但在步入结果时是正确的

时间:2016-12-21 12:09:21

标签: excel vba excel-vba macros vlookup

我有一个将VLOOKUP插入列中的宏。宏必须将一个数字存储为文本并将其转换为数字,然后在另一个工作表中查找该数字。

宏总是产生相同的结果,例如在开始产生错误结果之前到达第43行,但是当使用F8来逐步执行代码时,不会产生这些不正确的结果。

错误的结果是第13栏中的值不等于作为文本存储的数字。大多数情况下,似乎上下行的值,有时下面的行有两行被插入col 13.我觉得好像两个不同的线程以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

我尝试过这段代码的一些类似变体,例如直接使用col 13中存储的值,而不是使用VLOOKUP中的单元格引用,总是产生相同的结果。

我甚至使用waitfor函数尝试创建延迟,希望它可以同步操作,但它没有帮助,使用超过0.5的延迟会导致宏的运行时间太大。

更新: 我找不到完美的解决方案,只需要长时间的努力。我只是将Vlookups组合到一张纸上,并将存储为文本的数字转换为vba例程之外的数字。这使得错误远离数字计算(只是col C * 1),然后vlookup正在查找正确的值。无论如何,谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

以下内容适用于我的测试数据,但您需要查看它是否适合您...(您也关闭计算或事件吗?我不知道这可能有问题吗? )

我发现最好设置一个你想要使用的工作表的引用而不是直接访问它,这可能会有所帮助吗?

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

答案 1 :(得分:0)

您可以避免循环,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