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


Option Explicit

Sub PasteWordTable()
    ' Надёжная вставка таблицы из Word (из буфера обмена) с автосдвигом строк.
    ' Форматирование и объединённые ячейки сохраняются.

    Dim rngStart As Range
    Dim wsTarget As Worksheet
    Dim wsTemp As Worksheet
    Dim rowCount As Long, colCount As Long
    Dim tblRange As Range

    ' 1. Проверка активной ячейки
    If ActiveCell Is Nothing Then
        MsgBox "Выделите ячейку, куда нужно вставить таблицу.", vbExclamation
        Exit Sub
    End If
    Set rngStart = ActiveCell
    Set wsTarget = rngStart.Worksheet

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ' 2. Создаём временный скрытый лист
    On Error Resume Next
    Set wsTemp = ThisWorkbook.Worksheets("TempForWordTable")
    If Not wsTemp Is Nothing Then
        Application.DisplayAlerts = False
        wsTemp.Delete
        Application.DisplayAlerts = True
    End If
    On Error GoTo 0
    Set wsTemp = ThisWorkbook.Worksheets.Add
    wsTemp.Name = "TempForWordTable"
    wsTemp.Visible = xlSheetHidden

    ' 3. Вставляем таблицу на временный лист (как HTML) для замера размера
    On Error Resume Next
    wsTemp.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False
    If Err.Number <> 0 Then
        wsTemp.PasteSpecial Format:="Текст в кодировке Юникод", Link:=False
    End If
    On Error GoTo 0

    ' Проверяем, что данные вставились
    If wsTemp.UsedRange.Cells.Count = 1 And IsEmpty(wsTemp.Range("A1")) Then
        Application.DisplayAlerts = False
        wsTemp.Delete
        Application.DisplayAlerts = True
        MsgBox "Буфер обмена пуст или не содержит таблицу." & vbNewLine & _
               "Скопируйте таблицу в Word (Ctrl+C) и повторите.", vbCritical
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Exit Sub
    End If

    ' 4. Определяем реальный размер таблицы
    Dim lastCell As Range
    Set lastCell = wsTemp.Cells.SpecialCells(xlCellTypeLastCell)
    rowCount = lastCell.Row
    colCount = lastCell.Column
    Set tblRange = wsTemp.Range(wsTemp.Cells(1, 1), wsTemp.Cells(rowCount, colCount))

    ' 5. Копируем вставленный Excel-диапазон обратно в буфер обмена
    tblRange.Copy
    ' Теперь в буфере – Excel-таблица с сохранёнными объединениями

    ' 6. Удаляем временный лист (буфер обмена остаётся нетронутым)
    Application.DisplayAlerts = False
    wsTemp.Delete
    Application.DisplayAlerts = True

    ' 7. Вставляем пустые строки на целевом листе (сдвигаем всё вниз)
    If rowCount > 0 Then
        rngStart.Resize(rowCount).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If

    ' 8. Вставляем таблицу из буфера обмена в активную ячейку
    rngStart.Select
    On Error Resume Next
    wsTarget.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    If Err.Number <> 0 Then
        wsTarget.Paste ' запасной вариант
    End If
    On Error GoTo 0

    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    Application.EnableEvents = True

    MsgBox "Таблица успешно вставлена.", vbInformation
End Sub