none
VBA, Excel 2013: возможно ли обработать файл, перетаскиваемый в таблицу с помощью Drag and Drop? RRS feed

  • Вопрос

  • Всем доброго времени суток!

    Задача такая: автоматизировать работу пользователя таким образом, чтобы он мог перетаскивать с помощью D&D файлы изображений в произвольные ячейки таблицы и эти изображения автоматически подстраивались под размеры ячейки и отображались в ней.

    Решения интерфейсом стандартной панели вставки не участвуют в обсуждении :), макросы с окном типа "выбрать файл с картинкой" и потом разместить ее в текущей ячейке - так же не интересны.

    Смысл - использовать именно D&D причем не среди элементов конкретной UserForm, а именно - из-за пределов окна Excel - например из открытого рядом проводника.  Возможно ли обработать такое событие в принципе?! Как к нему привязаться - в списке предлагаемых событий Книги и Листа ничего похожего нет. При этом Excel обрабатывает D&D в какой-то степени - при перетаскивании файла в таблицу курсор меняется на "стрелку с плюсом", просто ничего не происходит.



    5 декабря 2017 г. 15:14

Все ответы

  • Насколько я смог понять, нельзя перехватить событие Drag and Drop в VBA для Excel. Программа обрабатывает D&D сама, при этом пользователь к этому не допускается. Разговор о переносе файла из проводника в таблицу.

    Появилась альтернатива: воспользоваться стандартным буфером обмена (clipboard). Но и тут оказывается не все просто. В VBA это объект DataObject, но на уровне языка это пара методов .GetText и .SetText - в моем случае они не дают никаких преимуществ, т.к. буфер содержит совсем не текст! К тому же тип его не известен - т.к. заполняется буфер вне проекта и вообще вне Excel.

    Можно решить это все, используя WinAPI, но это снова совершенно новая для меня тема....:

    OpenClipboard(0) - вроде бы должна возвращать адрес буфера текущего приложения. Но в документации говорится про Null, а Null у меня выдает ошибку, работает только с 0.

    Перечислил возможные форматы полученного буфера (для эксперимента, с помощью EnumClipboardFormats). Там следующие значения: 49161 (DataObject), 1, 49171 (Ole Private Data), 16, 7, 13.

    А вот что дальше с этим всем делать - мне не понятно. Пробовал применять GetClipboardData() к 49161 и 49171 - возвращаются большие цифры, разные... Потом к ним применял GlobalLock() и GlobalSize() - пытался хоть получить размеры объектов, но получал 0-и... Ну и в принципе все... что дальше делать не понятно.

    6 декабря 2017 г. 13:57