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

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

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

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

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

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

ALL: С ячейками можно работать используя cells(x,y), где x,y- координаты ячейки. При изменении координаты на единицу происходит перемещение на соседнюю ячейку.
В случай если работаем с объединенными ячейками для перемещения на следующую ячейку необходимо изменить координату на количество объединенных ячеек.
Существует ли способ работы с объединенными ячейками, при котором для обращения к соседней ячейки изменять координаты x,y нужно так же на единицу?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.02.2009, 03:46   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Существует ли способ работы с объединенными ячейками, при котором для обращения к соседней ячейки изменять координаты x,y нужно так же на единицу?
Реализовать такой способ можно, но возникнут проблемы с вычислением координат, если на листе будет много объединённых ячеек, каждая из которых содержит в себе ячейки нескольких строк и столбцов, - в этом случае при одних и тех же координатах (к примеру, MyCells(5,12)) будут возвращаться разные ячейки в зависимости от того, с чего начинаем подсчёт - со строк, или со столбцов.

Проще пойти другим путём.

Вы, скорее всего, для перебора ячеек используете что-то вроде этого:
Код:
Sub ОбработкаОбычныхЯчеек()
    For x = 1 To 30
        Cells(x, 1) = "Это ячейка " & x
    Next
End Sub

Sub ОбработкаОбычныхЯчеек_вариант2()
    x = 1
    While x <= 30
        Cells(x, 1) = "Это ячейка " & x
        x = x + 1
    Wend
End Sub

Попробуйте использовать такой вариант:
Код:
Sub ОбработкаОбъединённыхЯчеек()
    x = 1: i = 1
    While x <= 30
        Cells(x, 1) = "Это ячейка " & i: i = i + 1
        x = x + Cells(x, 1).MergeArea.Cells.Count
    Wend
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 12.02.2009, 22:01   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

EducatedFool: Конечно можно было написать универсальную процедуру переключения/перехода/обращения и т.п. к ячейкам, которая одинаково работала бы и с обычными и с объединенными ячейками. Задача не очень сложная, нечто подобное раньше я уже делал. Но взвесив все еще раз я решил что это было бы лишнее. Объединение ячеек является чуждым элементом в экселе, реализованным крайне неудачно. Так что я решил остановиться на использовании векторов. Реализация в таблицах оказалась довольно удачной, единственный минус изменять вектора приходиться в ручную. Но это не сложно сделать и после написания таблиц думаю потребность в этом будет возникать не чаще чем 1-2 раза в год. С этим можно смериться.
Спасибо за наводку в нужном направлении.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.02.2009, 22:11   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Так что я решил остановиться на использовании векторов
Стыдно признаться, но я не знаю, что такое векторы в Excel...

Цитата:
Объединение ячеек является чуждым элементом в экселе, реализованным крайне неудачно
Не стал бы утверждать подобное.
Очень часто работаю с объединёнными ячейками, и ни разу не замечал каких-либо недоработок...
EducatedFool вне форума Ответить с цитированием
Старый 13.02.2009, 20:39   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Стыдно признаться, но я не знаю, что такое векторы в Excel...
На сколько я знаю их нету. :) Но организовать их не трудно. "Дело техники." (с)

Вот пример заполнения информации в таблице. Заполняем вторую и третью в строке объединенные ячейки.
Код:
Cells(x_tab, Шаблон.Cells(x_sh, 35 + 2)).Value = Участки.Cells(7, смещение_уч + 6)
Cells(x_tab, Шаблон.Cells(x_sh, 35 + 3)).Value = Части.Cells(7, смещение_чс + 2)
x_tab - Номер строки в документе которую сейчас формируем. Формирование происходит построчно.
x_sh - Номер строки в шаблоне, на основе которой оформляем текущую строку в документе.
смещение_уч - Смещение на начало нужного (текущего) участка, на листе участков.
смещение_чс - Смещение на начало нужного (текущего) части, на листе частей.
В таблице задействовано только 33 столбца (при ширине =2 и текущих полях столько умещается на А4). С 36 столбца начинается вектор для объединенных ячеек в текущей строки, в нем храним номера первых столбцов объединенных ячеек.

В случае изменения объединения в текущей строке, подправляем вектор, а макрос править не нужно, он будет работать правильно. Да и строки кода получаются весьма универсальные.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Не стал бы утверждать подобное.
Очень часто работаю с объединёнными ячейками, и ни разу не замечал каких-либо недоработок...
ИМХО если бы это было по другому не пришлось бы городить огород в верху письма.

Если честно мне после rexx, и VBA и макросы в эксель кажется просто тихим ужасом. "Я фигею, дорогая редакция." (с) Все криво до нельзя, а читаемость листинга вообще практически на нуле. Но думаю, что это мало кого здесь интересует, а мне в любом случае придется работать с тем что есть.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 13.02.2009, 21:17   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
если бы это было по другому не пришлось бы городить огород в верху письма
Весь Ваш огород - от недостатка опыта по работе с VBA Excel.
Пройдёт немного времени, и Вы поймёте, что Ваша задача элементарно решалась 10-ю строками кода без всяких векторов... и без огорода...

