Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Копирование строк не занимая буффер обмена / 25 сообщений из 26, страница 1 из 2
24.10.2014, 11:29
    #38786455
KeeperRU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Копирование строк не занимая буффер обмена
Проблема следующая, нужно выгрузить в шаблон много строк (через 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
24.10.2014, 11:39
    #38786469
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Копирование строк не занимая буффер обмена
Если нужно скопировать только значения, можно сделать присвоение напрямую
Код: vbnet
1.
XlRange.Value = XlRange2.Value
...
Рейтинг: 0 / 0
24.10.2014, 11:48
    #38786487
KeeperRU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Копирование строк не занимая буффер обмена
Shocker.ProЕсли нужно скопировать только значения, можно сделать присвоение напрямую
Код: vbnet
1.
XlRange.Value = XlRange2.Value



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

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

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

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

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

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

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

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

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

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

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

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



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

Проверил оба варианта, буффер затирается. Точка останова ставлю, четко вижу момент когда данные из буффера пропадают.
...
Рейтинг: 0 / 0
24.10.2014, 15:33
    #38786755
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Копирование строк не занимая буффер обмена
Понимаете, у нас нет Дельфи :)
А в самом Excel VBA сначала код написать не пробовали?
Чтобы понять, где адаптация нужна?
...
Рейтинг: 0 / 0
24.10.2014, 15:38
    #38786765
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Копирование строк не занимая буффер обмена
AndreTMПонимаете, у нас нет Дельфи :)
А в самом Excel VBA сначала код написать не пробовали?
Чтобы понять, где адаптация нужна?AndreTM - у меня затирается при выполнении непосредственно в экселе. Win7x64, Excel2010
...
Рейтинг: 0 / 0
24.10.2014, 15:41
    #38786768
KeeperRU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Копирование строк не занимая буффер обмена
Нашел по какому запросу гуглить проблему:
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
24.10.2014, 16:22
    #38786821
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Копирование строк не занимая буффер обмена
Shocker.Pro,

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

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

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


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