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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2011, 14:37   #1
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию Цикл с проверкой значений в столбе по строчно...

Добрый день.

Подскажите пожалуйста, как написать цикл, в котором выполнялось бы следующие:
Проверка значений в определенной колонке (например "C:C"), где, в случае если следующие значение (следующая строка) отличное от другого, происходило бы добавление строки.

Что есть: Выгрузка из 1С, и офис 2007.

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

Чуть дальше задача будет ещё усложняться...
Вставить диаграммы, которые будут данные по модели (то что было разбито) подтягивать. В диаграмме по 2-3 графика. Окончательный вариант будет выглядеть так: 2-4 полосы данных по модели, График, пропуск, данные по другой модели, график... и т.д. Вообще можно ли так сделать? (Но это потом...)
Richard123 вне форума Ответить с цитированием
Старый 17.01.2011, 15:18   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Вставить строки нетрудно:
Код:
Sub tt()
Dim i As Long
For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
If Cells(i, 1) <> Cells(i - 1, 1) Then Rows(i).Insert
Next
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.01.2011, 15:37   #3
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Спасибо) Работает, но только если список по которому нужно делать проверку идет 1-ым. А если он 3? (вставляет просто пустые строки сразу после шапки) А если надо не 1 строку вставить а скажем 3-4, тогда какой "оператор" меняется?

Уважаемый Hugo121! А Вы можете дать комментарии по коду, чтобы мог поучиться на примере?

Большое Вам спасибо за макрос)
Richard123 вне форума Ответить с цитированием
Старый 17.01.2011, 16:09   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Код:
Sub tt()
'объявляем переменную
Dim i As Long
'цикл от последней заполненной ячейки первой колонки до второй ячейки, снизу вверх
'т.е. если нужна другая колонка - меняйте первую единицу на нужный номер
For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
'сравнение значений. ", 1" - это номер столбца!!!
If Cells(i, 1) <> Cells(i - 1, 1) Then Rows(i).Insert
Next
End Sub
Если нужно вставить больше строк - просто продублируйте процедуру:
Код:
If Cells(i, 1) <> Cells(i - 1, 1) Then Rows(i).Insert: Rows(i).Insert: Rows(i).Insert
Хотя вероятно есть способ поэлегантнее, если например 100 строк добавить нужно. Но я сейчас синтаксис не знаю.
Хотя нет, нащупал:
Код:
If Cells(i, 1) <> Cells(i - 1, 1) Then Rows(i).Resize(3).Insert
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 17.01.2011 в 16:17. Причина: чуть попутал в комментариях ряды с колонками...
Hugo121 вне форума Ответить с цитированием
Старый 17.01.2011, 16:30   #5
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Правильно ли я понимаю что:
Код:
Cells(i, 1)
Ячейка (номер строки, номер столбца). А в самом начале объявили (DIM) что i = long (параметр длины?)
Код:
If Cells(i, 1) <> Cells(i - 1, 1)
Это условие "ЕСЛИ", Ячейка (номер строки, номер столбца), не равна (<>), ячейке которая расположена (строка (текущие положение - 1) (т.е. на верх? ), столбец тот же)

Код:
Rows(i).Resize(3).Insert
Строки( i-ый диапазон). Расширить(?). вставить

так?
Richard123 вне форума Ответить с цитированием
Старый 17.01.2011, 16:41   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Всё правильно, если принять, что Long - это длина
Хотя это немного другое - это тип переменной. Длиннее, чем Integer.
Если задать Dim i As Integer, то может "длины" не хватить на весь лист, ибо предел 32,767:
The Integer and Long data types can both hold positive or negative values. The difference between them is their size: Integer variables can hold values between -32,768 and 32,767, while Long variables can range from -2,147,483,648 to 2,147,483,647. Traditionally, VBA programmers have used integers to hold small numbers, because they required less memory. In recent versions, however, VBA converts all integer values to type Long, even if they are declared as type Integer. Therefore, there is no longer a performance advantage to using Integer variables; in fact, Long variables might be slightly faster because VBA does not have to convert them.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.01.2011, 17:05   #7
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

По поводу длины понял)))
Спасибо за справку))

А с усложненной задачей как быть?
Дано:
Model1|status1|a1|a2|a3|...|aN|
Model1|status2|a1|a2|a3|...|aN|
Model2|status1|a1|a2|a3|...|aN|
Model2|status2|a1|a2|a3|...|aN|
Где:
ModelN - это номер модели, который имеет от 3 до 4 состояний (status)
a1-aN - это целочисленные значения, где 1...N это порядковый номер, т.е. номер "недели" (он находится в шапке над таблицой)
Нужно:
Подтянуть эти данные в диаграмму, где каждый "Status" это кривая а A1-AN это значения кривой.

Вот это должно быть до вставления пустой строки. =)
Richard123 вне форума Ответить с цитированием
Старый 17.01.2011, 17:08   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Я пас, с диаграммами не практиковался.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.01.2011, 17:18   #9
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Тогда, большое спасибо за науку)
Richard123 вне форума Ответить с цитированием
Старый 18.01.2011, 13:15   #10
Richard123
Пользователь
 
Регистрация: 17.01.2011
Сообщений: 26
По умолчанию

Вопрос - а можно ли все значения объявлять как Long? или система начнет тормозить?
Richard123 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить программу вычисления значений функций, используя приём "цикл в цикле" Chaynik011091 Помощь студентам 5 22.06.2009 21:33
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34
Не могу разобраться с проверкой значений CAMyM Microsoft Office Excel 5 23.10.2007 12:18