powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Копирование строк не занимая буффер обмена
25 сообщений из 26, страница 1 из 2
VBA - Копирование строк не занимая буффер обмена
    #38786455
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема следующая, нужно выгрузить в шаблон много строк (через OLE).
В шаблоне естественно красиво отрисована только 1 строка, которую нужно размножить.

Сейчас делается это с помощью команды Range.Copy, которая занимает буффер обмена пользователя - 1) стирает его, 2) не дает им пользоваться, пока формируется выгрузка, что может занимать до 20 минут.

Как реализовать подобное не занимая системный буффер?

Примерно так это выглядит сейчас:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//CopyRowNo - начиная с какой строки копируем
//RowQty - сколько строк копируем
 
XlRange2 := XlWrkSht.Range(CopyRowNo+':'+(CopyRowNo + RowQty-1));

XlInsertShiftDir := -4121;
XlCopyOrigin := 0;

XlRange := XlWrkSht.Range((CopyRowNo + RowQty)+':'+(CopyRowNo + RowQty*2-1));
XlRange.Insert(XlInsertShiftDir, XlCopyOrigin);
XlRange := XlWrkSht.Range((CopyRowNo + RowQty)+':'+(CopyRowNo + RowQty*2-1));
XlRange2.Copy(XlRange);
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786469
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно скопировать только значения, можно сделать присвоение напрямую
Код: vbnet
1.
XlRange.Value = XlRange2.Value
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786487
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЕсли нужно скопировать только значения, можно сделать присвоение напрямую
Код: vbnet
1.
XlRange.Value = XlRange2.Value



Нет, естественно если я выгружаю в шаблон, то там красивое форматирование у каждой строки.
Нужно его полностью перенести, а содержимое (значения) разные.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786489
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант отрисовывать все из кода не предлагать. :)
Иначе какой смысл в шаблоне тогда.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786500
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но ведь при вставке строки все форматирование по идее дублируется на вставленную строку.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786513
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНо ведь при вставке строки все форматирование по идее дублируется на вставленную строку.

Да действительно почти все форматирование переносится, кроме ГРАНИЦ (Border'ов).
Может шаблон кривоват? Попробую провести эксперименты.

С шаблонами вечно проблема с этими границами.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786518
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверьте, что у вас точно отрисованы, например, нижние границы ячеек "красивой" строки, а не верхние следующей строки...
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786546
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMПроверьте, что у вас точно отрисованы, например, нижние границы ячеек "красивой" строки, а не верхние следующей строки...

Тут вообще у Экселя крышу сносит по-моему. Вот прикладываю пример.

Встаем на 12 строку, нажимаем вставить, формат как сверху.
В итоге формат берется как сверху, а разметка границ как в строке до этого.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786554
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У 12-й строки границы тонкие. Толстые границы у соседних строк.
Нужно выделить 12-ю строку и принудительно поставить ей толстые границы.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786565
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProУ 12-й строки границы тонкие. Толстые границы у соседних строк.
Нужно выделить 12-ю строку и принудительно поставить ей толстые границы.

Не понял о каких границах идет речь. Приложил, что у меня получается.
С столбцов 5-9, нет боковых границ как в строке образце. Т.е. они взялись из 12 строки, а не из 11.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786605
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно от обратного пойти: заформатировать все строки в шаблоне, сбросить данные, удалить лишние строки с форматом.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786615
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergeyvgМожно от обратного пойти: заформатировать все строки в шаблоне, сбросить данные, удалить лишние строки с форматом.

Нет это совершенно не годится, какой-то костыльный метод. Отчетов\шаблонов у меня десятки видов.
Бывает тройная иерархия которую нужно копировать. И отчеты с большим количеством строк, я не могу угадать на каком слое иерархии сколько строк в итоге окажется.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786629
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вариант двойного чтения, тоже костыльный:), но без использования clipboard.
- считали данные, с учетом данных копируете по такой схеме (данные затираются копированием)
Rows("24:27").Copy Destination:=Rows(32)
- снова считали данные
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786637
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergeyvgЕще вариант двойного чтения, тоже костыльный:), но без использования clipboard.
- считали данные, с учетом данных копируете по такой схеме (данные затираются копированием)
Rows("24:27").Copy Destination:=Rows(32)
- снова считали данные

