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


Sub ВставитьТекстСНумерацией()
    Dim dataObj As Object
    Dim clipText As String
    Dim lines() As String
    Dim n As Long, i As Long
    Dim ws As Worksheet
    Dim r0 As Long, c0 As Long
    Dim rngData As Range

    ' 1. Получить текст из буфера обмена (универсальный способ)
    On Error Resume Next
    ' Пробуем MSForms.DataObject (доступен в большинстве версий)
    Set dataObj = CreateObject("Forms.DataObject.1")
    If dataObj Is Nothing Then
        ' Альтернативный вариант
        Set dataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    End If
    If dataObj Is Nothing Then
        MsgBox "Не удалось обратиться к буферу обмена." & vbCrLf & _
               "Убедитесь, что данные скопированы (Ctrl+C) и попробуйте снова."
        Exit Sub
    End If
    dataObj.GetFromClipboard
    clipText = dataObj.GetText
    On Error GoTo 0

    If Len(Trim(clipText)) = 0 Then
        MsgBox "Буфер обмена пуст или содержит не текст."
        Exit Sub
    End If

    ' 2. Разбить текст на строки (разделители: vbCrLf, vbLf, vbCr)
    clipText = Replace(clipText, vbCrLf, vbLf)
    clipText = Replace(clipText, vbCr, vbLf)
    lines = Split(clipText, vbLf)

    ' Убрать пустые строки в конце
    Do While UBound(lines) >= 0 And Trim(lines(UBound(lines))) = ""
        ReDim Preserve lines(UBound(lines) - 1)
    Loop
    n = UBound(lines) + 1
    If n = 0 Then
        MsgBox "Не найдено ни одной непустой строки."
        Exit Sub
    End If

    Set ws = ActiveSheet

    ' Проверка: не находится ли активная ячейка в структуре, куда нельзя вставить строки
    On Error Resume Next
    r0 = ActiveCell.Row
    c0 = ActiveCell.Column
    On Error GoTo 0

    If r0 = 0 Or c0 = 0 Then
        MsgBox "Выделите ячейку, куда нужно вставить данные."
        Exit Sub
    End If

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' 3. Вставить недостающие строки перед данными (если нужно больше одной)
    On Error Resume Next
    If n > 1 Then
        ' Вставляем n-1 строку ПОД активной ячейкой, сдвигая существующие данные вниз
        ws.Range(ws.Cells(r0 + 1, c0), ws.Cells(r0 + n - 1, c0)).EntireRow.Insert Shift:=xlDown
        If Err.Number <> 0 Then
            MsgBox "Ошибка при вставке строк. Возможно, лист защищён или недостаточно места."
            Application.ScreenUpdating = True
            Application.Calculation = xlCalculationAutomatic
            Exit Sub
        End If
    End If
    On Error GoTo 0

    ' 4. Записать данные с нумерацией в ячейки
    For i = 0 To n - 1
        If Len(Trim(lines(i))) > 0 Then
            lines(i) = StrConv(Trim(lines(i)), vbProperCase) ' Заглавные первые буквы
        End If
        ws.Cells(r0 + i, c0).Value = (i + 1) & ". " & lines(i)
    Next i

    ' 5. Очистить форматирование и задать шрифт
    Set rngData = ws.Range(ws.Cells(r0, c0), ws.Cells(r0 + n - 1, c0))
    rngData.ClearFormats
    With rngData.Font
        .Name = "Times New Roman"
        .Size = 11
    End With

    ' 6. Выделить первую ячейку вставленных данных
    ws.Cells(r0, c0).Activate

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True

    MsgBox "Вставлено " & n & " строк(и) с нумерацией."
End Sub