Как сделать пользовательскую функцию разделения массива в MS Excel?

Как сделать пользовательскую функцию Split (str as String, delimiter as String), используя Split() в VBA для использования на листе.. и она вернет результат в виде массива или SPILL.. Например,

Split("{20;30;40;50;60}",";")

вернет результат Spill down Array в том же массиве, что и в написанной формуле:

20
30
40
50
60

Я пытаюсь использовать функцию Split(String,";") в VBA, но она возвращает только 1 значение и текстовый тип.. Мне также нужно удалить как '{', так и '}' в строке, если они есть, но принять их, даже если их там нет.

покажи весь udf который пробовал.

Scott Craner 11.12.2020 21:18

Вам нужно показать свою функциональную строку. Могу поспорить, что ошибка лежит там.

Scott Craner 11.12.2020 21:27

Попробуйте это: Application.Worksheets("YourWorksheet").Range("A1:A5") = Application.Transpose(Split(Replace(Replace("{20;30;40;50;60‌​}", "{", ""), "}", ""), ";"))

GWD 11.12.2020 21:30

@GWD, если у OP есть Office 365, все это не нужно и не может быть сделано с помощью UDF.

Scott Craner 11.12.2020 21:31

@GWD Я жду, когда ОП покажет их, чтобы я мог научить, а не давать ответ.

Scott Craner 11.12.2020 21:32
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
5
298
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

UDF должен использовать двумерный массив:

Public Function splitt(s As String, sep As String)
    arr = Split(s, sep)
    
    ReDim arr2(0 To UBound(arr), 1 To 1)
    
    For i = LBound(arr) To UBound(arr)
        arr2(i, 1) = arr(i)
    Next i
    
    splitt = arr2
End Function

Пример:

В Excel 365 он будет автоматически заполняться. Без Excel 365 потребуется ввод массива.

Ответ принят как подходящий
  1. Не вызывайте свою функцию Split
  2. Используйте вложенные Replace
  3. Нам нужно вернуть массив String.

Function mysplit(str As String, deli As String) As String()
    mysplit = split(Replace(Replace(str, "{", ""), "}", ""), deli)
End Function

Тогда я бы назвал это так:

=LET(x,mySplit("{20;30;40;50;60}",";"),IF(ISNUMBER(--x),--x,x))

Если вы хотите транспонировать, используйте TRANSPOSE

=LET(x,mySplit("{20;30;40;50;60}",";"),TRANSPOSE(IF(ISNUMBER(--x),--x,x)))


Одна формула может сделать все это без необходимости vba:

=FILTERXML("<a><b>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE("{20;30;40;50;60}",";","</b><b>"),"}",""),"{","")&"</b></a>","//b")

Спасибо .. Я плохо разбираюсь в VBA .. Я пытаюсь найти решение, но не совсем понимаю .. Из-за разочарования я удалил файл .. Думаю, я предпочитаю единую формулу без VBA .. и действительно ли FilterXML нужен и б тег? Что это значит?

Mr. Tello 12.12.2020 07:03
FilterXM()L нужна правильно сформированная XML-структура (каким-то образом сравнимая со структурой html) по крайней мере с documentElement сверху, например, здесь. <a>...</a> и дополнительные подузлы (например, <b>..</b>) для идентификации элементов вашего массива :-)
T.M. 12.12.2020 10:58

Другие вопросы по теме