Загрузка данных
Sub ВставитьТекстСНумерацией()
' ==== Единая запись отмены (Ctrl+Z отменяет всё сразу) ====
Dim undoRec As Object ' UndoRecord
On Error Resume Next
Set undoRec = Application.UndoRecord
On Error GoTo 0
If Not undoRec Is Nothing Then
undoRec.StartCustomRecord "Вставить текст с нумерацией"
End If
Dim dataObj As Object
Dim clipText As String
Dim lines() As String
Dim n As Long
Dim i As Long
Dim ws As Worksheet
Dim r0 As Long, c0 As Long ' исходная позиция активной ячейки
Dim leftCol As Long ' столбец для нумерации
Dim rngData As Range
Dim cell As Range
' 1. Получить текст из буфера обмена
On Error Resume Next
Set dataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
If dataObj Is Nothing Then
MsgBox "Не удалось получить доступ к буферу обмена."
If Not undoRec Is Nothing Then undoRec.EndCustomRecord
Exit Sub
End If
dataObj.GetFromClipboard
clipText = dataObj.GetText
On Error GoTo 0
If Len(Trim(clipText)) = 0 Then
MsgBox "Буфер обмена пуст или содержит не текст."
If Not undoRec Is Nothing Then undoRec.EndCustomRecord
Exit Sub
End If
' 2. Разбить на строки (разделители: vbCrLf или vbLf)
lines = Split(Replace(clipText, vbCrLf, vbLf), 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 "Не найдено ни одной непустой строки."
If Not undoRec Is Nothing Then undoRec.EndCustomRecord
Exit Sub
End If
Set ws = ActiveSheet
r0 = ActiveCell.Row
c0 = ActiveCell.Column
' 3. Вставить n строк ПЕРЕД активной ячейкой, чтобы не стереть данные ниже
Application.ScreenUpdating = False
If n > 0 Then
ws.Rows(r0 & ":" & r0 + n - 1).Insert Shift:=xlDown
End If
' 4. Вставить текст в столбец активной ячейки (c0), начиная с r0
For i = 0 To n - 1
ws.Cells(r0 + i, c0).Value = lines(i)
Next i
' 5. Очистить формат и задать шрифт Times New Roman 11
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. Сделать каждое слово с заглавной (Proper Case)
For Each cell In rngData
If Len(cell.Value) > 0 Then
cell.Value = StrConv(cell.Value, vbProperCase)
End If
Next cell
' 7. Подготовить столбец для нумерации (слева от данных)
If c0 = 1 Then
' Если активная ячейка в столбце A, вставляем новый столбец слева
ws.Columns(1).Insert Shift:=xlToRight
c0 = 2
leftCol = 1
Else
leftCol = c0 - 1
End If
' 8. Заполнить нумерацию в столбце leftCol (1. , 2. , ...)
For i = 0 To n - 1
ws.Cells(r0 + i, leftCol).Value = (i + 1) & "."
' Очистим формат для номеров и применим тот же шрифт
With ws.Cells(r0 + i, leftCol)
.ClearFormats
.Font.Name = "Times New Roman"
.Font.Size = 11
End With
Next i
' 9. Добавить пустую строку сверху
ws.Rows(r0).Insert Shift:=xlDown
' Теперь данные начинаются со строки r0 + 1
' 10. Добавить пустую строку снизу
ws.Rows(r0 + n + 1).Insert Shift:=xlDown ' после последней строки данных
' (с учётом уже вставленной верхней строки)
' 11. Выделить первую ячейку с текстом
ws.Cells(r0 + 1, c0).Activate
Application.ScreenUpdating = True
If Not undoRec Is Nothing Then undoRec.EndCustomRecord
MsgBox "Вставлено " & n & " строк(и) с нумерацией и отступами."
End Sub