Безусловно, можно умудриться так затолкать исходные данные в Excel, что макрос получится гигантским и плохо адаптируемым,
но это уже проблема не VBA... Может, у Вас как раз такой случай?

Цитата:
Если честно мне после rexx, и VBA и макросы в эксель кажется просто тихим ужасом.
Неужели? А мне кажется, разницы между REXX и VBA практически никакой (за исключением синтаксиса, разумеется)

Цитата:
Все криво до нельзя
В объектной модели Excel есть недоработки, но их мало, и сталкиваться с ними практически не приходится.
В остальном всё очень хорошо продумано.

Встречаются, конечно, при работе и баги Excel, но находятся они так глубоко, что вряд ли Вы успели до них добраться... (за последний год работы с Excel всего 4 или 5 раз столкнулся с ними...)
К тому же, почти все эти глюки документированы...

Цитата:
а читаемость листинга вообще практически на нуле
Всё зависит от Вас - точнее, от того, как Вы пишете код.

Можно почти на любом языке программирования написать нечитаемый код...

По поводу выравнивания - тут всё просто.
Установите специальную надстройку для выравнивания кода - например, IndenterVBA.
Найти её (и не только её) можно в этом сообщении.

Последний раз редактировалось EducatedFool; 13.02.2009 в 21:28.
EducatedFool вне форума Ответить с цитированием
Старый 13.02.2009, 22:25   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Весь Ваш огород - от недостатка опыта по работе с VBA Excel.
Пройдёт немного времени, и Вы поймёте, что Ваша задача элементарно решалась 10-ю строками кода без всяких векторов... и без огорода...
Безусловно, но мне есть с чем сравнивать, VBA это уже мой шестой язык программирования на двух компьютерных платформах. :)
Вектора хороший метод, не заслужено "забытый" в современном мире. Одну и туже задачу всегда можно решить минимум двумя способами. В том числе и эту, но я пока его не нашел... а этот способ в общем устраивает.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Безусловно, можно умудриться так затолкать исходные данные в Excel, что макрос получится гигантским и плохо адаптируемым,
но это уже проблема не VBA... Может, у Вас как раз такой случай?
Как рак на "адаптивный" код я всегда и старюсь писать. С вашей помощью мне удалось сократить листинг в три раза, и исключить воздействия почти всех внешних изменений на код. Оптимизация кода будет происходить и в дальнейшем, но пока я остановлюсь на этом уровне. Мне нужно выпустить первую рабочую версию таблицы, а предела оптимизации нет.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Неужели? А мне кажется, разницы между REXX и VBA практически никакой (за исключением синтаксиса, разумеется)
Разница координальная. :) В первую очередь в идеологии, которая у рекса мне гораздо ближе. От одного того что у рекса отсутствует понятие тип переменной я балдею уже много лет. :) И поначалу возврат к типам переменных (пусть и прозрачных) в VBA вызывал у меня определенные проблемы. Да и сейчас я бывает торможу.
ИМХО это тема для спора, во многом это дело привычки.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
В объектной модели Excel есть недоработки, но их мало, и сталкиваться с ними практически не приходится.
В остальном всё очень хорошо продумано.
Я отношусь ктому числу "программистов" (в кавычках, так как таковым я себя не считаю), которые считаю, что без объектной модели вполне можно жить. И гораздо удобнее.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Встречаются, конечно, при работе и баги Excel, но находятся они так глубоко, что вряд ли Вы успели до них добраться... (за последний год работы с Excel всего 4 или 5 раз столкнулся с ними...)
К тому же, почти все эти глюки документированы...
Когда мы впервые увидели windows 95, мы слышали, что "ошибки в нем есть, но они глубоко и что повесить систему могут только очень опытные люди" и тогда считали что таковыми мы ни когда не будем. Теперь я бывает роняю винду в течении пары минут после установки. :))

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Всё зависит от Вас - точнее, от того, как Вы пишете код.
Если заменить "Все" на "Многое", готов подписаться под этим.
Есть ряд вещей зависящие от идеологии языка, от синтаксиса написания команд и других особенностей языка.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Можно почти на любом языке программирования написать нечитаемый код...
Это точно, но есть языки которые "помогают" писать читаемый код. Рекс как раз относиться к подобным. Сугубо ИМХО.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
По поводу выравнивания - тут всё просто.
Установите специальную надстройку для выравнивания кода - например,
За ссылочки спасибо, посмотрим внимательно. Но выравнивать код предпочитаю в ручную. Есть такая дурная привычка.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. 0101 Помощь студентам 3 17.12.2009 23:57
delphi и excel работа с ячейками Doget Помощь студентам 1 04.08.2008 08:13