Option Compare Text
Sub Foundation()
Dim arr(), fndArr(), tmpArr, keyArr
Dim dic As Object
Dim I&, J&, N&, iTmp, iKey
Dim iClmn&
On Error Resume Next
Application.ScreenUpdating = False
With Worksheets("Основная таблица")
arr = .Range("A2:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).Value
End With
Set dic = CreateObject("Scripting.Dictionary")
For I = LBound(arr, 1) To UBound(arr, 1)
Select Case True
Case arr(I, 3) Like "Армир*"
iClmn = 4
Case arr(I, 3) Like "Опалуб*"
iClmn = 5
Case arr(I, 3) Like "Заклад*"
iClmn = 6
Case arr(I, 3) Like "Засып*"
iClmn = 11
Case arr(I, 3) Like "Бетон*"
iClmn = 8
Case arr(I, 3) Like "Гидро*"
If arr(I, 2) Like "*праймер*" Then
iClmn = 9
Else
iClmn = 10
End If
End Select
iTmp = Replace(Replace(Replace(Replace(arr(I, 2), ",", vbCrLf), ";", vbCrLf), Chr(13), vbCrLf), ":", vbCrLf)
tmpArr = Split(iTmp, vbCrLf)
For J = LBound(tmpArr) To UBound(tmpArr)
iKey = RegExpExtract(tmpArr(J), "[КП]м\d+")
If Not IsError(iKey) Then
If Not dic.Exists(iKey) Then
ReDim keyArr(1 To 11, 1 To 1)
keyArr(1, 1) = iKey
keyArr(iClmn, 1) = arr(I, 1)
dic.Add iKey, keyArr
Else
keyArr = dic(iKey)
If IsEmpty(keyArr(iClmn, 1)) Then
keyArr(iClmn, 1) = arr(I, 1)
Else
keyArr(iClmn, 1) = keyArr(iClmn, 1) & vbCrLf & arr(I, 1)
End If
dic(iKey) = keyArr
End If
End If
Next
Next
ReDim fndArr(1 To 10000, 1 To 11)
For Each iKey In dic.Keys
N = N + 1
keyArr = dic(iKey)
For J = LBound(keyArr, 1) To UBound(keyArr, 1)
fndArr(N, J) = keyArr(J, 1)
Next
Next
Worksheets("Лист1").Range("A2").Resize(N, 11) = fndArr
Worksheets("Лист1").Activate
Application.ScreenUpdating = True
MsgBox "Done!", vbInformation + vbOKOnly
End Sub
Function RegExpExtract(ByVal Text As String, Pattern As String, Optional Item As Integer = 1)
On Error GoTo ErrHandl
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = Pattern
regex.Global = True
If regex.Test(Text) Then
Set matches = regex.Execute(Text)
RegExpExtract = matches.Item(Item - 1)
Exit Function
End If
ErrHandl:
RegExpExtract = CVErr(xlErrValue)
End Function
|