Анализ массива, возвращенного из RTD в Excel

#arrays #vba #excel #rtd

#массивы #vba #excel #rtd

Вопрос:

Я использую формулу RTD на листе Excel для получения списка элементов в ячейке A1:

 =RTD("josh.rtd",,"Letters",,"Lower")
  

Возвращаемый список в ячейке A1 заключен в фигурные скобки и разделен точкой с запятой. По сути, это одномерный массив строк, который выглядит следующим образом

{«a»; «b»;»c»;»d»}

Если я скопирую этот результат и вставлю значения в A2, затем скопируйте A2, выделите четыре ячейки из столбца в электронной таблице, например A3: A6, и введите «=» в окне формулы и вставьте результат,

 ={"a";"b";"c";"d"}
  

Я могу удерживать ctrl shiftenter и заполнять каждую из этих ячеек элементом массива следующим образом:

a

b

c

d

Мой вопрос заключается в следующем: есть ли формула, которую я могу использовать для анализа этого исходного результата формулы RTD? Я хочу заполнить элемент управления поля со списком элементами этого массива. Я хотел бы иметь возможность делать это либо в формуле ячейки, либо через VBA.

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

1. Для формулы вы можете использовать INDEX функцию.

2. Спасибо @Ron, я посмотрел на ИНДЕКС, но я не вижу, как в этом случае используется функция INDEX. Я могу найти только примеры использования индекса для ссылки на ссылку на ячейку. На данный момент весь массив существует в ячейке A1. Если бы я назвал ячейку A1 «буквами», то в A2 было бы здорово, если бы я мог поместить =letters[2] и получить «b» (или «c», если индекс равен базовому 0). Ответ от Джона дает мне 90%.

3. Нет требования, чтобы аргумент массива для индексной функции был диапазоном. Вы должны поместить RTD формулу в качестве array аргумента, а затем просмотреть разные строки (или столбцы в зависимости от того, как возвращает RTD). Что-то вроде INDEX(RTD(...),2,1) должно возвращать второй элемент в массиве. Если он возвращает строку, которая выглядит как массив, то это не сработает.

4. @RonRosenfeld Отлично, спасибо. Используя приведенную ниже функцию Джона, это работает: =INDEX(ParseArray(A1),1,2)

Ответ №1:

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

 Function ParseArray(ArrayString As String) As Variant
    Dim s As String
    s = Replace(ArrayString, "{", "")
    s = Replace(s, "}", "")
    s = Replace(s, """", "")
    ParseArray = Split(s, ";")
End Function
  

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

1. Вы разделяете строки, но не столбцы. Было бы проще оценить его, как в статье, на которую вы ссылались.

2. @ThomasInzina Хорошие моменты, но OP специально сказал, что в их приложении это был одномерный массив. Evaluate превратило бы его в один из тех раздражающих псевдо-2-мерных массивов, которые были бы не так удобны для некоторых приложений.

3. Спасибо, @JohnColeman! Это здорово. Мой следующий шаг — заполнить поле со списком элементами массива. Я хотел бы иметь возможность подсчитывать элементы массива, возвращать элемент по индексу и другие вещи через VBA. Вместо того, чтобы получать ответ, есть ли какие-либо другие документы, которые вы бы порекомендовали, чтобы узнать больше о работе с массивами в VBA?

4. =INDEX(ParseArray(A1),1,2) дает мне второй элемент и =COUNTA(ParseArray(A1)) дает мне количество элементов.

5. Я уверен, что там есть учебные пособия / видеоролики на YouTube, но если вам нравятся книги, я бы порекомендовал книгу Джона Уолкенбаха «Программирование на Excel VBA для чайников». Впервые я изучил VBA в более раннем издании этой книги. Его веб-сайт также является хорошим источником информации ( spreadsheetpage.com )