2016-12-21 39 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