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

#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:

Ответ на заданный вопрос:

Это не только возможно, это уже автоматически.

Возможно, сам вопрос является неправильным вопросом?