Используя цикл и If, ElseIf приводит к сообщению: «Не удалось найти » (то, что я ищу)»

#excel #vba #if-statement

#excel #vba #if-оператор

Вопрос:

Пожалуйста, не подумайте, что это один из первых написанных мной VBA-кодов. То, что я написал, было смесью цикла и функции If. Предполагалось, что код будет проходить через столбец («AC»), если он найдет пустую ячейку. Он просматривает ту же строку, но в столбце D. Столбец D будет иметь 350 возможных значений. Если значение столбца D равно «одному из 350 возможных значений», тогда укажите «EU» ElseIf … это продолжается для всех 350

 Dim i As Long
i = 1
Do While Cells(i, "AC").Value <> ""
    If Cells(i, "D").Value = "OPP-1305-9066" Then
        Cells(i, "AC").Value = EU
    ElseIf Cells(i, "D").Value = "OPP-1305-0773" Then
        Cells(i, "AC").Value = EU
    ElseIf Cells(i, "D").Value = "another one of 350" Then
        Cells(i, "AC").Value = EU
    End If
    i = i   1
Loop
  

Комментарии:

1. Если эти 350 значений фиксированы, то сохраните их на листе и считайте в массив, а затем используйте этот массив для сравнения в цикле вместо записи 350 IF строк

2. Для If Cells(i, "AC").Value будет установлено значение EU (или должно быть "EU" ?) независимо от значения, зачем вообще иметь одно условие? Рассмотрите возможность использования списка проверки данных в столбце D, чтобы ограничить значения допустимыми (которые вы храните в отдельной таблице с 350 строками, затем определите именованный диапазон, чтобы заключить столбец, содержащий 350 значений, и использовать этот именованный диапазон в качестве вашего «списка» для проверки данных. Бац, пропала тысяча строк кода.

Ответ №1:

Не уверен, в чем суть ваших вопросов, но если EU не является переменной, вам не хватает скобок. Кроме того, вы выполняете цикл только тогда, когда столбец AC не пуст, поэтому, если AC2 пуст, но после ячейки AC4 есть еще данные, вы не проверяете это.

И самое главное, 350 операторов elseif, вау! 🙂 Вам будет полезно узнать о массивах / коллекциях.