2016-06-21 3 views
2

Я хочу подражать результатам встроенного «text-to-fields» в функции UDF. Мне нужно сделать это, потому что мои исходные данные поступают из веб-запроса, и мне нужно использовать результаты на отдельной странице и наметить эти результаты. Для прорисовки мне нужны отсутствующие значения для синтаксического анализа пустых ячеек, так как это единственная опция для графов Excel, чтобы показывать отсутствующие значения в виде пробелов.excel VBA - массив переменной длины от функции

Вы не можете сделать это со встроенным из-за двух ограничений;

1) Он не может нацелить обработанные поля на другой лист.

2) Попытка скопировать значения данных в лист адресата для их анализа там не удалась, поскольку текст-в-поля анализирует ссылочное выражение вместо значения, которое он ссылается.

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

Так что мне нужен синтаксический анализатор DIY, и в любом случае использование формулы лучше для моих общих потребностей, чем для макроопределения встроенной функции (даже если это сработает).

Мои поля выглядеть следующим образом:

calm 
    S 10 
    S 10 G 20 

И я хочу, чтобы разобрать только как текст в полях будет, что дало бы числители для чисел, строк для текста, и пустой пропавших без вести (т.е. более короткие значения.)

Так что я использовал этот код;

Function Explode(texte As String, Optional ByVal delimiter As String = " ") _ 
      As String() 
' mimic the text-to-fields, 
' but allow inter-sheet references 
    Explode = Split(texte, delimiter) 
End Function 

Но использовать его, я должен заранее определить вызывающую функцию клетку как часть массива, который является фиксированным размером, и я не знаю, как иметь это возвращать переменное число проанализированных полей в массив фиксированного размера. То, что я хочу от данных примера выше:

enter image description here

Но что я получаю вместо этого:

enter image description here

Обратите внимание, что пустые ячейки должны быть пустыми - не просто выглядеть пустым (не " «строки»).

Edit: Я подозреваю, что я, возможно, придется вместо этого создать суб, который устанавливает значения проанализированных полей и очищает остатки клеток для отсутствующих полей (я всегда иметь максимум четыре поля) вместо возвращать их, но я не очень опытный VBA. Например, что-то, что получает две ссылки на ячейки, одну для исходной ссылки, другую для целевого списка проанализированных полей. Затем вызовите это из функции , которую я могу встроить в лист. Программирование на основе побочных эффектов ...

+0

Трудно увидеть, как вы могли бы сделать эту строку за строкой, используя UDF, когда некоторые строки короче других: любая данная строка сама по себе должна знать, сколько полей было «предположительно» иметь. Вам нужно было бы передать дополнительный параметр, чтобы определить, сколько значений должно быть на выходе. –

+0

Можете ли вы предоставить некоторые примеры данных или даже лучше загружаемый тестовый заглушка? –

+1

Вы не можете вернуть Empty из функции, поэтому я боюсь, что ваш UDF никогда не будет делать то, что вы хотите. Вы можете просто изменить размер выходного массива с помощью 'Application.Caller.Count' за то, что стоит. – Rory

ответ

0

Вы можете сделать свою функцию возвратом фиксированного размера массива с помощью Redim Preserve.

{= Explode ($ A $ 1,50, "")}

Function Explode(texte As String, ArraySize As Integer, Optional ByVal delimiter As String = " ") _ 
      As String() 
    Explode = Split(texte, delimiter) 
    ReDim Preserve Explode(ArraySize- 1) 
End Function 
Смежные вопросы