Excel VBA: ошибка приложения или объекта при сохранении именованного диапазона в массиве - PullRequest
0 голосов
/ 28 июня 2018

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

Для примера у меня есть два именованных диапазона: Fruit и Quantity. Ниже приведены значения в каждом диапазоне.

Fruit: яблоки, апельсины и бананы (расположены в B3:B5)

Quantity: 3, 4 и 5 (находится в C3:C5)

Ниже приведен код, который я придумал для хранения Fruit в массиве.

Sub FruitArray()
  Dim Fruits As Variant
  Dim Fruit As Variant

  Fruits = ThisWorkbook.Worksheets("Inventory").Range("Fruit") ' Run-time error '1004': Application-defined or object defined error

  For Each Fruit In Fruits
    Debug.Print Fruit
  Next
End Sub

Когда я запускаю этот код, я получаю «Ошибка времени выполнения 1004: ошибка приложения или объекта», и отладчик выделяет строку Fruits = ThisWorkbook.Worksheets("Inventory").Range("Fruit").

Когда я запускаю почти идентичный код для Quantity, он работает и печатает 3, 4, 5 в окне Immediate.

Sub QuantityArray()
  Dim Quantities As Variant
  Dim Quantity As Variant

  Quantities = ThisWorkbook.Worksheets("Inventory").Range("Quantity")

  For Each Quantity In Quantities
    Debug.Print Quantity
  Next
End Sub

Сначала я подумал, что проблема заключается в том, что я не могу сохранить текст в массивах из диапазона, но когда я указываю фактический диапазон в коде, а не именованный диапазон, он работает и печатает яблоки, апельсины и бананы.

Sub FruitArray()
  Dim Fruits As Variant
  Dim Fruit As Variant

  Fruits = ThisWorkbook.Worksheets("Inventory").Range("B3:B5")

  For Each Fruit In Fruits
    Debug.Print Fruit
  Next
End Sub

Есть ли что-то, чего мне не хватает, чтобы иметь возможность хранить текстовые значения именованных диапазонов в массиве?

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Я могу воспроизвести ошибку, когда я не определяю названный диапазон: Fruit. (Проверьте орфографию)

  1. Перейти на вкладку "Формулы"

  2. Открыть: менеджер имен

  3. Убедитесь, что «Фрукт» является именованным диапазоном.

Код количества, вероятно, работает, потому что задан указанный именованный диапазон.

0 голосов
/ 28 июня 2018

Проблема заключалась в том, что формула динамического именованного диапазона определяет, как долго диапазон использует функцию COUNT, и это не работает для текста, поэтому он возвращался как ошибка, которую VBA не смог обработать. После изменения формулы динамического именованного диапазона для использования функции COUNTA он смог прочитать диапазон и сохранить в нем массив, и проблема была решена.

0 голосов
/ 28 июня 2018

Как отмечено в комментариях: проверьте, что именованный диапазон действительно существует первым.

Более общие замечания по работе с именованным диапазоном:

Для Variant (Я думаю, массив)

Fruits = ThisWorkbook.Worksheets("Inventory").Range("Fruit").Value

Помните, что считанный с листа диапазон - это 2D, а не один. И вы перейдете от LBound к UBound.

Пример:

Sub test()
    Dim Fruits()
    Fruits = ThisWorkbook.Worksheets("Inventory").Range("Fruit").Value
    Dim i As Long, j As Long
    For i = LBound(Fruits, 1) To UBound(Fruits, 1)
        For j = LBound(Fruits, 2) To UBound(Fruits, 2)
            Debug.Print Fruits(i, j)
        Next j
    Next i
End Sub

Для Range объекта:

Если вместо этого вы на самом деле хотите работать с объектом Range, чтобы вы могли использовать For Each Loop, тогда вам нужно следующее.

Option Explicit
Public Sub FruitArray()
  Dim Fruits As Range, Fruit As Range
  Set Fruits = ThisWorkbook.Worksheets("Inventory").Range("Fruit")

  For Each Fruit In Fruits
    Debug.Print Fruit '<== This takes advantage of default member .Value
  Next
End Sub

...