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


Sub SmartPasteFromClipboard()
    Dim DataObj As Object
    Dim ClipText As String
    Dim Lines() As String
    Dim Parts() As String
    Dim CleanLines() As String
    Dim i As Long, j As Long, k As Long
    Dim HasTab As Boolean
    Dim NonEmptyCount As Long

    ' --- 1. Получаем текст из буфера обмена ---
    On Error Resume Next
    Set DataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    DataObj.GetFromClipboard
    ClipText = DataObj.GetText
    On Error GoTo 0

    If ClipText = "" Then
        MsgBox "Буфер обмена пуст или не содержит текст.", vbExclamation
        Exit Sub
    End If

    ' --- 2. Очищаем и разделяем на строки ---
    ' Приводим концы строк к единому виду (vbLf)
    ClipText = Replace(ClipText, vbCrLf, vbLf)
    ClipText = Replace(ClipText, vbCr, vbLf)
    Lines = Split(ClipText, vbLf)

    ' --- 3. Определяем, есть ли табуляция, и убираем пустые строки ---
    HasTab = False
    NonEmptyCount = 0
    ReDim CleanLines(UBound(Lines))
    For i = LBound(Lines) To UBound(Lines)
        If InStr(1, Lines(i), vbTab) > 0 Then HasTab = True
        If Lines(i) <> "" Or i < UBound(Lines) Then ' сохраняем пустые строки, кроме последних
            CleanLines(NonEmptyCount) = Lines(i)
            NonEmptyCount = NonEmptyCount + 1
        End If
    Next i
    If NonEmptyCount = 0 Then
        MsgBox "Буфер обмена содержит только пустые строки.", vbExclamation
        Exit Sub
    End If
    ReDim Preserve CleanLines(NonEmptyCount - 1)

    ' --- 4. Определяем сценарий и вставляем ---
    ' Сценарий 1: «Столбик» — несколько строк, табуляции нет
    If NonEmptyCount > 1 And HasTab = False Then
        ' Объединяем все строки с переносом (vbLf)
        Dim JoinedText As String
        JoinedText = Join(CleanLines, vbLf)
        ' Вставляем в активную ячейку
        With ActiveCell
            .Value = JoinedText
            .WrapText = True   ' Включаем перенос строк
        End With
        Exit Sub
    End If

    ' Сценарий 2: «Строка» — одна непустая строка и в ней есть табуляция
    If NonEmptyCount = 1 And HasTab = True Then
        Parts = Split(CleanLines(0), vbTab)
        For j = LBound(Parts) To UBound(Parts)
            ActiveCell.Offset(0, j).Value = Parts(j)
        Next j
        Exit Sub
    End If

    ' Сценарий 3: Таблица (много строк И много столбцов) или 1 строка без табуляции
    If NonEmptyCount > 1 And HasTab = True Then
        ' Это таблица — вставляем как стандартную вставку (можно иначе)
        ' Здесь просто вставляем по ячейкам
        For i = LBound(CleanLines) To UBound(CleanLines)
            Parts = Split(CleanLines(i), vbTab)
            For j = LBound(Parts) To UBound(Parts)
                ActiveCell.Offset(i, j).Value = Parts(j)
            Next j
        Next i
        Exit Sub
    Else
        ' 1 строка без табуляции — вставляем как есть
        ActiveCell.Value = CleanLines(0)
    End If
End Sub