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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2009, 20:06   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Еще раз про адресацию

Что-то я до конца не въеду в адресацию ячеек. Проще говоря торможу...
Задача 1:
Есть лист с кодовым именем "Участки" в котором горизонтально храниться информация, блоками по 6 колонок, начиная с 4 колонки ("D"). Необходимо удалить один из блоков, то есть удалить столбцы в которых находиться данный блок. Вот код:
Код:
   ' Расчитываем смещаемся на начало указаного участка.
   Смещение_уч = ((0 + (Range("Участки_выбор") - 1)) * 6) + 4
      
   'Выделяем столбцы указаного участка.
   Участки.Range(Участки.Cells(1, Смещение_уч), Участки.Cells(1, Смещение_уч + 5)).Select
   Selection.EntireColumn.Delete                      'Удаляем выделенных столбцов.
где: Участки_выбор - номер выбранного участка (блока).

Код отлично работает если текущим является лист "Участки", при вызове макроса из любого другого листа, не работает.. :((

Почему? Можно ли это сделать по другому?

Задача 2:
Есть два листа с кодовыми именами "Участки" и "Шаблоны". Нужно из листа "Шаблоны" скопировать с форматированием одну ячейку в лист "Участки". Вот этот код почему-то не работает:
Код:
Шаблоны.Range("Участки.шаблон").Cells(6, 2).Copy Участки.Range(Cells(6, Смещение_уч + 2))
где: Участки.шаблон - шаблон оформления данных на участок.
Cells(6, 2) - координата нужной ячейки в шаблоне.
Смещение_уч - смещение на начало блока данного участка, пример расчета есть выше.

Что я опять сделал не так?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 25.02.2009, 01:49   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Задача 1:

Код отлично работает если текущим является лист "Участки", при вызове макроса из любого другого листа, не работает.. (
Я чуть ли не в каждой Вашей теме повторяю:
не надо использовать в коде методы .Activate и .Select

Когда Вы наконец-то ко мне прислушаетесь, подобные проблемы с кодом исчезнут.
Выделять ячейки требуется крайне редко, а в 95 процентах случаев выделение ячеек только мешает.

Вместо этого:
Код:
 'Выделяем столбцы указаного участка.
   Участки.Range(Участки.Cells(1, Смещение_уч), Участки.Cells(1, Смещение_уч + 5)).Select
   Selection.EntireColumn.Delete                      'Удаляем выделенных столбцов.
используйте такой код:
Код:
Участки.Columns(Смещение_уч).Resize(, 6).Delete
И всё будет работать независимо от того, какой лист активен.

А если уж так сильно хочется повыделять ячейки, то предварительно активируйте соответствующий лист:
Код:
'Активируем лист перед тем, как выделять на нём ячейки.
Участки.Activate
'Выделяем столбцы указаного участка.
Участки.Range(Участки.Cells(1, Смещение_уч), Участки.Cells(1, Смещение_уч + 5)).Select

Цитата:
Задача 2:

где: Участки.шаблон - шаблон оформления данных на участок.
Cells(6, 2) - координата нужной ячейки в шаблон
В данном случае использование строки Участки.шаблон - явно лишее.
В записи Range("Участки.шаблон"), скорее всего, есть ошибка.

Зачем так всё усложнять?

По-моему, вполне достаточно будет этого:
Код:
Шаблоны.Cells(6, 2).Copy  Участки.Cells(6, Смещение_уч + 2)

Последний раз редактировалось EducatedFool; 25.02.2009 в 01:57.
EducatedFool вне форума Ответить с цитированием
Старый 25.02.2009, 07:56   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вместо этого:
Код:
 'Выделяем столбцы указаного участка.
   Участки.Range(Участки.Cells(1, Смещение_уч), Участки.Cells(1, Смещение_уч + 5)).Select
   Selection.EntireColumn.Delete                      'Удаляем выделенных столбцов.
используйте такой код:
Код:
Участки.Columns(Смещение_уч).Resize(, 6).Delete
И всё будет работать независимо от того, какой лист активен.
Спасибо. Сегодня испробую.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
В данном случае использование строки Участки.шаблон - явно лишее.
В записи Range("Участки.шаблон"), скорее всего, есть ошибка.

Зачем так всё усложнять?

По-моему, вполне достаточно будет этого:
Код:
Шаблоны.Cells(6, 2).Copy  Участки.Cells(6, Смещение_уч + 2)
Range("Участки.шаблон") Указывает на диапазон ячеек. Скажем D1:F10. А Cells(6, 2) смещение в этом диапазоне. Это необходимо для того что бы возможность оперативно изменить параметры диапазона, без изменения макроса.
Подобный код работал как раз в случае ручной активации и того ужасного когда что был в начале.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Еще раз о EAccessViolation. Andre1723 Общие вопросы Delphi 12 23.02.2009 01:39
Еще раз крестики - нолики. Иваненко Помощь студентам 2 17.12.2007 20:09