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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2009, 18:42   #1
SolexVK
 
Регистрация: 05.05.2009
Сообщений: 9
По умолчанию Определить возраст числа

Добрый день!

Помогите решить следующую задачу.
Нужно из ячейки "В1" запустить следующий цикл:

1. Найти последнюю непустую ячейку в столбце "B", при условии, что до последней непустой ячейки, в данном столбце уже есть пустые ячейки.(В данном примере ячейка "В10").
2. Перейти на столбец "А" на ячейку расположенную на одной строке с найденой до этого ячейкой.(В данном примере ячейка "А10").
3. Определить колличество непустых ячеек в столбце "А", ниже последней найденой ячейкой ("А10").
4. Полученное значение занести в ячейку "В1". (В данном примере должно получиться число 5).

Дополнительно, при появлении новой последней непустой ячейки в солбце "В", необходимо снова и снова запускать весь цикл с начала.

Пример прилагается
Вложения
Тип файла: rar Возраст числа.rar (11.9 Кб, 13 просмотров)

Последний раз редактировалось SolexVK; 05.05.2009 в 20:05.
SolexVK вне форума Ответить с цитированием
Старый 05.05.2009, 19:01   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Правой кнопкой на ярлычке листа, выбираем пункт ИСХОДНЫЙ ТЕКСТ

В открывшееся окно вставляем код:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 2 Or Target.Row = 1 Then Exit Sub  ' отслеживаем изменения только во 2-м столбце
    For i = Intersect(Me.UsedRange, Me.Range("b:b")).Rows.Count + 5 To 2 Step -1
        If Cells(i, 2).Text <> "" Then Exit For
    Next i
    [b1] = Range("a" & Me.Rows.Count).End(xlUp).Row - i
End Sub

Последний раз редактировалось EducatedFool; 05.05.2009 в 19:03.
EducatedFool на форуме Ответить с цитированием
Старый 05.05.2009, 20:21   #3
SolexVK
 
Регистрация: 05.05.2009
Сообщений: 9
По умолчанию

Спасибо!
Всё работает, при условии, что в столбце "В" вписываем числа.

Но возможно я не совсем корректно обьяснил, что мне нужно.
В столбце "В" не числа, а значения формул. В этом случае система не работает.
И ещё, как сделать так, что бы это работало и для остальных столбцов?
SolexVK вне форума Ответить с цитированием
Старый 05.05.2009, 20:33   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Замените прежний код на такой:
Код:
Private Sub Worksheet_Calculate()
    Application.EnableEvents = False: On Error Resume Next
    Application.ScreenUpdating = False
    For i = 2 To 11: Cells(1, i) = ВозрастЧисла(i): Next i
    Application.EnableEvents = True
End Sub

Function ВозрастЧисла(ByVal i As Long)
    For j = Cells.SpecialCells(xlCellTypeLastCell).Row To 2 Step -1
        If Val(Cells(j, i).Value) <> 0 Then Exit For
    Next j
    ВозрастЧисла = Range("a" & Me.Rows.Count).End(xlUp).Row - j
End Function
EducatedFool на форуме Ответить с цитированием
Старый 05.05.2009, 20:55   #5
SolexVK
 
Регистрация: 05.05.2009
Сообщений: 9
По умолчанию

Огромное спасибо!!!
теперь всё работает отлично.
SolexVK вне форума Ответить с цитированием
Старый 05.05.2009, 22:17   #6
SolexVK
 
Регистрация: 05.05.2009
Сообщений: 9
По умолчанию

Есть ещё вопрос.
Если вся таблица начинается не с первой строки, а к примеру с 8. Как сделать так, что бы код работал и при этих условиях?
SolexVK вне форума Ответить с цитированием
Старый 05.05.2009, 22:20   #7
pivas
Форумчанин
 
Регистрация: 03.04.2009
Сообщений: 412
По умолчанию

Попробуй исправить Cells(1, i) на Cells(8, i)
pivas вне форума Ответить с цитированием
Старый 05.05.2009, 22:37   #8
SolexVK
 
Регистрация: 05.05.2009
Сообщений: 9
По умолчанию

Спасибо! Боюсь показаться навязчивым, но прошу ответить ещё на один вопрос.
Если в столбцах таблицы есть столбцы с пустыми ячейками, то код выдаёт почему-то отрицательные и неверные значения. Что делать в этом случае?
За ранее благодарен.
SolexVK вне форума Ответить с цитированием
Старый 05.05.2009, 22:45   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Если вся таблица начинается не с первой строки
Цитата:
Если в столбцах таблицы есть столбцы с пустыми ячейками
А если Вы захотите открывать этот файл не Excel-ем, а Paint-ом?
Макрос тоже должен работать?

Вместо того, чтобы писать все эти "если", лучше бы один раз чётко сформулировали задание.

Цитата:
то код выдаёт почему-то отрицательные и неверные значения
Где пример файла с этими значениями?
Где исчерпывающее описание алгоритма макроса для таких случаев?

К примеру, в 5-м столбце числа идут до 25-й строки, а в 1-м столбце - только до 18-й. И что в этом случае должен выдать макрос?

Макрос всё делает правильно - из 18 вычитает 25 (в правильно заполненных столбцах этот алгоритм даёт верный результат), и пишет в ячейку отрицательное значение.
Вы же не говорили, что должно быть в таком случае записано в ячейку...

Или Вы думаете, что нам нравится по сотне раз переписывать один и тот же макрос?
EducatedFool на форуме Ответить с цитированием
Старый 06.05.2009, 01:02   #10
SolexVK
 
Регистрация: 05.05.2009
Сообщений: 9
По умолчанию

Уважаемый EducatedFool - вы правы во всех описаных претензиях. Я действительно был не прав, постоянно добавляя новые условия для выполнения кода.

Однако при всём уважении, представленный вами код не работает корректно, в случае выпадения нуля в столбце "А".

Поскажите, что можно сделать в данном случае.

Пример я приложил
Вложения
Тип файла: rar Возраст числа2.rar (16.1 Кб, 15 просмотров)

Последний раз редактировалось SolexVK; 06.05.2009 в 10:15.
SolexVK вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
определить все простые числа не превосходящие заданного N QBasic werus Помощь студентам 4 23.04.2009 13:32
Помогите с задачей: определить все про числа от 1 до n laneen Помощь студентам 1 26.02.2009 09:56
Даны числа а1, a2, …, а10. Определить сумму их квадратов. Maks:// Помощь студентам 1 22.01.2009 15:24
Определить, является ли заданная строка правильной записью вещественного числа Sergik1977 Паскаль, Turbo Pascal, PascalABC.NET 2 18.10.2007 16:53