Загрузка данных


Sub ВставитьСписокИДопДанные()
    Dim undoRec As UndoRecord
    Set undoRec = Application.UndoRecord
    undoRec.StartCustomRecord "Вставить список и доп. данные"

    Dim startPos As Long
    startPos = Selection.Start

    ' 1. Вставка текста из буфера
    On Error Resume Next
    Selection.PasteSpecial Link:=False, DataType:=wdPasteText, _
                           Placement:=wdInLine, DisplayAsIcon:=False
    If Err.Number <> 0 Then
        MsgBox "Не удалось вставить текст. Проверьте, скопированы ли данные.", vbExclamation
        undoRec.EndCustomRecord
        Exit Sub
    End If
    On Error GoTo 0

    ' 2. Выделяем весь вставленный текст
    Selection.SetRange Start:=startPos, End:=Selection.End

    ' 3. Очистка форматирования
    Selection.ClearFormatting
    Selection.ParagraphFormat.Reset
    With Selection.ParagraphFormat
        .SpaceBefore = 0
        .SpaceAfter = 0
        .LineSpacingRule = wdLineSpaceSingle
        .FirstLineIndent = 0
        .LeftIndent = 0
        .RightIndent = 0
    End With
    With Selection.Font
        .Name = "Times New Roman"
        .Size = 11
    End With
    Selection.Range.Case = wdTitleWord

    ' 4. Сбор строк из буфера
    Dim colMain As New Collection  ' основной текст (D)
    Dim colB As New Collection     ' доп. данные (B)
    Dim para As Paragraph
    For Each para In Selection.Range.Paragraphs
        If Len(para.Range.Text) > 1 Then
            Dim fullText As String
            fullText = para.Range.Text
            If Right(fullText, 1) = vbCr Then fullText = Left(fullText, Len(fullText) - 1)
            Dim parts As Variant
            parts = Split(fullText, vbTab)
            colMain.Add parts(0)
            If UBound(parts) >= 1 Then
                colB.Add Trim(parts(1))
            Else
                colB.Add ""
            End If
        End If
    Next para

    If colMain.Count = 0 Then
        MsgBox "Нет данных для вставки.", vbInformation
        Selection.Delete
        undoRec.EndCustomRecord
        Exit Sub
    End If

    ' 5. Удаляем вставленный текст и формируем нумерованный список
    Selection.Delete
    Dim i As Long
    Dim numberedText As String
    numberedText = ""
    For i = 1 To colMain.Count
        numberedText = numberedText & i & ". " & colMain(i) & vbCrLf
    Next i
    If Len(numberedText) > 0 Then numberedText = Left(numberedText, Len(numberedText) - 1)
    Selection.TypeText Text:=numberedText

    ' 6. Повторно выделяем список и применяем форматирование
    Selection.SetRange Start:=startPos, End:=Selection.End
    Selection.ClearFormatting
    Selection.ParagraphFormat.Reset
    With Selection.ParagraphFormat
        .SpaceBefore = 0
        .SpaceAfter = 0
        .LineSpacingRule = wdLineSpaceSingle
    End With
    With Selection.Font
        .Name = "Times New Roman"
        .Size = 11
    End With
    Selection.Range.Case = wdTitleWord

    ' 7. Добавляем пустые строки сверху и снизу
    Selection.HomeKey Unit:=wdLine
    Selection.InsertParagraphBefore
    Selection.EndKey Unit:=wdLine
    Selection.TypeParagraph
    ' Очищаем форматирование пустых строк
    Selection.ClearFormatting
    Selection.ParagraphFormat.Reset
    With Selection.ParagraphFormat
        .SpaceBefore = 0
        .SpaceAfter = 0
        .LineSpacingRule = wdLineSpaceSingle
    End With

    ' 8. Обработка дополнительных данных (столбец B)
    Dim firstB As String, lastB As String
    firstB = ""
    lastB = ""
    For i = 1 To colB.Count
        If Len(colB(i)) > 0 Then
            firstB = colB(i)
            Exit For
        End If
    Next i
    For i = colB.Count To 1 Step -1
        If Len(colB(i)) > 0 Then
            lastB = colB(i)
            Exit For
        End If
    Next i

    Dim digits1 As String, digits2 As String
    digits1 = ExtractLast8Digits(firstB)
    digits2 = ExtractLast8Digits(lastB)
    Dim resultB As String
    resultB = digits1 & "-" & digits2

    ' 9. Вставка результата в соседнюю ячейку справа (или в текст)
    If Selection.Information(wdWithInTable) Then
        Selection.MoveRight Unit:=wdCell
    Else
        Selection.TypeParagraph
    End If
    Selection.TypeText Text:=resultB
    With Selection.Font
        .Name = "Times New Roman"
        .Size = 11
        .Bold = False
    End With

    undoRec.EndCustomRecord
End Sub

Private Function ExtractLast8Digits(txt As String) As String
    Dim digits As String
    digits = ""
    Dim i As Long
    For i = Len(txt) To 1 Step -1
        If Mid(txt, i, 1) Like "#" Then
            digits = Mid(txt, i, 1) & digits
            If Len(digits) >= 8 Then Exit For
        End If
    Next i
    ExtractLast8Digits = digits
End Function