Почему VLookup не работает на моем определенном диапазоне? - PullRequest
2 голосов
/ 24 января 2020

Когда я запускаю третью-последнюю строку с помощью VLookup, я продолжаю получать "Метод" Диапазон "объекта" _Global "не удалось". Кажется, это ссылка на Range ("InfoOmArt"), которая не работает. Я застрял навсегда.

'Writes array "Artskoder" in a new worksheet
Dim InfoOmArt As Range
Sheets.Add
ActiveSheet.Name = "InformationOmArter"
Range("A1").Value = "Artsforkortelse"
Range("B1").Value = "Artskode"
Set InfoOmArt = ActiveSheet.Range("A1:B54")
InfoOmArt.Value = Artskoder
Worksheets("InformationOmArter").Move after:=Worksheets("Standarder")
Worksheets("Standarder").Activate


'Looping through sorter
Dim p As Range, abbr As Variant, MyStr As String

For Each p In Range(Cells(1, 1), Cells(44, 2))
    abbr = Cells(p.Row, 1).Value
    Debug.Print abbr
    MyStr = Application.WorksheetFunction.VLookup(abbr, Range("InfoOmArt"), 2, False) 'Arg.1 as a string seems to only works if it searhes in the spreadsheat, not in an array
    Cells(p.Row, 4).Value = MyStr
Next p

1 Ответ

1 голос
/ 24 января 2020

Здесь есть несколько проблем, которые я бы предложил изменить:


"Я продолжаю получать" Метод "Диапазон" объекта '_Global' не удалось ""

Проблема с вышеуказанным заключается в том, что вы установили переменную Range с именем InfoOmArt. Затем вы go и используете это как NamedRange в выражении Range(..). Это неверно, поскольку ваша переменная уже сама по себе является Range объектом. Так что измените:

Range("InfoOmArt") на InfoOmArt.


"Но не должно ли это работать, когда я указываю его с помощью таблиц (" InformationOmArter " ) .Range ("A1: B54"). Я пытался изменить его на InfoOmArt. Теперь в нем говорится о невозможности использования свойства VLookup в функции Worksheets? "

Нет, это не так не надо работать perse. Пока ваша переменная Abbr содержит значение, которое NOT не может быть найдено в объекте Range, она будет вызывать ошибку (на этот раз ошибка 1004).


Затем вы проходите через Range объект, подобный этому:

For Each p In Range(Cells(1, 1), Cells(44, 2))
    abbr = Cells(p.Row, 1).Value

Это в основном делает то же самое дважды. Range(Cells(1, 1), Cells(44, 1)), делает l oop только один раз. И просто для будущих ссылок, может быть даже лучше вытащить эти значения в массив до l oop через память и не делать никаких обращений к ячейкам таблицы (что медленнее на больших диапазонах).


Вы также делаете много неявных ссылок на листы. Эти ссылки не содержат явного Worksheet родителя и, таким образом, делают вызовы неявного ActiveSheet.

И это то, чему вы должны научиться избегать. ActiveSheet и Activate вряд ли когда-либо понадобятся. Взгляните на эту старую ветку на SO, чтобы узнать, как этого избежать.


Мое последнее предложение - начать использовать Range.Find.

...