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


Option Explicit

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

    Dim rngStart As Range              ' активная ячейка, куда вставляем
    Dim wsTarget As Worksheet          ' целевой лист
    Dim wsTemp As Worksheet            ' временный скрытый лист
    Dim tblRange As Range              ' диапазон вставленной таблицы на временном листе
    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

    ' --- 2. Отключаем обновление экрана ---
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ' --- 3. Вставляем таблицу на временный лист, чтобы узнать её точный размер ---
    '     Создаём временный лист (если остался с прошлого раза — удаляем)
    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 (основной формат из Word)
    On Error Resume Next
    wsTemp.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False
    If Err.Number <> 0 Then
        ' если HTML не получился, пробуем простой текст
        wsTemp.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
    End If
    On Error GoTo 0

    ' Определяем реальный диапазон таблицы: CurrentRegion вокруг A1,
    ' исключая возможные пустые строки/столбцы, добавленные HTML
    On Error Resume Next
    Set tblRange = wsTemp.Range("A1").CurrentRegion
    If tblRange Is Nothing Then
        Application.DisplayAlerts = False
        wsTemp.Delete
        Application.DisplayAlerts = True
        MsgBox "Не удалось вставить таблицу. Проверьте, скопирована ли она в Word.", vbCritical
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Exit Sub
    End If
    On Error GoTo 0

    rowCount = tblRange.Rows.Count
    colCount = tblRange.Columns.Count

    ' --- 4. На целевом листе сдвигаем данные вниз (только в столбцах таблицы) ---
    '     Используем вставку ячеек со сдвигом вниз.
    On Error Resume Next
    rngStart.Resize(rowCount, colCount).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    If Err.Number <> 0 Then
        ' Если ошибка (например, объединённые ячейки мешают), пробуем вставить целые строки
        rngStart.Resize(rowCount).EntireRow.Insert Shift:=xlDown
    End If
    On Error GoTo 0

    ' --- 5. Копируем таблицу с временного листа и вставляем в освободившуюся область ---
    tblRange.Copy
    rngStart.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    ' Если нужно сохранить ширину столбцов, раскомментируйте следующую строку:
    ' rngStart.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone

    Application.CutCopyMode = False

    ' --- 6. Подчищаем временный лист ---
    Application.DisplayAlerts = False
    wsTemp.Delete
    Application.DisplayAlerts = True

    ' --- 7. Восстанавливаем настройки и сообщаем об успехе ---
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    MsgBox "Таблица вставлена успешно.", vbInformation
End Sub