Когда вы копируете в Excel (скопированная область имеет границу марширующих муравьев), данные фактически не находятся в буфере обмена. Excel использует буфер обмена для переноса из исходных ячеек в режиме реального времени при вставке. Это делается для того, чтобы во время операции вставки формулы можно было преобразовать в новые относительные ссылки на ячейки. Если вы удалите исходные ячейки, Excel не сможет извлечь данные во время операции вставки.
VBA не имеет встроенной поддержки для работы напрямую с буфером обмена. Однако вы можете добавить MSForms в проект VBA, а затем объявить объект, который поддерживает функции буфера обмена.
Инструкции и примеры доступа к буферу обмена непосредственно из VBA см. на следующем веб-сайте:
http://www.cpearson.com/excel/Clipboard.aspx
Что касается меня, то у меня не было MSForms в списке доступных references
, как было предложено на сайте cpearson
, но я поискал на диске C:\ FM20.dll и обнаружил, что он спрятан в какой-то непонятной папке. Я скопировал его в корень C:\ и смог добавить как reference
, щелкнув browse
в диалоговом окне add references
.
Когда MSForms станет доступна, вы можете использовать этот код для копирования текста в буфер обмена, который сохраняется после удаления исходных ячеек.
Public Sub Test()
Dim obj As New MSForms.DataObject
obj.SetText ActiveCell.Value
obj.PutInClipboard
End Sub
Это копирует формулы, которые сохраняются:
Public Sub Test()
Dim obj As New MSForms.DataObject
obj.SetText ActiveCell.Formula
obj.PutInClipboard
End Sub
У меня нет времени выяснять, как скопировать формат ячейки в буфер обмена, но кажется, что это направление, в котором вам нужно идти, если вы хотите сохранить скопированные значения, чтобы вы могли вставить их после исходных ячеек удаляются.
Изменить №1
Несмотря на то, что буфер обмена Windows может хранить несколько форматов для одного элемента (например, RTF и текстовые версии скопированного выделения), он может хранить только один элемент за раз.
Буфер обмена Office не использует буфер обмена Windows. Он сам хранит скопированные значения и может хранить множество различных вариантов. Однако в Office 2000 им нельзя было управлять через VBA (см. Как использовать Буфер обмена Office 2000), а выборки, скопированные из Excel, — это либо «вставить текст», либо «вставить все». Нет никакой специальной вставки, чтобы просто вставить форматы. Я не смог найти ничего, что отличалось бы от более поздних версий Office.
Вывод. Единственный способ использовать VBA для выполнения специальной вставки — это иметь активный/действительный/скопированный выбор. Поэтому я согласен с тем, что единственным решением является объявление ваших собственных постоянных глобальных переменных (например, списка объектов) и сохранение форматов для каждого скопированного выбора в списке. Поскольку буфер обмена на самом деле не является жизнеспособным решением, SetData
и SetDataObject
не имеют значения... Если оказывается невозможным зафиксировать форматирование ячейки в одной строке кода VBA, вы всегда можете перечислить интересующие форматы и установить флаги в ваши сохраненные объекты для последующего использования.
person
James L.
schedule
13.09.2012