Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2009, 15:50   #1
tohdom
Пользователь
 
Регистрация: 29.10.2009
Сообщений: 10
По умолчанию выделение нескольких ячеек в VBA

есть координаты первой ячейки, координаты последней.
но в команде range требуется чтобы аргументы были A1, B2 и т.п.
если туда впихивать cell(i,j) - ругается
tohdom вне форума Ответить с цитированием
Старый 02.11.2009, 15:54   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Пробуем:
Код:
Sub test()
    коорд1 = 4: коорд2 = 3
    коорд3 = 7: коорд4 = 11

    Range(Cells(коорд1, коорд2), Cells(коорд3, коорд4)).Select
End Sub
Не поверите - работает...

PS: Для работы с диапазоном ячеек совсем необязательно выделять этот диапазон.
Наоборот, лучше вообще нигде в коде не использовать слово Select
EducatedFool вне форума Ответить с цитированием
Старый 02.11.2009, 16:05   #3
tohdom
Пользователь
 
Регистрация: 29.10.2009
Сообщений: 10
По умолчанию

а..я между Cells ставил двоеточие по аналогии с range(A1:B10)
щас попробуем.

ну ок, подскажите как бы стоило решать проблему иначе:
"существуют две строчки в экселе, которые приходится часто копировать на другие. Чтобы автоматизировать этот процесс, я сделал кнопку и макрос, копирующий эти строки на нужные места. Проблема в том, что при изменении координат первой строки(строчку там выше пустую удалили или столбец) или при изменении длины строки, случаются косяки."
Поэтому я решил с помощью VBA находить координаты начальной и конечной ячейки нужных строк, выделить и копировать их.
tohdom вне форума Ответить с цитированием
Старый 02.11.2009, 16:10   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Проблема решается очень просто - путем присваивания имени копируемому диапазону.

То есть вместо такого кода
Код:
Sub test1()
    [b3:d5].Copy Selection
End Sub
который скопирует определённый диапазон на место выделенной ячейки,

используйте такой вариант:
Код:
Sub test2()
    [МойДиапазон].Copy Selection
End Sub
предварительно присвоив диапазону ячеек b3 : d5 имя МойДиапазон
В этом случае вставка строк и прочие смещения нужного Вам диапазона больше не страшны.
EducatedFool вне форума Ответить с цитированием
Старый 02.11.2009, 16:33   #5
tohdom
Пользователь
 
Регистрация: 29.10.2009
Сообщений: 10
По умолчанию

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

или он в экселе присваивается?

да и как решится проблема, если диапазон динамический?
в феврале к примеру это две строчки по 14 ячеек
а в декабре - 2 по 16.
соответственно, два столбца могут появлятся/исчезать

зы. тут есть горячая линия? А то немного стыдно по пустякам создавать отдельную тему. Или всё ок?
tohdom вне форума Ответить с цитированием
Старый 02.11.2009, 16:40   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
да и как решится проблема, если диапазон динамический?
1) Выкладываете свой файл (конфиденциальные данные можно затереть)
2) На примере этого файла объясняете, что, когда и куда надо копировать
3) Получаете готовый код.
EducatedFool вне форума Ответить с цитированием
Старый 02.11.2009, 17:13   #7
tohdom
Пользователь
 
Регистрация: 29.10.2009
Сообщений: 10
По умолчанию

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

посмотри if checkbox'ы, они все одинаковы, кроме параметра k. Можно было бы в 10 раз сократить кол-во строк кода, если бы я знал как сделать что-то типа checkbox(k).value
tohdom вне форума Ответить с цитированием
Старый 02.11.2009, 17:33   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Чтобы не писать кучу кода для каждого из чекбоксов, можно использовать такой вариант макроса:

Код:
Sub Макрос3()
    On Error Resume Next
    Application.ScreenUpdating = False ' отключаем обновление экрана
    Dim sh As Worksheet, box As Shape, ra As Range
    ' перебираем все чекбоксы
    For Each CheckBox In ActiveSheet.Shapes
        ' ra - диапазон ячеек для месяца, которому соответствует чекбокс
        ' CheckBox.OLEFormat.Object.TopLeftCell - ячейка, в которой расположен чекбокс

        Set ra = CheckBox.OLEFormat.Object.TopLeftCell.EntireRow.Cells(1).MergeArea.Cells(1).Offset(, 2).Resize(2, 16)
        If ra.Column = 3 And CheckBox.OLEFormat.Object.Object.Value Then
            ' чекбокс расположен в столбце B, и в нём стоит галочка
            [c6:r7].Copy ra    ' копируем диапазон [c6:r7] в выбранный месяц
        End If
    Next CheckBox
    Application.ScreenUpdating = True
End Sub


PS: Только не спрашивайте меня, как это всё работает
EducatedFool вне форума Ответить с цитированием
Старый 02.11.2009, 17:37   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:

Sub test()
    ' вместо такого кода
    Debug.Print Лист3.CheckBox4.Value

    ' можно использовать такой:
    n = 4
    Debug.Print ActiveSheet.Shapes("CheckBox" & n).OLEFormat.Object.Object.Value
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 16.07.2010, 16:44   #10
raus
 
Регистрация: 15.07.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Пробуем:
Код:
Sub test()
    коорд1 = 4: коорд2 = 3
    коорд3 = 7: коорд4 = 11

    Range(Cells(коорд1, коорд2), Cells(коорд3, коорд4)).Select
End Sub
Вы не могли бы тоже самое написать для Word - там этот кож не работает к сожалению....
raus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
текст из нескольких ячеек в одну Tirendus Microsoft Office Excel 10 20.01.2016 16:45
Выделение группы ячеек t0xa Microsoft Office Excel 1 19.09.2009 18:21
Выделение ячеек в опредленном столбце Busine2009 Microsoft Office Word 2 02.06.2009 21:33
Создание списка из нескольких ячеек DragonTM Microsoft Office Excel 6 30.10.2008 15:46
Фиксирование нескольких ячеек lusui HTML и CSS 4 22.01.2008 17:54