Выделение нескольких ячеек в VBA

есть координаты первой ячейки, координаты последней. но в команде range требуется чтобы аргументы были A1, B2 и т.п. если туда впихивать cell(i,j) - ругается
9 ответов

Пробуем:
<font color="darkblue">Sub</font> test() коорд1 = 4: коорд2 = 3 коорд3 = 7: коорд4 = 11 Range(<b>Cell<font color="Red">s</font></b>(коорд1, коорд2), <b>Cell<font color="#ff0000">s</font></b>(коорд3, коорд4)).Select
<font color="darkblue">End</font> <font color="darkblue">Sub</font>
Не поверите - работает...PS: Для работы с диапазоном ячеек совсем необязательно выделять этот диапазон. Наоборот, лучше вообще нигде в коде не использовать слово Select


а..я между Cells ставил двоеточие по аналогии с range(A1:B10) щас попробуем.ну ок, подскажите как бы стоило решать проблему иначе: "существуют две строчки в экселе, которые приходится часто копировать на другие. Чтобы автоматизировать этот процесс, я сделал кнопку и макрос, копирующий эти строки на нужные места. Проблема в том, что при изменении координат первой строки(строчку там выше пустую удалили или столбец) или при изменении длины строки, случаются косяки." Поэтому я решил с помощью VBA находить координаты начальной и конечной ячейки нужных строк, выделить и копировать их.


Проблема решается очень просто - путем присваивания имени копируемому диапазону.То есть вместо такого кода
<font color="darkblue">Sub</font> test1() [<b>b3:d5</b>].Copy Selection
<font color="darkblue">End</font> <font color="darkblue">Sub</font>
который скопирует определённый диапазон на место выделенной ячейки,используйте такой вариант:
<font color="darkblue">Sub</font> test2() [<b>МойДиапазон</b>].Copy Selection
<font color="darkblue">End</font> <font color="darkblue">Sub</font>
предварительно присвоив диапазону ячеек b3 : d5 имя МойДиапазон В этом случае вставка строк и прочие смещения нужного Вам диапазона больше не страшны.


не очень понял. вот в начале макроса будет где-нить написанно, что b35 = мой диапазон. Я подозреваю, что это может решить проблему если сам макрос удаляет строки и колонки. Но если юзверь еще до запуска макроса решит "подправить оформление", как это изменит макрос и строчку где я присваиваю b35 имя "мой диапазон"?или он в экселе присваивается?да и как решится проблема, если диапазон динамический? в феврале к примеру это две строчки по 14 ячеек а в декабре - 2 по 16. соответственно, два столбца могут появлятся/исчезатьзы. тут есть горячая линия? А то немного стыдно по пустякам создавать отдельную тему. Или всё ок?


да и как решится проблема, если диапазон динамический?
1) Выкладываете свой файл (конфиденциальные данные можно затереть) 2) На примере этого файла объясняете, что, когда и куда надо копировать 3) Получаете готовый код.


Да я в общем-то сделал то, что хотел. (возможно криво и не красиво, но работает) Но если интересно, вот: http://filearchiv.ru/14803096 кнопка clone копирует первого чела на остальные.посмотри if checkbox'ы, они все одинаковы, кроме параметра k. Можно было бы в 10 раз сократить кол-во строк кода, если бы я знал как сделать что-то типа checkbox(k).value


Чтобы не писать кучу кода для каждого из чекбоксов, можно использовать такой вариант макроса:
<font color="darkblue">Sub</font> Макрос3() <font color="darkblue">On</font> <font color="darkblue">Error</font> <font color="darkblue">Resume</font> <font color="darkblue">Next</font> Application.ScreenUpdating = <font color="darkblue">False</font> <font color="green">' отключаем обновление экрана</font> <font color="darkblue">Dim</font> sh <font color="darkblue">As</font> Worksheet, box <font color="darkblue">As</font> Shape, ra <font color="darkblue">As</font> Range <font color="green">' перебираем все чекбоксы</font> <font color="darkblue">For</font> <font color="darkblue">Each</font> CheckBox <font color="darkblue">In</font> ActiveSheet.Shapes <font color="green">' ra - диапазон ячеек для месяца, которому соответствует чекбокс</font> <font color="green">' CheckBox.OLEFormat.Object.TopLeftCell - ячейка, в которой расположен чекбокс</font> <font color="darkblue">Set</font> ra = CheckBox.OLEFormat.Object.TopLeftCell.EntireRow.Cells(1).MergeArea.Cells(1).Offset(, 2).Resize(2, 16) <font color="darkblue">If</font> ra.Column = 3 And CheckBox.OLEFormat.Object.Object.Value <font color="darkblue">Then</font> <font color="green">' чекбокс расположен в столбце B, и в нём стоит галочка</font> [c6:r7].Copy ra <font color="green">' копируем диапазон [c6:r7] в выбранный месяц</font> <font color="darkblue">End</font> <font color="darkblue">If</font> <font color="darkblue">Next</font> CheckBox Application.ScreenUpdating = <font color="darkblue">True</font>
<font color="darkblue">End</font> <font color="darkblue">Sub</font>
PS: Только не спрашивайте меня, как это всё работает


<font color="darkblue">Sub</font> test() <font color="green">' вместо такого кода</font> Debug.Print Лист3.CheckBox4.Value <font color="green">' можно использовать такой:</font> n = 4 Debug.Print ActiveSheet.Shapes("CheckBox" & n).OLEFormat.Object.Object.Value
<font color="darkblue">End</font> <font color="darkblue">Sub</font>


Пробуем:
<font color="darkblue">Sub</font> test() коорд1 = 4: коорд2 = 3 коорд3 = 7: коорд4 = 11 Range(<b>Cell<font color="Red">s</font></b>(коорд1, коорд2), <b>Cell<font color="#ff0000">s</font></b>(коорд3, коорд4)).Select
<font color="darkblue">End</font> <font color="darkblue">Sub</font>
Вы не могли бы тоже самое написать для Word - там этот кож не работает к сожалению....