25 Октябрь 2009

Копирование и вставка текста в MSFlexGrid

Разное |  Таги: , , , ,

Копирование и вставка текста в MSFlexGrid

Sub CopyClipboard()

On Error Resume Next

Dim xStart As Integer, yStart As Integer
Dim xEnd As Integer, yEnd As Integer
Dim i As Integer, j As Integer
Dim strClipboard As String

With Screen.ActiveForm.ActiveControl

    'координаты верхнего левого угла диапазона копирования
    xStart = .Col
    yStart = .Row

    'координаты нижнего правого угла диапазона копирования
    xEnd = .ColSel
    yEnd = .RowSel

    'Подготовка данных для копирования
    '=================================
    For i = yStart To yEnd
        For j = xStart To xEnd
            strClipboard = strClipboard & (.TextMatrix(i, j)) & vbTab
        Next
        'Удаляем замыкающий символ табуляции
        strClipboard = Mid(strClipboard, 1, Len(strClipboard) - 1)
        'Перенос строки
        strClipboard = strClipboard & vbCrLf
    Next
    'Удаляем замыкающий символ переноса строки
    strClipboard = Mid(strClipboard, 1, Len(strClipboard) - 1)
    '=================================
    'Очистка буфера
    Clipboard.Clear
    'Копирование в буфер
    Clipboard.SetText strClipboard

End With

End Sub

Теперь можно вставить данные в Excel (стандартными методами) или в другой FlexGrid:

Sub PasteClipboard()

On Error Resume Next

Dim currentCountPasteX As Integer, currentCountPasteY As Integer
Dim currentBufferRow As Integer, currentBufferCol As Integer
Dim xStart As Integer, yStart As Integer
Dim xEnd As Integer, yEnd As Integer
Dim xPaste As Integer, yPaste As Integer
Dim countPasteX As Integer, countPasteY As Integer
Dim rowClip() As String, colClip() As String
Dim countRowClip As Integer, countColClip As Integer

With Screen.ActiveForm.ActiveControl

    'координаты верхнего левого угла диапазона, выделенного юзером
    xStart = .Col
    yStart = .Row

    'координаты нижнего правого угла диапазона, выделенного юзером
    xEnd = .ColSel
    yEnd = .RowSel

    'Считываем данные из буфера, разделяя их на строки
    rowClip = Split(Clipboard.GetText, vbCrLf)
    'Количество строк
    countRowClip = UBound(rowClip) + 1

    'Проверка буфера
    If countRowClip = 0 Then
        MsgBox "Буфер обмена пуст!"
        Exit Sub
    End If

    'Делим на столбцы первую строку (для определения количества столбцов)
    colClip = Split(rowClip(0), vbTab)
    countColClip = UBound(colClip) + 1

    'Определяем сколько раз можно вставить данные из буфера
    'в выделенный диапазон(по аналогии с Excel)
    countPasteX = IIf((xEnd - xStart + 1) > countColClip, _
                (xEnd - xStart + 1) \ countColClip, 1)
    countPasteY = IIf((yEnd - yStart + 1) > countRowClip, _
                (yEnd - yStart + 1) \ countRowClip, 1)

    'Вставляем данные
    For currentCountPasteY = 1 To countPasteY
        For currentCountPasteX = 1 To countPasteX
            For currentBufferRow = 0 To countRowClip - 1
                colClip = Split(rowClip(currentBufferRow), vbTab)
                'Строка вставки
                yPaste = yStart + (currentCountPasteY - 1) * _
                        countRowClip + currentBufferRow
                'При необходимости добавляем строку в таблицу
                If .Rows = yPaste Then .Rows = yPaste + 1
                For currentBufferCol = 0 To countColClip - 1
                    'Столбец вставки
                    xPaste = xStart + (currentCountPasteX - 1) * _
                            countColClip + currentBufferCol
                    'При необходимости добавляем столбец в таблицу
                    If .cols = xPaste Then .cols = xPaste + 1
                    'Удаляем возможные символы переноса строки
                    colClip(currentBufferCol) = Replace(colClip(currentBufferCol), Chr(13), "")
                    'Удаляем возможные символы возврата каретки
                    colClip(currentBufferCol) = Replace(colClip(currentBufferCol), Chr(10), "")
                    'Вставляем
                    .TextMatrix(yPaste, xPaste) = colClip(currentBufferCol)
                Next
            Next
        Next
    Next

    'Очистка буфера
    Clipboard.Clear

    'Выделяем область, в которую были вставлены данные
    .RowSel = yStart + countRowClip * countPasteY - 1
    .ColSel = xStart + countColClip * countPasteX - 1

End With

End Sub


Оставить комментарий

Я не робот.