1. Что делает каждый из макросов?
CopyToClipBoard создаёт сервис
SystemClipboard, а также особый объект Basic, реализующий интерфейс
XTransferable. Это очень интересный трюк: использование
createUnoListener не для создания слушателя, а для реализации
произвольного интерфейса. Насколько я понимаю, эта возможность не документирована. Она основана на
реализации функции, которая создаёт SbUnoObject, а также дополнительные интерфейсы, позволяющие использовать интроспекцию для разрешения и вызова произвольных методов реализуемого интерфейса. Естественно, требуется реализовать методы этого интерфейса - и вот тут работают три других функции: Tr_getTransferData, Tr_getTransferDataFlavors и Tr_isDataFlavorSupported.
Буфер обмена на любой современной платформе позволяет иметь одновременно несколько представлений скопированного содержимого: скажем, в виде простого текста, таблицы в разных форматах (HTML, RTF, каком-нибудь нативном), картинки в разных форматах, ... - и приложение,
в которое производится вставка, сможет выбрать лучший из доступных форматов, подходящий именно для него (скажем, вставка таблицы в Paint, вероятно, выберет не то, что выберет вставка в Word). Для достижения этого приложение,
из которого идёт копирование, должно предоставить все реализуемые им типы содержимого буфера - и это реализуется объектом Transferable, который имеет методы для перечисления доступных типов, а также для получения данных нужного типа.
Ну а здесь реализуется самый примитивный вариант: предоставляется только тип UTF-16. Это позволяет не усложнять реализацию, поскольку Basic вообще не имеет нормальных средств для управления кодировками текстовых данных.
2. Непосредственно ... в ячейку Excel текст не добавляется ... . Почему?
Похоже на баг (возможно, платформоспецифичный). После копирования системный буфер Windows содержит
два типа данных: CF_UNICODETEXT с правильными данными (куда можно запихать и строку типа テストabcабв, которую ни в какой стандартной не-Unicode кодировке Windows не представишь), а также CF_TEXT. И вот она-то битая - содержит только нулевой завершающий байт (то есть фактически пустая).
Поскольку мы сами 8-битную кодировку не предоставляем, похоже, это внутренняя магия сервиса SystemClipboard, которая не умеет правильно создавать 8-битные данные из UTF-16, когда их не предоставляет Transferable.