2016-12-21 9 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 не поддерживает несколько потоков. Я прав, думая, что это проблема: «Листы (« Лист2 »). Ячейки (счетчик, 13) .Value = checker'? Он издает свои данные из столбца Sheet2. Столбец содержит формулу или значение? –

+0

Да, tbh Я просто догадывался. Нет col 3 имеет номер, сохраненный в виде текста. он дает тот же результат, если он имеет .value или нет. – Mojojojo

+0

Являются ли какие-либо значения в col C> 32,767? –

ответ

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 
+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