Новости:

Теперь на форум можно залогиниться / зарегистрироваться с помощью ВКонтакте. Уже существующие пользователи могут связать свою учетную запись с аккаунтом ВКонтакте одним кликом в профиле пользователя http://forum.msexcel.ru/index.php?action=profile;area=account

Главное меню

Как перебрать диапазон с конца

Автор Poltava, 15.05.2012, 23:07

« назад - далее »

Poltava

Вот фрагмент кода который ищет в диапазоне ячейку со значением "итого" и определяет ее позицию
    Dim tCell As Variant
   For Each tCell In Range("C:C").SpecialCells(xlConstants, 23)
       If tCell.Value = "Итого" Then
           Exit For
       End If
       Flag = Flag + 1
   Next tCell
   Index = tCell.Row

Код вроде работает без претензий и свою функцию выполняет. Но он допустим перебирает ячейки от С1 до С500000 а значение итого как правило именно в ячейке С500000 следовательно код должен выполниться 500000 тысяч раз!!! а оно нам надо ???
Отсюдова возникает задачя как перебрать этот же диапазон но в обратном порядне начиная с С500000 так код должен будет выполниться всего раз 10  как по мне прирост скорости должен быть налицо.
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

RAN

Не подойдет?
Sub qq()
Dim i&
For i = Cells(Rows.Count, "C").End(xlUp).Row To 1 Step -1
If Cells(i, "C").Value = "Итого" Then Index = i: Exit For
Next
End Sub

8)

Poltava

Да спасибо я тоже думал о таком варианте. Но все же хотел узнать именно возможно ли перебрать диапазон с конца именно в таком синтаксисе. For Each tCell In Range("C:C").SpecialCells(xlConstants, 23)
Думал может есть какой то параметр типа Step -1 но очевидно это невозможно и нужно делать именно так как Вы предложили
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

_Boroda_

#3
Если нужно найти значение в столбце, и оно там единственное (что следует из попытки искать сверху вниз и снизу вверх), то, по-моему, будет намного быстрее использовать функцию листа
Sub tt()
On Error Resume Next
n_ = WorksheetFunction.Match("Итого", Range("C:C"), 0)
On Error GoTo 0
End Sub

или обычным поиском
  r_ = Columns("C:C").Find(What:="Итого", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Row
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Poltava

Спасибо за подсказку будем пробовать
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Poltava

#5
Да перепробовал несколько способов вот результаты при условии что значение итого находилось в последней или предпоследней строке всего перебирались 4 файла. Но как по мне результаты какие то странные и либо я неверно организовал таймер либо одно из двух :)
Time  0  Index  1824
Time  0,03125  Index2  1824
Time  0  Index3  1824
Time  0  Index4  1824

Time  0,03125  Index  3308
Time  0,03125  Index2  3308
Time  0  Index3  3308
Time  0  Index4  3308

Time  0,015625  Index  2929
Time  0,03125  Index2  2929
Time  0  Index3  2929
Time  0  Index4  2929

Time  0,015625  Index  2465
Time  0,03125  Index2  2465
Time  0  Index3  2465
Time  0  Index4  2465
Ну и сам код
    t = Timer
    Dim tCell As Variant
    For Each tCell In Range("C:C").SpecialCells(xlConstants, 23)
        If tCell.Value = "Итого" Then
            Exit For
        End If
    Next tCell
    Index = tCell.Row
    Debug.Print "Time "; Timer - t; " Index "; Index
   
    t = Timer
    Index2 = Range("C:C").SpecialCells(xlConstants, 23).Find(What:="Итого", After:=Cells(1, 3), LookIn:=xlValues, _
            LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False).Row
    Debug.Print "Time "; Timer - t; " Index2 "; Index2
   
    t = Timer
    Dim i&
    For i = Cells(Rows.Count, "C").End(xlUp).Row To 1 Step -1
        If Cells(i, "C").Value = "Итого" Then Index3 = i: Exit For
    Next
    Debug.Print "Time "; Timer - t; " Index3 "; Index3
   
    t = Timer
    On Error Resume Next
        Index4 = WorksheetFunction.Match("Итого", Range("C:C"), 0)
    On Error GoTo 0
    Debug.Print "Time "; Timer - t; " Index4 "; Index4
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.