#excel #vba #split
#excel #vba #разделить
Вопрос:
В настоящее время я борюсь с функцией разделения в VBA Excel. Мой код выглядит следующим образом:
Dim split_sText() As String
split_sText() = Split(txtString, "|")
Разделяемая текстовая строка выглядит следующим образом:
|ABC|
|DEF|
|
|
|
|
|XYZ|
|UVW|
|123|
Как вы можете видеть, между разделителем есть несколько строк без строк, |
которые не будут помещены в массив.
Есть ли возможность включить эти «пустые строки» в массив?
Спасибо за вашу помощь!
РЕДАКТИРОВАТЬ: Как вы указали. Строка на самом деле выглядит так:
|ABC||DEF||||||XYZ||UVW||123|
Эта строка является только примером. Я получаю этот тип строки из PDF-файла, который затем анализируется в txt-файл. Затем этот .txt-файл сохраняется в виде строки txtString
с помощью VBA.
Результирующий массив, который я хочу иметь в этом примере, должен выглядеть следующим образом:
[0] ABC
[1]
[2] DEF
[3]
[4]
[5]
[6]
[7] XYZ
[8]
[9] UVW
[10]
[11] 123
Комментарии:
1. Как вы создали такую «строку»? Извлекается ли он (каким-то образом) из диапазона? Является ли символ канала только способом показать нам, как существуют строки? Это в ячейке?
2. Хорошие вопросы @FaneDuru. Кроме того, что-то вроде
Split("ABC|DEF||XYZ", "|")
приводит к массиву, включающему пустое значение.3. @DXR, можете ли вы также включить требуемый результирующий массив с этой конкретной строкой?
4. Но в случае, если строка выглядит так, как вы показываете нам после редактирования, требуемые «пустые строки» существуют в полученном массиве. Если ваша строка будет помещена в
x
строковую переменную, то после разделения следующая строка докажет это:Debug.Print Join(Split(x, "|"), ","), UBound(Split(x, "|"))
.5. Вы могли бы удалить первый и последний разделитель перед выполнением разделения.
Ответ №1:
Если я правильно понял ваш вопрос, Split
функция выполняет именно то, что вы хотите. Более того, создание двух пустых элементов массива в начале в конце.
Dim x as String, arr As Variant
x = "|ABC||DEF||||||XYZ||UVW||123|"
arr = Split(x, "|")
'Debug.Print Replace(x, vbCrLf amp; "|" amp; vbCrLf, vbCrLf amp; "|" amp; "|" amp; vbCrLf)
Debug.Print Join(arr, ","), UBound(arr)
For Each El In arr
Debug.Print "-" amp; El amp; "-"
Next
'You probably need to clean the array from its first and last elements (which are not between the pipe characters).
'Is this assumption correct?
Комментарии:
1. Если последний комментарий в вашем ответе является проблемой, то, возможно:
Split(Mid(x, 2, Len(x) - 2), "|")
2. @JvdV: Да, это может быть способ. Если все время символ канала будет существовать в начале и в конце. Возможно, было бы неплохо сначала проверить это…
3. … или
arr = Filter(Split("#" amp; x amp; "#", "|"), "#", False)
4. Это даже лучше, но я все еще не понимаю, в чем проблема, с которой сталкивается OP в первую очередь =)
5. @T.M.: Да, более интересный вариант … 🙂
Ответ №2:
Ответ на заданный вопрос:
Это не только возможно, это уже автоматически.
Возможно, сам вопрос является неправильным вопросом?