Разделить один столбец на несколько столбцов

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

Предположим, у меня есть рабочий лист, например, назовите его «пример», и на листе таблицы есть следующие строки под несколькими строками, но все в столбце «А».

20120112,aaa,bbb,ccc,3432 20120113,aaa,bbb,ccc 20120113,ddd,bb,ccc,ddd,eee,fff,ggg,hhhh 20120132,aaa,bbb,ccc 20120112,aaa,bbb,ccc 20120112,xxx,bbb,ggg,ggg,333 20120112,aaa,bbb,ccc 20120112,abbd,bbb,ccc 

Как я могу создать макрос, который разделит это на несколько столбцов.

Всего несколько баллов

(1) Я должен уметь указывать имя рабочего листа ex: что-то вроде

листы («пример»). range (A, A) '

(2) Количество столбцов и строк не фиксировано, поэтому я не знаю, сколько значений, разделенных запятыми, и сколько строк было бы до запуска сценария vba.

  • Вы можете использовать функцию InputBox() и получить имя листа с данными, которые должны быть разделены.
  • Затем скопируйте данные в массив вариантов, разделите их и создайте новый массив разделенных значений.
  • Наконец, назначьте массив разделенных значений обратно в диапазон excel. НТН

(Обратите внимание, что исходные данные изменяются напрямую, поэтому, наконец, они разделяются на столбцы, а исходное состояние без разделения теряется. Но можно изменить код, чтобы исходные данные не были перезаписаны.)

 Option Explicit Private Const sourceColumnName As String = "A" Private Const delimiter As String = "," Public Sub Splitter() ' splits one column into multiple columns Dim sourceSheetName As String Dim sourceSheet As Worksheet Dim lastRow As Long Dim uboundMax As Integer Dim result On Error GoTo SplitterErr sourceSheetName = VBA.InputBox("Enter name of the worksheet:") If sourceSheetName = "" Then _ Exit Sub Set sourceSheet = Worksheets(sourceSheetName) With sourceSheet lastRow = .Range(sourceColumnName & .rows.Count).End(xlUp).row result = SplittedValues(data:=.Range(.Cells(1, sourceColumnName), _ .Cells(lastRow, sourceColumnName)), _ partsMaxLenght:=uboundMax) If Not IsEmpty(result) Then .Range(.Cells(1, sourceColumnName), _ .Cells(lastRow, uboundMax)).value = result End If End With SplitterErr: If Err.Number <> 0 Then _ MsgBox Err.Description, vbCritical End Sub Private Function SplittedValues( _ data As Range, _ ByRef partsMaxLenght As Integer) As Variant Dim r As Integer Dim parts As Variant Dim values As Variant Dim value As Variant Dim splitted As Variant If Not IsArray(data) Then ' data consists of one cell only ReDim values(1 To 1, 1 To 1) values(1, 1) = data.value Else values = data.value End If ReDim splitted(LBound(values) To UBound(values)) For r = LBound(values) To UBound(values) value = values(r, 1) If IsEmpty(value) Then GoTo continue End If ' Split always returns zero based array so parts is zero based array parts = VBA.Split(value, delimiter) splitted(r) = parts If UBound(parts) + 1 > partsMaxLenght Then partsMaxLenght = UBound(parts) + 1 End If continue: Next r If partsMaxLenght = 0 Then Exit Function End If Dim matrix As Variant Dim c As Integer ReDim matrix(LBound(splitted) To UBound(splitted), _ LBound(splitted) To partsMaxLenght) For r = LBound(splitted) To UBound(splitted) parts = splitted(r) For c = 0 To UBound(parts) matrix(r, c + 1) = parts(c) Next c Next r SplittedValues = matrix End Function 

введите описание изображения здесь

введите описание изображения здесь

Если вам снова не понадобится работать над этой задачей, здесь будет ручной способ обхода:

  1. Используйте текстовый редактор (Notepad ++), чтобы заменить «,» на «вкладку».
  2. Скопируйте содержимое и вставьте его в пустой лист Excel.

Или вы можете попробовать Excel импортировать данные из файла («,» в качестве разделителя).

