Страницы: 1
RSS
Работа с буфером обмена данных VBA Excel как с массивом
 
Добрый день!

На форуме нашел решение работы с буфером обмена данных.
Код
Function ClipboardText()
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        ClipboardText = .GetText
    End With
End Function

Но при запуске выдаётся только первое значение выбранного диапазона.
А мне нужно, чтобы выбрав диапазон и скопировав его в буфер можно было поработать с каждым значением, как с массивом.
Как это можно реализовать?
Изменено: alexuspehov@mail.ru - 15.01.2020 09:06:00
 
Цитата
alexuspehov@mail.ru написал:
можно было поработать с каждым значением, как с массивом
Измените отображаемое имя(Ник) в настройках профиля. Иначе модераторы тему прикроют.

В данном варианте много нюансов:
1. .GetFromClipboard не возвращает массив, а работает ТОЛЬКО с текстом единой строкой. Значит надо на массив разбивать по переносу строки, а вдобавок и по табуляции, т.к. могут быть и столбцы. Первый нюанс в том, что разбиение может произойти некорректно, если внутри ячеек так же есть перенос на строки или табуляции. Плюс внутри UDF в том виде, в котором она сейчас не предусмотрен вывод в несколько ячеек - только в одну. Нужно переделывать под формулу массива, но второй нюанс в том, что UDF некорректно обрабатывает структуры ячеек из буфера, т.к. в момент вызова функции из ячейки листа буфер будет очищен.
Если эти нюансы отбросить, то можно соорудить процедуру:
Код
Sub S_ClipboardText()
    Dim asr, asc, lr&
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        asr = Split(.GetText, vbNewLine)
        For lr = LBound(asr) To UBound(asr)
            If asr(lr) <> "" Then
                asc = Split(asr(lr), vbTab)
                ActiveCell.Offset(lr, 0).Resize(, UBound(asc) + 1).Value = asc
            End If
        Next
    End With
End Sub
Но если Вам нужен не только текст ячеек, но и другие свойства(заливка, границы, формулы и т.д.) - то Вам нужен принципиально другой подход. И лучше описать словами что хотите получить.
Изменено: Дмитрий(The_Prist) Щербаков - 15.01.2020 09:29:22
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо большое, Дмитрий!
Ник подправил.

Подпрограмма запускается без ошибок, только как в этом случае сослаться на значение массива из скопированного в буфер диапазона?
Мне достаточно только текст.
Если кратко: то я копирую несколько чисел в буфер и работаю с ними.

Пока сделал как сохранение данных в ячейки файла на отдельную страницу. Но это не красивое решение, хочу разобраться и реализовать именно через буфер обмена.
 
alexuspehov, сделайте файл-пример с демонстрацией "как есть" и "как надо" — помогать проще будет  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Файл очень большой, много скриптов. А если всё урезать, то и выкладывать нечего)
Сейчас реализовано через cells. Я просто запускаю скрипт и с текущего положения выделяю (из скрипта) нужную мне область, копирую её в отдельную вкладку, и далее уже работаю с этими данными.

А хотелось бы без "посредника" в виде скопированных на вкладку данных и в идеале именно через работу с буфером обмена. Копал пару часов на наших и зарубежных форумах, везде примеры только с работой с буфером в формате текста, либо одной ячейки. Но не с диапазоном.
 
Цитата
alexuspehov написал:
как в этом случае сослаться на значение массива из скопированного в буфер диапазона?
так в приведенном мной коде это уже происходит. Просто копируете нужные ячейки, переходите в книгу для вставки, выделяете первую ячейку для вставки и запускаете процедуру.
Если использовать лист не надо - все нужное тоже есть, все обращения к отдельным "ячейкам" буфера приведены в моей процедуре.
Код
asr = Split(.GetText, vbNewLine)
получаем строки скопированных ячеек
далее цикл по этим строкам и разбиение каждой на столбцы:
Код
asc = Split(asr(lr), vbTab)
А дальше все зависит от того как Вы со всем этим работать хотите. Не зная конкретной задачи помочь нечем.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Здорово!!!
Спасибо большое, Дмитрий!!

Очень помогли!
Всё работает.
Страницы: 1
Наверх