Загрузка данных
' ===== В САМОМ ВЕРХУ МОДУЛЯ (Personal.xlsb) =====
Private SavedRow As Long
Private SavedCol As Long
Private SavedNumLines As Long
Private SavedOldData As Variant
' =================================================
Sub ВставитьСписокИзWordСНумерацией()
Dim dataObj As Object, clipText As String, linesArr As Variant
Dim i As Long, lineText As String
Dim numPart As String, textPart As String, extra1 As String, extra2 As String
Dim dotPos As Long, numLines As Long
Dim ws As Worksheet
Dim rngBefore As Range
' 1. Читаем буфер обмена
On Error Resume Next
Set dataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
If Err.Number <> 0 Then
On Error GoTo 0
Set dataObj = CreateObject("MSForms.DataObject")
End If
On Error GoTo 0
If dataObj Is Nothing Then
MsgBox "Не удалось получить доступ к буферу обмена.", vbExclamation
Exit Sub
End If
dataObj.GetFromClipboard
clipText = dataObj.GetText
If Len(Trim(clipText)) = 0 Then
MsgBox "Буфер обмена пуст или содержит не текст.", vbInformation
Exit Sub
End If
' 2. Разбиваем на строки
linesArr = Split(clipText, vbCrLf)
If UBound(linesArr) < 0 Then linesArr = Split(clipText, vbLf)
numLines = UBound(linesArr) + 1
If numLines > 0 Then
If Len(Trim(linesArr(numLines - 1))) = 0 Then numLines = numLines - 1
End If
If numLines = 0 Then
MsgBox "Не найдено ни одной строки текста.", vbInformation
Exit Sub
End If
' 3. Сохраняем состояние ячеек, которые будут затёрты (столбцы C, D, E, F)
Set ws = ActiveSheet
SavedRow = ActiveCell.Row
SavedCol = ActiveCell.Column
SavedNumLines = numLines
' Расширяем диапазон до 4 столбцов: от активного столбца до SavedCol+3 (C, D, E, F)
Set rngBefore = ws.Range(ws.Cells(SavedRow, SavedCol), ws.Cells(SavedRow + numLines - 1, SavedCol + 3))
If Not rngBefore Is Nothing Then
SavedOldData = rngBefore.Value
Else
SavedOldData = Empty
End If
' 4. Вставляем строки (сдвиг вниз) и заполняем
Application.ScreenUpdating = False
ws.Rows(SavedRow & ":" & SavedRow + numLines - 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
For i = 0 To numLines - 1
lineText = linesArr(i)
' Разбиваем строку по табуляции
Dim parts As Variant
parts = Split(lineText, vbTab)
' Определяем три поля (если какого-то нет — пустая строка)
Dim field1 As String, field2 As String, field3 As String
field1 = Trim(parts(0))
If UBound(parts) >= 1 Then field2 = Trim(parts(1)) Else field2 = ""
If UBound(parts) >= 2 Then field3 = Trim(parts(2)) Else field3 = ""
' Обрабатываем первое поле как раньше: номер и основной текст
dotPos = InStr(field1, ". ")
If dotPos > 0 And IsNumeric(Left(field1, dotPos - 1)) Then
numPart = Left(field1, dotPos + 1) ' "1. "
textPart = Trim(Mid(field1, dotPos + 2))
Else
numPart = ""
textPart = field1
End If
' Заполняем столбцы
' C — номер (или левая колонка)
With ws.Cells(SavedRow + i, SavedCol)
.Value = numPart
.Font.Bold = False
.HorizontalAlignment = xlRight
End With
' D — основной текст
With ws.Cells(SavedRow + i, SavedCol + 1)
.Value = textPart
.Font.Bold = False
End With
' E — первый дополнительный текст
With ws.Cells(SavedRow + i, SavedCol + 2)
.Value = field2
.Font.Bold = False
End With
' F — второй дополнительный текст (вместо количества строк)
With ws.Cells(SavedRow + i, SavedCol + 3)
.Value = field3
.Font.Bold = False
End With
Next i
' 5. Автоподбор высоты строк
ws.Rows(SavedRow & ":" & SavedRow + numLines - 1).EntireRow.AutoFit
' 6. Запись количества строк в столбец F больше не нужна, удаляем этот блок (или оставляем пустым)
' 7. Удаление всех строк ниже вставленных до начала следующей объединённой ячейки в столбцах C или D
Dim lastInsertedRow As Long
lastInsertedRow = SavedRow + numLines - 1
Dim nextMergedRow As Long
nextMergedRow = 0
Dim r As Long
For r = lastInsertedRow + 1 To lastInsertedRow + 1000
If ws.Cells(r, 3).MergeCells Or ws.Cells(r, 4).MergeCells Then
If ws.Cells(r, 3).MergeCells Then
nextMergedRow = ws.Cells(r, 3).MergeArea.Row
Else
nextMergedRow = ws.Cells(r, 4).MergeArea.Row
End If
Exit For
End If
Next r
If nextMergedRow > 0 Then
Dim firstRowToDelete As Long, lastRowToDelete As Long
firstRowToDelete = lastInsertedRow + 1
lastRowToDelete = nextMergedRow - 1
If lastRowToDelete >= firstRowToDelete Then
ws.Rows(firstRowToDelete & ":" & lastRowToDelete).Delete Shift:=xlUp
End If
End If
Application.ScreenUpdating = True
End Sub
Sub ОтменитьПоследнююВставкуСписка()
If SavedNumLines <= 0 Then
MsgBox "Нет данных для отмены последней вставки.", vbInformation
Exit Sub
End If
Dim ws As Worksheet
Set ws = ActiveSheet
Application.ScreenUpdating = False
ws.Rows(SavedRow & ":" & SavedRow + SavedNumLines - 1).Delete Shift:=xlUp
' Восстанавливаем сохранённые данные (теперь 4 столбца)
If Not IsEmpty(SavedOldData) Then
Dim rngRestore As Range
Set rngRestore = ws.Range(ws.Cells(SavedRow, SavedCol), ws.Cells(SavedRow + SavedNumLines - 1, SavedCol + 3))
rngRestore.Value = SavedOldData
End If
SavedNumLines = 0
SavedOldData = Empty
Application.ScreenUpdating = True
End Sub