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


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. Сбор данных: colMain (основной текст) и colB (доп. данные)
    Dim colMain As New Collection
    Dim colB As New Collection
    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)
            ' Игнорируем строки, где основной текст пуст
            If Len(Trim(parts(0))) > 0 Then
                colMain.Add Trim(parts(0))
                If UBound(parts) >= 1 Then
                    colB.Add Trim(parts(1))
                Else
                    colB.Add ""
                End If
            End If
        End If
    Next para

    If colMain.Count = 0 Then
        MsgBox "Основной текст не найден. Проверьте порядок столбцов (сначала D, потом B).", vbInformation
        Selection.Delete
        undoRec.EndCustomRecord
        Exit Sub
    End If

    ' 4. Удаляем вставленный текст и вставляем нумерованный список
    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

    ' 5. Выделяем новый список и применяем форматирование
    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

    ' 6. Добавляем пустые строки сверху и снизу списка
    ' Сверху: вставляем абзац перед первым абзацем выделения
    Dim rngFirstPara As Range
    Set rngFirstPara = Selection.Paragraphs(1).Range
    rngFirstPara.InsertParagraphBefore
    ' Снизу: переходим в конец выделения и вставляем абзац
    Selection.Collapse Direction:=wdCollapseEnd
    Selection.TypeParagraph
    ' Очищаем форматирование добавленных пустых абзацев
    Selection.ClearFormatting
    Selection.ParagraphFormat.Reset
    With Selection.ParagraphFormat
        .SpaceBefore = 0
        .SpaceAfter = 0
        .LineSpacingRule = wdLineSpaceSingle
    End With

    ' 7. Обработка дополнительных данных (столбец 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

    ' 8. Вставка дополнительных данных в соседнюю ячейку (если таблица) или на новой строке
    If Selection.Information(wdWithInTable) Then
        On Error Resume Next
        Selection.MoveRight Unit:=wdCell
        If Err.Number <> 0 Then
            ' Если не удалось перейти вправо, вставляем в ту же ячейку на новой строке
            Selection.TypeParagraph
        End If
        On Error GoTo 0
    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