Как ввести последний столбец в ваш массив для преобразования текста в столбец? - PullRequest
0 голосов
/ 23 декабря 2018

Так что, по сути, у меня есть большое количество данных в одной ячейке, разделенных запятыми.У меня есть несколько строк этих данных и с разными объемами данных в каждой ячейке.Пример: первая строка может содержать данные, разделенные 3 запятыми, поэтому она станет 3 столбцами.Однако во 2-й строке данные могут быть разделены 10 запятыми, которые станут 10 столбцами.Когда я записываю макрос переноса моего текста в столбцы, я получаю следующий код:

Sub Macro2()
'
' Macro2 Macro
'

'
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
        ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
        (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1)) _
        , TrailingMinusNumbers:=True
End Sub

Теперь, как я уже упоминал, объем данных варьируется в каждой строке, и набор данных всегда будет меняться.Есть ли способ установить массив так, чтобы он стал массивом (последний столбец, 1)?Без необходимости вводить их все вручную, чтобы убедиться, что он захватывает все данные?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

TextToColumns feat.Информация о поле

Вам не нужно заботиться об этом аргументе и его параметре.У остальных отсутствующих аргументов были значения по умолчанию.Просто укоротите, например, так:

Sub TextToColumnsFieldInfo()

  Const cColumn As Variant = "A"     ' Source Column Letter/Number
  Const cFirst As Long = 1           ' Source First Row
  Const cTarget As String = "B1"     ' Target Cell

'  ' To suppress the following message:
'  ' "Do you want to replace the contents of the destination cells?"
'  Application.DisplayAlerts = False
'  On Error GoTo ProcedureExit

  Cells(cFirst, cColumn).Resize(Cells(Rows.Count, cColumn) _
      .End(xlUp).Row - cFirst + 1).TextToColumns _
      Destination:=Range(cTarget), Tab:=True, Comma:=True, _
      TrailingMinusNumbers:=True

'ProcedureExit:
'  Application.DisplayAlerts = True

End Sub

Примечания

  • Этот код вставляется в B-столбец.Настройте параметр cTarget в соответствии с вашими потребностями.
  • Объект Cells предпочтительнее, поскольку вы можете вводить столбец в виде буквы или числа.
  • С помощью метода Resize мы подстраиваемся под необходимый диапазон.
  • Последняя строка данных в столбце A рассчитана таким образом, чтобы не применять TextToColumns ко всему столбцу.
  • Если вы не хотите видеть сообщение, которое появляется при перезаписи данных при использовании TextToColumns, снимите комментарийзакомментированные строки в коде.
0 голосов
/ 23 декабря 2018

Мы можем использовать функцию Split() для разбора каждой записи.До:

enter image description here

Код:

Sub Parse()
    Dim i As Long, N As Long, v As String, u As Long
    N = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To N
        v = Cells(i, 1).Value
        If v <> "" Then
            arr = Split(v, ",")
            u = UBound(arr) + 1
            Range(Cells(i, 1), Cells(i, u)).Value = arr
        End If
    Next i
End Sub

и после:

enter image description here

ПРИМЕЧАНИЕ:

Подобные результаты можно получить только с формулами (без VBA) .Например, для данных в столбце A , в B1 введите:

=TRIM(MID(SUBSTITUTE($A1,",",REPT(" ",999)),COLUMNS($A:A)*999-998,999))

и скопируйте их поперек и вниз.

РЕДАКТИРОВАТЬ # 1:

  1. строка с Split() берет содержимое отдельной ячейки и разделяет его на массив элементов
  2. строка с u цифрамииз количества элементов в массиве
  3. строка с Range() помещает массив в набор ячеек в строке.
...