2016-12-21 45 views
0

我有一个宏将VLOOKUP插入列中。该宏必须以文本形式存储一个数字并将其转换为数字,然后在另一个表单中查找该数字。vba - 宏运行时产生不正确的结果,但是当进入结果正确时

宏始终会产生相同的结果,例如在开始产生错误结果之前到达第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的延迟会导致宏的运行时间太长。

更新: 我没有找到完美的解决方案,只有很长的一段时间。我只是将Vlookups结合到一张纸上,并将存储为文本的数字转换为vba例程之外的数字。这将误差从数字计算中删除(只是col C * 1),然后vlookups查找正确的值。无论如何,谢谢你的帮助。

+0

VBA不支持多线程占VlookUp范围。我正确地认为这是问题行:'Sheets(“Sheet2”)。Cells(counter,13).Value = checker'?它从Sheet2列输入数据3.该列是否包含公式或值? –

+0

是的,tbh我只是猜测。没有列3将文本存储为文本。如果它具有.value或不具有相同的结果。 – Mojojojo

+0

是否col C> 32,767中的任何值? –

回答

0

你能避免循环,checker和所有那些If-Then-Else,像如下

编辑取决于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 
+0

范围更改不取决于行号,而取决于行中的值,因此此方法不起作用。 – Tragamor

+0

你是什么意思?你测试过了吗? – user3598756

+0

'FormulaR1C1'表示法,'RC3'表示“当前行 - 第3列”,因此书面公式将始终引用它们在 – user3598756

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