Arhn - архитектура программирования

Проблемы с ВПР, массивами и коллекциями. в VBA

Итак, немного контекста. У меня есть некоторый код, который сортирует список местоположений частей, чтобы создать местоположения раскрывающегося списка, которые можно выбрать и которые позже будут использоваться в другом месте для сортировки. Местоположение представляет собой 9-значный код, и я пытаюсь использовать VLookup, чтобы найти имя, соответствующее его коду местоположения, на другом листе, объединяя их в массив, а затем отображая этот массив в поле со списком.

В настоящее время я получаю сообщение об ошибке «Subscript out of range» в строке, содержащей VLookup.

Locan2(i, 1) = Application.VLookup(Locan(i), Sheet16.Range("A2:D700"), 2, False)

Я включил ниже всю подпрограмму для контекста, любая помощь будет оценена, это меня сильно раздражает, и я не могу найти ничего похожего в своих поисках.

Private Sub Compbox() '<============Populates Location Drop down list==============>
Dim lastrow As Long
Dim Locn As String
Dim Locan() As String
Dim Locan2() As String
Dim Location As Collection

lastrow = Sheet5.Cells(Sheet5.Rows.Count, "J").End(xlUp).Row 'Find length of Sheet5
Set Location = New Collection

For i = 4 To lastrow
    Locn = Sheet5.Cells(i, 10).Value
    On Error Resume Next
    Location.Add (Locn), CStr(Locn)          'Add location values, ignore duplicates
    On Error GoTo 0
Next i
i = 0
    QuickSort Location, 1, Location.Count     'Sort into ascending order

    CollectionToArray Location, Locan         'Turn into an array
    ReDim Locan2(UBound(Locan), 2)

    For i = 0 To UBound(Locan)
        Locan2(i, 0) = Locan(i)
        Locan2(i, 1) = Application.VLookup(Locan(i), Sheet16.Range("A2:D700"), 2, False)
    Next i
                                      'Find the corresponding location name and create a 2D array

With Me.ComboBox2
    .ColumnCount = 2
    .BoundColumn = 1                   'display combo box
    .ColumnWidths = "1 in; 3in"
    .List = Locan
End With

End Sub

Заранее спасибо за помощь!

27.01.2017

  • debug.print Locan(i) находится ли это в вашем диапазоне поиска? 27.01.2017
  • у тебя действительно есть Sheet16 ? Вы не предпочитаете работать с именем рабочего листа? Что делать, если VLookup не работает? если он не может найти совпадение? вам нужно поймать ошибку 27.01.2017
  • См. Ошибка выполнения '9': Индекс вне допустимого диапазона в Documentation.SO. 27.01.2017
  • Попробуйте использовать .... Locan2(i, 1) = Application.VLookup(Locan(i), Sheets(Sheet16).Range(A2:D700), 2, False) 27.01.2017
  • Также сделайте себе долгосрочную услугу и используйте более описательные имена переменных. Они очень похожи - Locan, Locn, Locan2 и т.д. 30.01.2017

Ответы:


1

Возможно, в вашей логике есть некоторая ошибка в этих шагах:

QuickSort Location, 1, Location.Count
CollectionToArray Location, Locan         'Turn into an array
ReDim Locan2(UBound(Locan), 2)

Потенциально ошибка «один за другим» или, может быть, не возвращается выделенный arr?

Я заметил, что вы используете пользовательские функции VBA для сортировки коллекции и преобразования в массив.

Почему бы не использовать встроенный объект ArrayList?

Dim Location As mscorlib.ArrayList
Dim Locan As Variant

Set Location = New mscorlib.ArrayList

For i = 4 To lastrow
    Locn = Sheet5.Cells(i, 10).Value
    On Error Resume Next
    Location.Add CStr(Locn)          'ArrayList has the add function too!
    On Error GoTo 0
Next i

Location.Sort               'Has the sort function built-in too!
Locan = Location.toArray    'And the toArray function is built-in too!!

Это может помочь вам, если вы выполняете стандартную быструю сортировку и поддерживаете функциональность toArray.

Я оставил полное объявление объекта, чтобы вы могли видеть, что вам нужно добавить ссылку на mscorlib.dll.

27.01.2017

2

Вы получаете сообщение об ошибке, потому что вы проходите мимо последнего индекса Locan2, я бы поставил точку останова в этой строке и взглянул на значение i. Трудно сказать больше, не имея перед собой всего листа.

27.01.2017
  • Используйте UBound(locan)+1 для установки Locan2, так как Ubound возвращает значение, основанное на 0. Например, массив UBound с 1 элементом возвращает 0. msdn.microsoft.com/en-us/library/95b8f22f(v=vs.90).aspx 27.01.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..