1) Не понял, где тут двойное чтение и что вообще делать.
2) Почему тут без clipboard, если тут та же самая COPY, класса Range которая работает через него?
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786651
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KeeperRUбез clipboard, если тут та же самая COPY, класса Range которая работает через него
Это не так...
Range .Copy без параметра - использует буфер, с параметром - не использует.
Но вы и так уже в своем дельфийском коде используете параметр Destination , sergeyvg , видимо, этого просто не учел.
Я вот только не понимаю, на каком этапе вы умудряетесь затирать буфер обмена?

Как вариант - не используйте .Copy.
Вернее, заполняйте лист значениями через коллекцию .Cells, а форматирование - накладывайте до/после заполнения на весь диапазон разом, используя PasteSpecial
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786656
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMЭто не так...я попробовал
Код: vbnet
1.
range("A1").Copy(Range("A3"))

затирает буфер.

Хотя у меня сначала тоже было ощущение, что не затирало, по крайней мере раньше. Может быть дело в версии экселя, я попробовал в 2010. Сейчас в более ранней проверить не могу
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786687
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Copy Destination:= вроде без буфера обмена работает
Идея в чем, считав данные вы через Copy Destination:= затираете их, но таким образом форматируете нужные строки, а после снова зачитываете данные на уже отформатированные строки.
Это конечно сработает, если один в один зачитываются данные, да и то это теоретически, на практике может перенос по словам не отработать или еще что-то, если, например, через OLE вставка данных будет.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786689
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через PasteSpecial пытался сделать, но все равно буффер затирается, даже если COPY без параметров.

Код: vbnet
1.
2.
XlRange2.COPY;
XlRange.PasteSpecial(XlPasteType, XlPasteSpecialOperation, FALSE, FALSE);



Как еще передать в PasteSpecial, тот Range откуда я хочу скопировать формат?
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786691
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergeyvgCopy Destination:= вроде без буфера обмена работает
Идея в чем, считав данные вы через Copy Destination:= затираете их, но таким образом форматируете нужные строки, а после снова зачитываете данные на уже отформатированные строки.
Это конечно сработает, если один в один зачитываются данные, да и то это теоретически, на практике может перенос по словам не отработать или еще что-то, если, например, через OLE вставка данных будет.

Проверил оба варианта, буффер затирается. Точка останова ставлю, четко вижу момент когда данные из буффера пропадают.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786755
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаете, у нас нет Дельфи :)
А в самом Excel VBA сначала код написать не пробовали?
Чтобы понять, где адаптация нужна?
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786765
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMПонимаете, у нас нет Дельфи :)
А в самом Excel VBA сначала код написать не пробовали?
Чтобы понять, где адаптация нужна?AndreTM - у меня затирается при выполнении непосредственно в экселе. Win7x64, Excel2010
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786768
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел по какому запросу гуглить проблему:
https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&q=excel copy format without clipboard

Но подходящих решений не нашел, что ж такое а.

Похоже самое тупое в лоб решение, считывать буфер обмена перед операцией, а потом возвращать назад. :D
Все остальные решения либо слишком сложные, либо требуют много доп. кодирования в куче мест, изменения в шаблонах.
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786821
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Не-не... Я бы предложил (если уж из самого Excel'я рассматривать) такой вариант:
- Скопировать диапазон-"красивый шаблон" в отдельную объектную переменную . Тем более, что в "шаблоне" нет данных, одно оформление.
- Далее наполняем результирующий лист диапазонами:
-- сначала копируем свой диапазон-переменную в свободный диапазон результата (получаем оформление)
-- затем наполняем диапазон уже на листе результата нужными значениями
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786836
KeeperRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMShocker.Pro,

Не-не... Я бы предложил (если уж из самого Excel'я рассматривать) такой вариант:
- Скопировать диапазон-"красивый шаблон" в отдельную объектную переменную . Тем более, что в "шаблоне" нет данных, одно оформление.
- Далее наполняем результирующий лист диапазонами:
-- сначала копируем свой диапазон-переменную в свободный диапазон результата (получаем оформление)
-- затем наполняем диапазон уже на листе результата нужными значениями

Пример реализации на VBA можно? Что за объектная переменная?
...
Рейтинг: 0 / 0
VBA - Копирование строк не занимая буффер обмена
    #38786846
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут пример блокировки/разблокировки буфера обмена, но большинство программ не сообщают, что буфер недоступен и копирование в буфер из параллельной программы может просто ничего не сделать по Ctrl-C
http://www.sql.ru/forum/480283/sohranenie-fayla-iz-excel
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Копирование строк не занимая буффер обмена
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]