Страницы: 1
RSS
Копирование из Excel в другие приложения только выделенные ячейки
 
Здравствуйте уважаемые форумчане.
Давно волновал вопрос, но до последнего времени остро не стоял - Как скопировать из Excel в другие приложения только выделенные ячейки?

Честно, уделил поиску ответа на данный вопрос пару дней (не полных конечно же :) )
Из того, что находится - только темы "...копировать только отфильтрованные ячейки..." и "...скопировать без скрытых ячеек..." и сводится к использованию сочетания Ctrl+G и  выделение только видимых ячеек. Нашлась только одна тема на хабре и то без нужного мне ответа.
Данные решения не подходят так как ячейки не скрыты - они видны, и просто не попадают в селекшон

Я понимаю что Excel внутри себя имеет некоторые "расширенные" свойства буфера данных, и при копировании только выделенных ячеек и вставки их на этот/другой лист - все происходит как задумано, но стоит тут же вставить эти данные например в блокнот - магии не происходит и туда вставляются все данные находящиеся между выделенными ячейками.

У меня возникло идея только 2 способов реализации этого:
1. Проходится циклом по всем выделенным ячейкам, с копированием данных в какой-нибудь массив и дальнейшем переносом этих данных в клипборд (смущает скорость выполнения особенно при больших выборках)
2. После стандартного копирования выделенных ячеек - вставка их на временный лист/диапазон - с последующим повторным копированием ячеек (уже без пропусков) с этого диапазона в клипборд (смущает наличие "временного листа/диапазона" особенно при больших выборка стремящихся к максимальному значению столбцов/строк)

Может кто-нибудь наставить на путь истинный и подсказать заветную функцию/параметр/свойство если таковой имеется в VBA в нативном виде ну или подсказать более легкий алгоритм чем предложенные выше?

Заранее спасибо!
Изменено: Viktor Vavilov - 24.11.2022 14:02:09 (орфография)
 
Я может не до конца понял, копирование выделенных ячеек на свободный участок в эксель (Например в ячейку AA1), а далее уже копирование в другое приложение
Range("AA1").CurrentRegion.Copy
 
Цитата
Ham13 написал:
Я может не до конца понял, копирование выделенных ячеек на свободный участок в эксель (Например в ячейку AA1), а далее уже копирование в другое приложение
Range("AA1").CurrentRegion.Copy

Суть вы правильно поняли, и один из путей решения тоже (я указал этот способ под номером 2)
Так как проект планируется для использования условными "бабушками",  которым трудно объяснить даже такую простую последовательность действий - меня интересует возможность (если таковая есть) в естественном виде скопировать/вставить - хоть с помощью волшебного сочетания клавиш, хоть с помощью неизвестного мне параметра/функции/и т.д. в VBA (c реализацией в VBA у меня проблема не стоит - оба варианта за часок -другой можно накидать, но не дает это сделать мысль, что возможно существует другой нативный или более оптимальный способ)
 
Еще раз здравствуйте.
К сожалению не нашлось ответов на мой вопрос.
Видимо действительно не существует подобного нативного решения

Однако как и обещал прикладываю вариант своего решения (из 1 сообщения это вариант №2)
Для начала поясню какой была задача:
Имеется датасет с определенной последовательностью полей, и для разных "внешних" приложений требуется различные данные из этого датасета, где-то только 1,2,4 и 6 поля (столбцы) где-то 2, 5 и 7 и т.д.
Было сделано несколько кнопок для каждого случая и при выборе необходимой строки выделялись и копировались необходимые столбцы ну а дальше проблема изложена в первом сообщении

Пример выбора необходимых полей и вызова процедуры рекопирования (на каждую кнопку можно вешать свой набор полей)
Код
    rr = Selection.Row
    Range("B" & rr & ":F" & rr & ",K" & rr & ",A" & rr & ",M" & rr & ",V" & rr & ",AA" & rr).Copy
    Call copy_to


