Я бы использовал «пошаговый» рабочий лист, который я бы заполнил разделенными данными из вашего первого рабочего листа. Затем его можно использовать в качестве основы для вашего окончательного рабочего листа.
Некоторый код VBA для этого будет выглядеть следующим образом:
Sub sDataSource()
On Error GoTo E_Handle
Dim wsIn As Worksheet
Dim lngInLastRow As Long
Dim lngInLastCol As Long
Dim wsOut As Worksheet
Dim strData As String
Dim aData() As String
Dim aSearch() As Variant
Dim lngLoop1 As Long
Dim lngLoop2 As Long
Dim lngOutRow As Long
Dim lngInRow As Long
Dim lngInCol As Long
Set wsIn = Worksheets("SourceData")
lngInLastRow = wsIn.Cells(wsIn.Rows.Count, "A").End(xlUp).Row
lngInLastCol = wsIn.Cells(1, wsIn.Columns.Count).End(xlToLeft).Column
Set wsOut = Worksheets("TempData")
lngOutRow = 2
aSearch = Array("AV", "BK", "CP", "CS", "FW", "FX", "HD", "IP", "IU", "PD", "PK", "P", "H", "J", "L", "M", "N", "R", "S", "T", "V", "W", "X")
For lngInRow = 2 To lngInLastRow
For lngInCol = 2 To lngInLastCol
strData = wsIn.Cells(lngInRow, lngInCol)
strData = Replace(strData, ")", ",")
strData = Replace(strData, "(", ",")
strData = Replace(strData, " ", "")
aData() = Split(strData, ",")
For lngLoop1 = LBound(aData, 1) To UBound(aData, 1)
For lngLoop2 = LBound(aSearch) To UBound(aSearch)
If InStr(aData(lngLoop1), aSearch(lngLoop2)) > 0 Then
wsOut.Cells(lngOutRow, 1) = wsIn.Cells(lngInRow, 1)
wsOut.Cells(lngOutRow, 2) = wsIn.Cells(1, lngInCol)
wsOut.Cells(lngOutRow, 3) = aSearch(lngLoop2)
wsOut.Cells(lngOutRow, 4) = Replace(aData(lngLoop1), aSearch(lngLoop2), "")
aData(lngLoop1) = ""
lngOutRow = lngOutRow + 1
End If
Next lngLoop2
Next lngLoop1
Next lngInCol
Next lngInRow
sExit:
On Error Resume Next
Set wsIn = Nothing
Set wsOut = Nothing
Exit Sub
E_Handle:
MsgBox Err.Description & vbCrLf & vbCrLf & "sDataSource", vbOKOnly + vbCritical, "Error: " & Err.Number
Resume sExit
End Sub
В этом коде я зациклил рабочий лист и получил значение для каждой недели / пользователя. Я заменил скобки запятыми и удалил все пробелы. Затем он был разбит на массив, и я затем прошёл этот массив, проверяя каждое из различных значений (т. Е. CS, P, AV, X), которые я ищу. Если я его найду, то выведу этот элемент массива, заменив текстовую часть пустой строкой).
Код был изменен, чтобы учесть тот факт, что некоторые имена данных могут вызывать дублирование (например, «P»). и «CP») при использовании InStr()
, и я справился с этим, поместив двухсимвольные имена данных в начале массива, и, если есть совпадение, то установив элемент массива данных равным нулю длина строки.
С уважением,