Option Explicit
Sub PasteWordColumnWithRowInsert()
' Макрос для вставки данных из буфера обмена (скопированных из Word)
' с автоматической вставкой строк по количеству строк данных.
Dim targetCell As Range
Dim tempWS As Worksheet
Dim pastedRange As Range
Dim rowCount As Long
Dim colCount As Long
Dim dataRange As Range
' Отключаем обновление экрана и предупреждения для скорости
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' Запоминаем активную ячейку (место вставки)
On Error Resume Next
Set targetCell = ActiveCell
On Error GoTo 0
If targetCell Is Nothing Then
MsgBox "Сначала выделите ячейку, куда нужно вставить данные.", vbExclamation
GoTo CleanUp
End If
' Проверяем, есть ли что-то в буфере обмена
If Application.CutCopyMode = False Then
' Можно проверить через DataObject, но проще попробовать вставить
' Если в буфере пусто, то вставка вызовет ошибку, обработаем её
End If
' Создаём временный лист для анализа скопированных данных
Set tempWS = ThisWorkbook.Worksheets.Add
tempWS.Visible = xlSheetHidden ' скрываем, чтобы не мелькало
' Пытаемся вставить данные из буфера на временный лист
On Error Resume Next
tempWS.Paste Destination:=tempWS.Range("A1")
If Err.Number <> 0 Then
MsgBox "Не удалось вставить данные из буфера обмена." & vbCrLf & _
"Убедитесь, что вы скопировали ячейки из Word.", vbCritical
tempWS.Delete
GoTo CleanUp
End If
On Error GoTo 0
' Определяем диапазон вставленных данных
If tempWS.UsedRange.Cells.Count = 1 And IsEmpty(tempWS.Range("A1")) Then
MsgBox "Буфер обмена пуст.", vbExclamation
tempWS.Delete
GoTo CleanUp
End If
' Берём текущую область вокруг A1 (вдруг там несколько столбцов)
Set pastedRange = tempWS.Range("A1").CurrentRegion
rowCount = pastedRange.Rows.Count
colCount = pastedRange.Columns.Count
' Если скопировано всего одна ячейка, CurrentRegion может не сработать
If rowCount = 1 And colCount = 1 Then
' Проверим, есть ли данные в A1
If Not IsEmpty(tempWS.Range("A1")) Then
rowCount = 1
colCount = 1
Set pastedRange = tempWS.Range("A1")
Else
' Странная ситуация
tempWS.Delete
GoTo CleanUp
End If
End If
' Переходим на исходный лист и вставляем строки
targetCell.Worksheet.Activate
targetCell.Select
' Вставляем нужное количество строк, сдвигая существующие вниз
' Если targetCell не в первой строке, вставляем строки начиная с неё
If rowCount > 0 Then
targetCell.Resize(rowCount).EntireRow.Insert Shift:=xlDown, _
CopyOrigin:=xlFormatFromLeftOrAbove
End If
' Копируем данные с временного листа и вставляем с сохранением формата
pastedRange.Copy
targetCell.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
' Удаляем временный лист
tempWS.Delete
MsgBox "Готово! Вставлено строк: " & rowCount & ", столбцов: " & colCount, vbInformation
CleanUp:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub