powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как присвоить скопировать Range и не задействовать буфер обмена?
21 сообщений из 21, страница 1 из 1
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34079242
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется два листа
1. tmpSheet
2. curSheet.
Необходимо Range с tmpSheet перенести на curSheet со всеми значениями, форматированием, шириной столбцов и высотой ячеек и т.д., но не задействовать при этом буфер обмена.
С буфером обмена у меня работает следующим образом:

На TmpSheet выделяем Range c координатами top, Left, bottom, right следующим образом:
tmpSheet.range(tmpSheet.Cells(top, left), tmpSheet.Cells(Bottom, right)).Copy
curSheet.Cells(1, 1).PasteSpecial Paste:=xlAll

Если кто знает, подскажите пжлст, как сделать это без использования буфера обмена?
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34081096
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю, что только так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Sub CopyRanges()
    Dim rng1 As Excel.Range
    Dim rng2 As Excel.Range
    
    Set rng1 = Worksheets("curSheet").Range("A1:A10")
    Set rng2 = Worksheets("tmpSheet ").Range("A1:A10")
    
    rng1.Value = rng2.Value
    rng1.Font.Bold = rng2.Font.Bold
    rng1.Font.ColorIndex = rng2.Font.ColorIndex
End Sub
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34081443
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, так хорошо, но не скопируются ведь все свойства, как получается через clipboard (copy/paste). В данном примере не скопируется формат ячеек, не скопируются границы ячеек и т.д.
Что, неужели либо copy/paste, либо все свойства вручную прописывать.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34081750
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AshtonДумаю, что только так.Неправильно думаешь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Public Sub CopyRanges()
    Dim rng1 As Excel.Range
    Dim rng2 As Excel.Range
    
    Set rng1 = Worksheets("curSheet").Range("A1:A10")
    Set rng2 = Worksheets("tmpSheet ").Range("A1:A10")
    
    rng1.Copy Destination:=rng2
End Sub
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34082238
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, я почему-то предполагал, что метод Copy все равно использует буфер обмена.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34082626
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl AshtonДумаю, что только так.Неправильно думаешь


