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


Option Explicit

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

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

    ' 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

    ' Пробуем вставить таблицу из буфера как HTML
    On Error Resume Next
    wsTemp.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False
    If Err.Number <> 0 Then
        ' Запасной вариант – простой текст
        wsTemp.PasteSpecial Format:="Текст в кодировке Юникод", Link:=False, DisplayAsIcon:=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 "Буфер обмена пуст или не содержит таблицу. Скопируйте таблицу в Word (Ctrl+C) и повторите.", vbCritical
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Exit Sub
    End If

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

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

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

    ' 4. Вставляем таблицу прямо из буфера обмена в активную ячейку
    rngStart.Select
    On Error Resume Next
    wsTarget.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False
    If Err.Number <> 0 Then
        wsTarget.PasteSpecial Format:="Текст в кодировке Юникод", Link:=False
    End If
    On Error GoTo 0

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

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