Если вам нужен автоматический скрипт, попробуйте следующее: 1) Нажмите Ctrl + F11, чтобы открыть редактор VBA, вставьте модуль. 2) щелкните модуль, добавьте код внутри, как показано ниже.

 Option Explicit Public Function LastRowWithData(ByRef sht As Excel.Worksheet, Optional colName As String = "A") As Long LastRowWithData = sht.Range(colName & sht.Rows.Count).End(xlUp).Row End Function Sub SplitToColumns(ByRef sColNames As String, ByRef strSeparator As String, ByRef rngDest As Excel.Range) Dim arrColNames As Variant, i As Long arrColNames = Split(sColNames, strSeparator) For i = LBound(arrColNames) To UBound(arrColNames) rngDest.Offset(0, i).Value = arrColNames(i) Next i End Sub Sub PerformTheSplit() Dim totalRows As Long, i As Long, sColNames As String totalRows = LastRowWithData(Sheet1, "A") For i = 1 To totalRows sColNames = Sheet1.Range("A" & i).Value Call SplitToColumns(sColNames, ",", Sheet2.Range("A" & i)) Next i End Sub 

3) Предположим, что у вас есть имя столбца в Sheet1: Лист1

Нажмите «Alt + F8», чтобы запустить макрос «PerformTheSplit», вы увидите результат в Sheet2: Sheet2

Я бы просто использовал мастер «Текст-Колонка» с помощью подпрограмм VBA, чтобы вы могли выбрать лист и диапазон для обработки, как вы просили выше.

Коды ввода используются для получения листа и диапазона для обработки, и по умолчанию будут использоваться активный лист и выбор. Это, безусловно, может быть изменено различными способами.

Затем вызывается функция встроенного текста в столбцы, и, хотя вы этого не указали, ti кажется, что ваш первый столбец представляет дату в формате YMD, поэтому я добавил, что в качестве опции – должно быть очевидно, как удалить или при необходимости измените его.

Дайте мне знать, как это работает для вас:


 Option Explicit Sub TTC_SelectWS_SelectR() Dim WS As Worksheet, R As Range Dim sMB As String Dim v On Error Resume Next Set WS = Worksheets(Application.InputBox(Prompt:="Enter Worksheet Name: ", _ Title:="Select Worksheet", _ Default:=ActiveSheet.Name, _ Type:=2)) If Err.Number <> 0 Then sMB = MsgBox("Invalid Worksheet Name", vbRetryCancel) If sMB = vbRetry Then TTC_SelectWS_SelectR Exit Sub End If On Error GoTo 0 Set R = (Application.InputBox(Prompt:="Select Range to Process: ", _ Title:="Select Range", _ Default:=Selection.Address, _ Type:=8)) Set R = WS.Range(R.Address) R.TextToColumns DataType:=xlDelimited, textqualifier:=xlTextQualifierDoubleQuote, _ consecutivedelimiter:=False, Tab:=False, semicolon:=False, comma:=True, Space:=False, _ other:=False, fieldinfo:=Array(Array(1, xlYMDFormat)) End Sub 

  • powershell или excel split string, наконец, две запятые в строке
  • SSIS: как разделить значение ячейки excel в столбцах SQL
  • Ошибки при копировании - вставка столбца из Excel
  • Общая сумма массива Vlookup CSV'd
  • VB - разделение строк последовательных данных и запись отдельно в Excel
  • Разделить данные из одной ячейки на несколько ячеек
  • Как разделить текст на другой столбец или удалить текст из исходного столбца?
  • Макрос разделить число, разделенное запятой на отдельные числа в разных ячейках
  • Разделение и конкатенация строк, вставленных в excel
  • Вставка разделительных данных из столбца B в столбцы D & E
  • Необходимо разделить текст на цифры в Excel
  • Interesting Posts

    Невозможно найти таблицу Excel в соответствии с моими потребностями

    Проблемы с чтением из Excel CSV и написанием другого

    VBA excel, находя соответствующие значения в столбцах

    Excel VBA "Метод" VLookup "объекта" WorksheetFunction "не удалось"

    Excel: VLOOKUP, который возвращает true или false?

    вычесть два столбца в сводной таблице

    OLE Automation и взаимодействие с другой VBE / VBA IDE

    Может ли Excel суммировать / объединять x количество точек данных и показывать среднее значение, а не показывать все данные?

    Обратить 1-й массив из функции (или получить последнее значение) без VBA?

    Поиск позиции последовательности пробелов в большом наборе данных – EXCEL

    Потеря объединенной границы ячеек при редактировании файла Excel с помощью openpyxl

    Начать чтение листа Excel в указанной строке

    Сравните две ячейки в excel и верните соответствующее количество символов

    excel vba добавление и вычитание значений в разных ячейках

    Как включить или отключить дорогостоящие вычисления в электронной таблице Excel?

    Давайте будем гением компьютера.