Поиск последнего значения в строке

Программирование на Visual Basic for Applications
IlGiZar
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 13.07.2009 (Пн) 14:02

Поиск последнего значения в строке

Сообщение IlGiZar » 13.07.2009 (Пн) 14:11

Код: Выделить всё
Public Function lastprice(row) 
row = row.row
Z = Cells(row, 3)
    For inCol = 4 To 256
        If Cells(row, inCol) > 0 Then
            Z = Cells(row, inCol)
        End If
    Next inCol
lastprice = Z
End Function

Функция работает, но достаточно кривовато. Кривость в том, что при удаление/добавлении листов в других книгах, ексель все пересчитывает, и в результат функции вставляет цифры из активного листа. Пробывал перед cells(r,c) добавлять имя листа, но это сильно тормозит процесс вычислении. Способов уменьшить число циклов не нашел.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск последнего значения в строке

Сообщение iGrok » 13.07.2009 (Пн) 14:21

IlGiZar писал(а):Пробывал перед cells(r,c) добавлять имя листа, но это сильно тормозит процесс вычислении.

Как добавлял имя листа? Покажи код.
label:
cli
jmp label

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Поиск последнего значения в строке

Сообщение alibek » 13.07.2009 (Пн) 14:21

Ужас.
Словами скажи, что ты хочешь.
Lasciate ogni speranza, voi ch'entrate.

IlGiZar
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 13.07.2009 (Пн) 14:02

Re: Поиск последнего значения в строке

Сообщение IlGiZar » 13.07.2009 (Пн) 14:31

iGrok писал(а):Как добавлял имя листа? Покажи код.

Код: Выделить всё
Public Function lastprice(row) 
row = row.row
Z = Sheets("price").Cells(row, 3)
    For inCol = 4 To 256
        If Sheets("price").Cells(row, inCol) > 0 Then
            Z = Sheets("price").Cells(row, inCol)
        End If
    Next inCol
lastprice = Z
End Function

вот так вот добавлял.

alibek писал(а):Ужас.
Словами скажи, что ты хочешь.
Ужас.
Словами скажи, что ты хочешь.

Есть номенклатура, оттуда последние цены должны попадать в калькуляцию. т.е. в ячейке где формула всегда должна стоять последняя цена, из номенклатуры. Цены меняются каждый день.

Апострофф
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 17.04.2009 (Пт) 19:39

Re: Поиск последнего значения в строке

Сообщение Апострофф » 13.07.2009 (Пн) 16:36

Код: Выделить всё
'Public Function lastprice(row)  'не понятно, что передается этой ф-ии в качестве параметра
Public Function lastprice(row as long)  as double 'я бы передал номер строки
'row = row.row '???
'Z = Sheets("price").Cells(row, 3) 'зачем?

For inCol = 3 To 256
  If WorkSheets("price").Cells(row, inCol) > 0 Then 'Sheets имеет некоторые отличия от WorkSheets - более узкого понятия
     Z = Sheets("price").Cells(row, inCol)
  else
    exit for  'зачем проверять все ячейки строки, если уже есть пустая (нулевая)
  End If
Next inCol
lastprice = Z
End Function

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Re: Поиск последнего значения в строке

Сообщение KL » 18.07.2009 (Сб) 21:52

Как все запущено! :-))))))))))))

У меня ощущение, что...
- функция нужна для использования на рабочем листе
- ведется поиск числового значения

Если уж очень надо кодом, то быстрее вот так:

Код: Выделить всё
Public Function LastCol(rng As Range)
    Set LastCol = rng(1)
    On Error Resume Next
    LastCol = rng.Find("*", rng(1), xlValues, xlWhole, xlByColumns, _
        xlPrevious).Value
End Function

и вызываем из ячейки =LastCol(D2:IV2)

Но вообще ничто не сравнится по скорости вот с такой формулой:

=ПРОСМОТР(9E+307;D2:IV2)

я уже не говорю об остальных удобствах :-)

Кстати, в коде тоже можно вот так:

Код: Выделить всё
Public Function LastCol(rng As Range)
    LastCol = Application.Lookup(9E+307, rng)
End Function
Привет,
KL


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 6

    TopList