Проверил. К сожалению - буфер омена оказывается задействованным (((
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34084895
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dendi_2 White Owl AshtonДумаю, что только так.Неправильно думаешь
Проверил. К сожалению - буфер омена оказывается задействованным (((Правда?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub a()
    Dim r1 As Range, r2 As Range, r3 As Range
    
    Set r1 = ActiveSheet.Range("A1:A2")
    Set r2 = ActiveSheet.Range("B1:B2")
    Set r3 = ActiveSheet.Range("C1:C2")
    r1.Copy Destination:=r2
    r3.PasteSpecial Paste:=xlPasteAll
End Sub
Тогда объясни почему этот макрос падает на последней строке?
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34085224
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub a()
    Dim r1 As Range, r2 As Range, r3 As Range
    
    Set r1 = ActiveSheet.Range("A1:A2")
    Set r2 = ActiveSheet.Range("B1:B2")
    Set r3 = ActiveSheet.Range("C1:C2")
    r1.Copy Destination:=r2
    r3.PasteSpecial Paste:=xlPasteAll
End Sub
Тогда объясни почему этот макрос падает на последней строке?
Попробую предположить:

Их хэлпа по VBA:
>>>>>>>>>>
Copy method as it applies to the Range object.
Copies the range to the specified range or to the Clipboard.
expression.Copy(Destination)
expression Required. An expression that returns a Range object.
Destination Optional Variant. Specifies the new range to which the specified range will be copied. If this argument is omitted, Microsoft Excel copies the range to the Clipboard.
<<<<<<<<<<<<

То есть, если не указан Destination, то копирование происходит просто в буфер обмена, иначе - значение присваивается объекту назначения.
А вот используется ли clipboard при этом методе - тут не написано.
Но я так думаю, что используется.
Проверяется это достаточно просто (по крайней мере я так проверял):
Берется и копируется в буфер обмена любое слово. Потом запускается макрос
Код: plaintext
1.
2.
3.
4.
5.
Sub a()
    Dim r1 As Range, r2 As Range, r3 As Range
    Set r1 = ActiveSheet.Range("A1:A2")
    Set r2 = ActiveSheet.Range("B1:B2")
    r1.Copy Destination:=r2
End Sub
И после этого в буфере обмена .... пусто. Отсюда я сделал вывод, что буфер обмена в этом методе был задействван и после этого очищен.
И именно из-за очистки в твоем примере макрос и падает на последней строке. То есть ему нечего вставлять. Буфер обмена пуст!
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34085336
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dendi_2И после этого в буфере обмена .... пусто. Отсюда я сделал вывод, что буфер обмена в этом методе был задействван и после этого очищен.
И именно из-за очистки в твоем примере макрос и падает на последней строке. То есть ему нечего вставлять. Буфер обмена пуст!Хм... Убедил. Действительно клипбоард чистится.... А ну и фиг с ним, будем считать это фичей :)
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34085447
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто ну очень надо сделать это, не используюя буфер обмена (((.
А может, вообще нет решения кроме копирования чререз буфер или присваивания всех свойств по очереди?
Так что вопрос остается открытым.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34085475
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dendi_2Просто ну очень надо сделать это, не используюя буфер обмена (((.
А может, вообще нет решения кроме копирования чререз буфер или присваивания всех свойств по очереди?
Так что вопрос остается открытым.И что же это за задача такая хитрая? Опиши целиком, скорее всего ее можно решить более простыми методами.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34085939
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot White OwlИ что же это за задача такая хитрая? Опиши целиком, скорее всего ее можно решить более простыми методами.[/quot]

У меня есть отчетный движок, написанный на VBA. Задача этого движка - получить на входе xml задание, в котором есть данные для построения отчета и имя шаблона. Шаблон заранее настроен, в нем установлены все необходимые свойства ячеек, форматирование, границы и т.д.
В xml задании приезжает инфа о том, какие "куски" шаблона нужно взять и поставить в результирующий лист. Причем отчеты не жесткой структуры и один и тот же Range шаблона может быть скопирован в результирующий лист неограниченное количество раз.
И при копировании областей шаблона в результирующий лист через клипборд все происходит хорошо, но ... клипборд при этом очишается.
С некоторых пор юзеры, пользующие наш софт стали жаловаться, при построении отчета они не могут пользоваться буфером обмена. И, типа, им это очень мешает в работе. Поэтому стал думать о возможностях отвязаться от клипборда, но чаво-та не получается (
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34086041
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Открыл Excel2000
ввел в ячейку данные
скопировал в буфер (нажав два раза ctrl+c)
далее запустил данный макрос указав место вставки (как указано в справке) верхний левый угол
Код: plaintext
1.
2.
3.
4.
5.
Sub a()
    Dim r1 As Range, r2 As Range, r3 As Range
    Set r1 = ActiveSheet.Range("A1:A2")
    Set r2 = ActiveSheet.Range[color=red]("B1")[/color]
    r1.Copy Destination:=r2
End Sub
смотрю на результат
данные скоприровались, формат тоже, в буфере лежит то что я положил.
Пмойму это то что Вам надо. Или нет?
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34086101
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет, не совсем. Такой пример тут уже приводился выше. он не подходит.
Если отобразить "буфер обмена office" и смотреть на него до и после выполнения этого макроса - то да, он не очищается.
Видимо, потому, что в буфере обмена office может храниться более одного объекта.
Но виндовый клипбоард чистится. Для проверки - откройте блокнот, напишете там пару слов и скопируйте в клипбоард. Потом выполните этот макрос и попробуйте из этого клипборда вставить - ничего не вставится, так как там будет пусто!
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34086261
Фотография Старый ворчун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dendi_2...С некоторых пор юзеры, пользующие наш софт стали жаловаться, при построении отчета они не могут пользоваться буфером обмена. И, типа, им это очень мешает в работе. Поэтому стал думать о возможностях отвязаться от клипборда, но чаво-та не получается (
Сохраняйте буфер обмена перед вашей процедурой, а потом восстанавливайте.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34086927
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сохраняйте буфер обмена перед вашей процедурой, а потом восстанавливайте.
Так не прокатит. Так как отчеты достачно большие и во время построения самого отчета может быть достаточно большим. А во время построения отчета юзеры продолжают работать на машине. И буфер нужен не только до и после построения отчета, но и во время его построения.
Уже склоняюсь к мысли написания какой-нибудь dll, которая будет реализовывать мой собственный клипбоард.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34087613
Фотография Старый ворчун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dendi_2
Сохраняйте буфер обмена перед вашей процедурой, а потом восстанавливайте.
Так не прокатит. Так как отчеты достачно большие и во время построения самого отчета может быть достаточно большим.

Но никто же вас не заставляет менять clipboard на все время.
Непосредственно при выполнении процедуры Copy-Paste.
Это же секунды
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34087635
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Старый ворчунНо никто же вас не заставляет менять clipboard на все время.
Непосредственно при выполнении процедуры Copy-Paste.
Это же секунды
Кстати, идея. Че-то не подумал сразу)). В общем, как вариант, спасибо.
А вопрос опять-таки остался нерешенным. Как вообще обойтись без клипборда.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34087651
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хотя, так тоже плохо. Слишком вырастут накладные расходы. Допустим, я 20 тысяч раз буду чего-то копировать. Соответственно я 20 тысяч раз должен сохранить и восстановить клипборд. Слишком сильно пострадает производительность, так что это все-таки не вариант.
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34087690
Фотография Старый ворчун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dendi_2хотя, так тоже плохо. Слишком вырастут накладные расходы. Допустим, я 20 тысяч раз буду чего-то копировать. Соответственно я 20 тысяч раз должен сохранить и восстановить клипборд. Слишком сильно пострадает производительность, так что это все-таки не вариант.
а вы измерили?
...
Рейтинг: 0 / 0
Как присвоить скопировать Range и не задействовать буфер обмена?
    #34087785
dendi_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Старый ворчуна вы измерили?
Честно - нет, не измерял. Но в любом случае это займет какое-то время.
И все равно остается вероятность того, что в момент, когда будет использоваться буфер обмена в нем будет не то, что ожидает пользователь. Хочется вообще отвязаться от буфера.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как присвоить скопировать Range и не задействовать буфер обмена?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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