Страницы: 1
RSS
Подбор цикла для "бесконечного" перебора
 
Здравствуйте!

Подскажите пожалуйста как составить цикл бесконечного перебора для такого случая:
Пользователем выделяется диапазон ячеек A1:A10.
Цикл начинает перебор с ячейки A5 и когда доходит до конца диапазона - перебор начинается уже с ячейки A1.
Я это реализовал с помощью двух циклов For each ... Next, но хотелось бы оптимизировать по возможности.

С уважением,
ПАХОМ.
Спокойствие - величайшее проявление силы.
 
Цитата
Werty пишет:
Я это реализовал с помощью двух циклов For each ... Next
не вижу.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Вот файл.
Спокойствие - величайшее проявление силы.
 
как-то... сложновато у вас....  :(  
а в чем задача?
что может быть в левой табличке? только единички и пустоты?
и перед пустотой надо поставить вместо 1 двойку?
пс. а двух пустот подряд быть не может?
Изменено: ikki - 09.03.2013 15:22:45
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Прошу прощения ...
Задача.
Нужно найти кол-во пустых ячеек между двумя непустыми ячейками в диапазоне ОбластьПоиска.
Оба диапазона (ОбластьПоиска и ОбластьЗначений) сопоставимы и если, например, формула в диапазоне ОбластьЗначения соответствует пустой ячейке в ОбластиПоиска, то ничего не выводится. В противном случае в ОбластиПоиски считается кол-во пустых ячеек до первой непустой ячейки.
Спокойствие - величайшее проявление силы.
 
Может быть и две пустые и три ... вообще может быть одна ячейка непуста, а все другие пустые (на втором листе тоже эта формула).
Спокойствие - величайшее проявление силы.
 
Цитата
Werty пишет:
кол-во пустых ячеек между двумя непустыми ячейками
а разве у вас так получается?..

ну ладно, по приведенным примерам в файле как-то так можно:
Код
Function f(ОбластьПоиска As Range, ОбластьВставки As Range)
  Dim n%, i%
  f = 1
  n = Application.Caller.Column - ОбластьВставки.Column + 1
  If IsEmpty(ОбластьПоиска.Cells(1, n)) Then f = "": Exit Function
  If n = ОбластьПоиска.Columns.count Then Exit Function
  If Not IsEmpty(ОбластьПоиска.Cells(1, n + 1)) Then Exit Function
  For i = n + 1 To ОбластьВставки.Columns.count
    If IsEmpty(ОбластьПоиска.Cells(1, i)) Then f = f + 1 Else Exit Function
  Next
End Function
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Да, получается так + 1 (Сори что сразу не уточнил).
Ваша формула более корректна. Можно Вас попросить прокомментировать её?
Спокойствие - величайшее проявление силы.
 
Хотя нужно самому разобраться.
Благодарю Вас ikki!
Поставил бы Вам плюсик в авторитет, но этих кнопок сегодня я не вижу ... а жаль.

С уважением,
ПАХОМ.
Спокойствие - величайшее проявление силы.
 
Цитата
Werty пишет:
Можно Вас попросить прокомментировать её?
честное слово - не вижу тут ни одной строчки, нуждающейся в комментарии :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Верно будет так:
Код
Function ПустыеЯчейкиСчёт(ОбластьПоиска As Range, ОбластьВставки As Range)
  Dim n%, i%, s%
  ПустыеЯчейкиСчёт = 1
  'ОбластиВставки - находим порядковый номер ячейки содержащую нашу формулу
  n = Application.Caller.Column - ОбластьВставки.Column + 1
  'ОбластиПоиска - если ячейка с таким же порядковым номером пустая, то выходим из функции
  If IsEmpty(ОбластьПоиска.Cells(1, n)) Then ПустыеЯчейкиСчёт = "": Exit Function
  'ОбластиПоиска - если ячейка с таким же порядковым номером заполнена, то начинаем подсчёт
  For i = n To ОбластьВставки.Columns.count
    If i < ОбластьПоиска.Columns.count Then 'если не подошли к концу диапазона
        If IsEmpty(ОбластьПоиска.Cells(1, i + 1)) Then ПустыеЯчейкиСчёт = ПустыеЯчейкиСчёт + 1 Else Exit Function
    Else 'если подошли - начинаем перебор с начала диапазона
        For s = 1 To n
          If IsEmpty(ОбластьПоиска.Cells(1, s)) Then ПустыеЯчейкиСчёт = ПустыеЯчейкиСчёт + 1 Else Exit Function
        Next
    End If
  Next
  
End Function
Спокойствие - величайшее проявление силы.
 
Хотя было проще использовать цикл, просматривающий диапазон с начала, если просмотр дошёл до последнего элемента диапазона. Но в Вашем примере почерпнул новое для себя - способ перебора.
Очень Вам благодарен!

С уважением,
ПАХОМ.
Спокойствие - величайшее проявление силы.
 
Цитата
Werty пишет:  Верно будет так:
ну, если ваша задача поменялась, то тогда, может, и будет.  :D
или я чего-то не заметил и мои результаты отличаются от ваших?..
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Werty, мне кажется, Вы всё-таки не совсем поняли смысл вот этого фрагмента:
Код
  For i = n + 1 To ОбластьВставки.Columns.count
    If IsEmpty(ОбластьПоиска.Cells(1, i)) Then f = f + 1 Else Exit Function
  Next
иначе не производили бы дополнительные проверки в коде, да ещё и внутри цикла.
если вам нужно "зациклить" подсчет пустых ячеек, то после приведенного фрагмента достаточно написать еще один цикл.
Код
  For i = 1 To n-1
    If IsEmpty(ОбластьПоиска.Cells(1, i)) Then f = f + 1 Else Exit Function
  Next

а "достигли"/"не достигли" - за это Exit Function в ответе  ;)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Да, согласен с Вами. Удалил только
Код
If n = ОбластьПоиска.Columns.count Then Exit Function
иначе получается без зацикливания.
Спокойствие - величайшее проявление силы.
Страницы: 1
Наверх