Как дублировать строки на основе содержимого столбца B. Мне нужна отдельная строка для каждого «Человека» в ячейке?
Это моя исходная таблица (я не могу извлечь данные каким-либо другим способом):
Это моя цель:
Спасибо за вашу помощь!
Как дублировать строки на основе содержимого столбца B. Мне нужна отдельная строка для каждого «Человека» в ячейке?
Это моя исходная таблица (я не могу извлечь данные каким-либо другим способом):
Это моя цель:
Спасибо за вашу помощь!
Power Query
или Get and Transform
, доступных начиная с Excel 2010. Вы просто используете инструмент, чтобы разделить столбец «Контакты» на точку с запятой; затем разверните эти столбцы. Возможно, вам придется удалить лишний столбец и переименовать некоторые из них. Если вам нужно решение VBA, просто запишите макрос, пока вы это делаете. 24.06.2017 Вы можете реализовать цикл, который будет проходить через каждую из строк под заголовком. Находясь в каждой строке, проверьте содержимое в столбце B и выполните следующую функцию, которая разделит содержимое на основе символа «;».
Split(Cells(row,"B"),";")
Это вернет массив значений. Например [Person A, Person B, Person C] Теперь, если этот массив имеет более 1 значения, перейдите к вставке новой строки для каждого значения в массиве после 1-го значения.
Rows(row)EntireRow.Insert
Удачи!
Вы не предоставили никакого кода, поэтому вот некоторая начальная концепция:
Используйте цикл do until .cells(i,2).value = ""
Используйте newArray = Split(Cells(i,2).Value, ";")
, чтобы получить массив с каждым именем человека в нем.
Используйте for x = lbound(newArray) to ubound(newArray)
, чтобы вырезать начальную строку, а затем вставьте x раз и выполните cells(i+x,2).value = newArray(x).value
наконец, не забудьте добавить значение ubound(newarray)
к i
, иначе вы застрянете в бесконечном цикле поиска одного человека и добавления строки.
Предполагая, что ваши данные находятся в Sheet1
, а желаемый результат должен отображаться в Sheet2
, следующий код должен помочь:
Sub SplitCell()
Dim cArray As Variant
Dim cValue As String
Dim rowIndex As Integer, strIndex As Integer, destRow As Integer
Dim targetColumn As Integer
Dim lastRow As Long, lastCol As Long
Dim srcSheet As Worksheet, destSheet As Worksheet
targetColumn = 2 'column with semi-colon separated data
Set srcSheet = ThisWorkbook.Worksheets("Sheet1") 'sheet with data
Set destSheet = ThisWorkbook.Worksheets("Sheet2") 'sheet where result will be displayed
destRow = 0
With srcSheet
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
For rowIndex = 1 To lastRow
cValue = .Cells(rowIndex, targetColumn).Value 'getting the cell with semi-colon separated data
cArray = Split(cValue, ";") 'splitting semi-colon separated data in an array
For strIndex = 0 To UBound(cArray)
destRow = destRow + 1
destSheet.Cells(destRow, 1) = .Cells(rowIndex, 1)
destSheet.Cells(destRow, 2) = Trim(cArray(strIndex))
destSheet.Cells(destRow, 3) = .Cells(rowIndex, 3)
Next strIndex
Next rowIndex
End With
End Sub