Сама процедура рекопирования тут можно пользоваться одним из двух методов и у обоих есть свои минусы (см. в комментарии внутри)
Код
Sub copy_to()
Dim cc As Integer
cc = ActiveSheet.UsedRange.Rows.Count
'особенности: вставляет не переключаясь на выделенную ячейку, копирует форматы, может вставлять после вырезания range.cut
    ActiveSheet.Paste Range("B" & cc + 100)
'особенности: вставляет переключаясь на выделенную ячейку, копирует только значения, не вставляет вырезаные значения range.cut
   'ActiveSheet.Range("B" & cc + 100).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Range("B" & cc + 100).CurrentRegion.Copy
End Sub


Минусов у этого решения полно (о них я писал и начале, и в комментариях) но меня локально пока всё устраивает :)
В общем может кому-то поможет

P.S. ...и все интересно, есть ли другой более элегантный (и быстрый) способ? :sceptic: ....
Изменено: Viktor Vavilov - 28.11.2022 06:08:33 (добавил пример)
 
так как смысл задачи не очень понимаю, то просто скажу
1. Integer - это число до 32 767, а строк на листе может быть значительно больше, поэтому всё же лучше Long
2. Последнюю строку более правильнее определять вот так cc = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row, а не просто cc =ActiveSheet.UsedRange.Rows.Count
3. Вы всё время копируете куда-то ниже и это куда-то ниже может иногда закончится и вы выйдите за приделы листа (сс +100). Как совет копировать куда-нибудь в одно место с предварительной очисткой от старых данных. Возможно даже на специально созданный лист. А куда вы копируете данные из Excel ? В Блокнот?
Изменено: New - 28.11.2022 06:32:55
 
New, спасибо за ценные замечания
1. Бесспорно Long для этих целей подойдет больше
2. Действительно, если не используется вначале листа какое либо количество строк есть большая вероятность затереть перекопированием начальные данные - тут как говорится пока не попадешь в просак - проблему не увидишь
3. В моем проекте первичный датасет я получаю каждый раз новый из БД (с предварительной очисткой и другими действиями) поэтому пошел по пути наименьшего сопротивления. Но честно-честно меня этот вариант очень коробил именно из-за описанных вами вещей (я это упоминал в первом посте). А реализовывать с доп листом (который надо скрывать от посторонних глаз) - просто в виду не нужности - не хочется

Что касается копирования - в любое место - блокнот, гуглшит, яндекс таблицы и даже внутри MS - тот же ворд, поверпоинт, аксесс и д.р. - везде не работает копирование выделенных (разнесенных) ячеек
Изменено: Viktor Vavilov - 28.11.2022 06:52:52
 
вот я поставил курсор в ячейку A5, далее запускаю вот этот макрос

Код
Sub Copy_to_1()
    Dim rr As Long
    rr = Selection.Row
    Range("B" & rr & ":F" & rr & ",K" & rr & ",A" & rr & ",M" & rr & ",V" & rr & ",AA" & rr).Copy
End Sub

далее перехожу в Word и там нажимаю Ctrl+V - и у меня вставляются данные. У вас как-то по-другому?

Изменено: New - 28.11.2022 07:06:46
 
Все верно, в MS Word вставился весь диапазон начиная с А5 до АА5 (27 полей) - просто у вас вставленная таблица за границы листа вышла, а должны было вставится эти диапазоны "A" ",B:F" ",K" ",M" ",V" ",AA" (10 выделенных полей)

PS Как прикрепить картинку чтобы в сообщении была? что-то совсем туплю
Изменено: Viktor Vavilov - 28.11.2022 08:49:05
 
Вообще не понимаю, что у Вас там происходит. Неужели такой код скопирует и вставит в другое приложение все ячейки, а не только видимые среди выделенных?
Код
Selection.SpecialCells(xlCellTypeVisible).Copy

Цитата
Viktor Vavilov написал:
в MS Word вставился весь диапазон
а выделили Вы до копирования какой диапазон? Были ли скрытые ячейки среди выделенных?
Изменено: Дмитрий(The_Prist) Щербаков - 28.11.2022 09:04:29
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему (гостей: 1)
Наверх