На форуме нашел решение работы с буфером обмена данных.
Код
Function ClipboardText()
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.GetFromClipboard
ClipboardText = .GetText
End With
End Function
Но при запуске выдаётся только первое значение выбранного диапазона. А мне нужно, чтобы выбрав диапазон и скопировав его в буфер можно было поработать с каждым значением, как с массивом. Как это можно реализовать?
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
Но если Вам нужен не только текст ячеек, но и другие свойства(заливка, границы, формулы и т.д.) - то Вам нужен принципиально другой подход. И лучше описать словами что хотите получить.
Подпрограмма запускается без ошибок, только как в этом случае сослаться на значение массива из скопированного в буфер диапазона? Мне достаточно только текст. Если кратко: то я копирую несколько чисел в буфер и работаю с ними.
Пока сделал как сохранение данных в ячейки файла на отдельную страницу. Но это не красивое решение, хочу разобраться и реализовать именно через буфер обмена.
alexuspehov, сделайте файл-пример с демонстрацией "как есть" и "как надо" — помогать проще будет
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Файл очень большой, много скриптов. А если всё урезать, то и выкладывать нечего) Сейчас реализовано через cells. Я просто запускаю скрипт и с текущего положения выделяю (из скрипта) нужную мне область, копирую её в отдельную вкладку, и далее уже работаю с этими данными.
А хотелось бы без "посредника" в виде скопированных на вкладку данных и в идеале именно через работу с буфером обмена. Копал пару часов на наших и зарубежных форумах, везде примеры только с работой с буфером в формате текста, либо одной ячейки. Но не с диапазоном.
alexuspehov написал: как в этом случае сослаться на значение массива из скопированного в буфер диапазона?
так в приведенном мной коде это уже происходит. Просто копируете нужные ячейки, переходите в книгу для вставки, выделяете первую ячейку для вставки и запускаете процедуру. Если использовать лист не надо - все нужное тоже есть, все обращения к отдельным "ячейкам" буфера приведены в моей процедуре.
Код
asr = Split(.GetText, vbNewLine)
получаем строки скопированных ячеек далее цикл по этим строкам и разбиение каждой на столбцы:
Код
asc = Split(asr(lr), vbTab)
А дальше все зависит от того как Вы со всем этим работать хотите. Не зная конкретной задачи помочь нечем.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...