Страницы: 1
RSS
VBA. Копирование диапазонов
 
Здравствуйте. Товарищи, нужна помощь.
При копировании макросом диапазона ячеек из файла в файл (или с листа на лист, не важно), вставленный диапазон остается выделенным. Если этот диапазон анализировать или обрабатывать далее этим же макросом это существенно замедляет работу макроса. Помогает строчка типа:
Код
cells(1, 1).Select
А потом уже дальнейший код по обработке.
Но по-моему это какое-то корявое решение вопроса. Есть ли способ как-то убирать выделение вставленного диапазона?
Изменено: etrusk - 06.07.2016 15:02:12
 
Не знаю, ничего нигде не выделяется...
Код
Sub tt()
Sheets(1).[a1:a10].Copy Sheets(2).[h10]
End Sub
 
Зачем вообще .Select делать?
Код
Worksheets("FROM").Range("A1:A100").Copy _       
    Destination := Worksheets("TO").Range("A1")
 
Вот конкретный пример:
Код
Sub test()

    ThisWorkbook.Sheets(2).Range(ThisWorkbook.Sheets(2).Cells(1, 1), ThisWorkbook.Sheets(2).Cells(3, 3)).Copy
    ThisWorkbook.Sheets(1).Range(ThisWorkbook.Sheets(1).Cells(1, 1), ThisWorkbook.Sheets(1).Cells(3, 3)).PasteSpecial Paste:=xlPasteValues

End Sub

диапазон на первом листе остается выделенным после завершения макроса.
 
Код
application.cutcopymode=false
возможно поможет
P.S. а нет, это поможет второму листу...
Изменено: Hugo - 06.07.2016 16:07:11
 
Игорь, не поможет. Эта строка лишь очищает буфер, но ячейки так и останутся выделенными. Для конкретно данного случая можно применить так:
Код
ThisWorkbook.Sheets(1).Range(ThisWorkbook.Sheets(1).Cells(1, 1), ThisWorkbook.Sheets(1).Cells(3, 3)).Value = _
     ThisWorkbook.Sheets(2).Range(ThisWorkbook.Sheets(2).Cells(1, 1), ThisWorkbook.Sheets(2).Cells(3, 3)).Value

Но в других моментах(например, при спец.вставке форматов) - этот финт не пройдет и в любом случае надо будет делать перевыделение. Как вариант, чтобы не выделялся весь диапазон, можно после копирования нужных данных делать так:
Код
ThisWorkbook.Sheets(1).Cells(1, 1).Copy
ThisWorkbook.Sheets(1).Cells(1, 1).PasteSpecial xlValues
Изменено: The_Prist - 06.07.2016 16:08:23
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
нет, вставленный диапазон на 1 листе все равно остается выделенным.
 
Проверил свои коды - либо выделение вообще не меняется(остается то, что было до переноса значений), либо только одна ячейка выделена остается.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да, так работает. А если добавить
Код
Application.CutCopyMode = False
то еще и буфер очистится, не будет мельтешить ползущими полосочками. Но чем это лучше перевыделения? типа:
Код
cells(1, 1),Select 
Строк ведь больше.
Изменено: etrusk - 09.11.2017 17:50:57
 
Тем, что при перевыделении буфер не очищается.
Но если копировать данные через массив как показал Дмитрий - то в буфере и так ничего не будет, тогде нет нужни ни сбрасывать, ни перевыделять.
 
Цитата
etrusk написал: Но чем это лучше перевыделения? типа:
Тем, что если копируете данные не на активный лист(а то и в другую, не активную на данный момент книгу) - выделена будет ячейка на активном листе, а не на том, в который копировали. А если тупо указать лист перед Cells(Sheets(1).Cells.Select) - то вообще ошибку получите, если Лист1 не активен. Либо перед перевыделением придется еще и лист выделять, а то и книгу.
Вы поэкспериментируйте чутка в различных ситуациях и с различными активными листами/книгами - тогда определите какой метод для Вашей ситуации наиболее подходит.
Изменено: The_Prist - 06.07.2016 17:08:36
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
etrusk написал: это существенно замедляет работу макроса
я вот это не понял - как это может замедлять? Вот полный буфер вероятно может замедлять, если памяти будет нехватать.
 
Без проблем, вот пример:
https://yadi.sk/d/KP9IPudnt5qno
в модуле Sub CopyList(), в ModuleFormPPR есть строка
Код
Cells(1, 1).Select
Если её закомментировать, заполнение таблицы графиком ППР происходит в 3 раза дольше.
Обнаружил случайно. Изначально сделал перевыделение чисто для "эстетики", Через время, при доработке кода, убрал как ненужную. Оказалось что это крайне негативно влияет на скорость заполнения графика (выполнение макроса).
Изменено: etrusk - 07.07.2016 15:12:32
 
поправила..но он все равно вставляет(((
 
Уважаемый Дмитрий! Конструкция, указанная в #6:
Код
range1.value=range2.value

не эквивалентна специальной вставке значений (много раз наступал на эти грабли). В этом можно убедиться, например, на исходном диапазоне из 9 текстовых ячеек от 1.1 до 1.9
Владимир
 
Здравствуйте! Не стала создавать новую тему, т.к. у меня похожий вопрос.

Подскажите, пожалуйста, команда

application.cutcopymode=false

очищает буфер обмена после копирования - вставки. А если в моем макросе предполагается несколько раз копировать - вставлять разные данные, то мне нужно эту команду по очистке буфера вставлять после каждой вставки и перед новым копированием или достаточно один раз перед End Sub?
 
Лучше создать тему со своей проблемой
Страницы: 1
Наверх