2015-12-15 5 views
1

Я использую следующий код:Последняя строка в Excel VBA Вычислить

Sub Evaluation_Formula() 
    Dim i As Long 
    With Worksheets("Sheet1") 
     i = .Evaluate("MIN(IF((LEFT($B$1:$B$89,5)*1)=C1,$B$1:$B$89,""""))") 
     .Range("F3").Value2 = i 
    End With 
End Sub 

Однако формула ограничивается B89, как я могу использовать последнюю строку в колонке B в формуле?

+0

Вы знаете, как использовать эзотерическую функцию, такую ​​как 'оценка', но не можете найти последнюю строку Oo – findwindow

+1

[Найти] (http://stackoverflow.com/questions/11169445/error-in-finding-last-used- cell-in-vba) в последней строке и сохранить ее в переменной, подобной 'lastrow', тогда:' i = Evaluate ("MIN (IF ((LEFT ($ B $ 1: $ B $" & lastrow & ", 5) * 1) = C1, $ B $ 1: $ B $ "& lastrow &", "" "")) ")'. Редактировать нет '.' перед' Evaluate' –

+0

Привет, Скотт, Большое спасибо, я знаю LR thingy, но просто не мог понять, как его использовать, поскольку FindWindow сказал: esoteric, оцените формулу. Sub Evaluation_Formula_w_LR() Dim я As Long Dim LR As Long С Таблицах ("Лист1") LR = .Cells (Rows.Count, 2) .END (xlUp) .Row я = Вычислить ("MIN (IF ((LEFT ($ B $ 1: $ B $ "& LR &", 5) * 1) = C1, $ B $ 1: $ B $ "& LR &", "" "")) ") .Range («F10»). Значение2 = i Конец с Конец Sub – StarShines

ответ

3

Для всех намерений и целей, вы действительно только связанных с последним номером в столбце B, а не конкретно в последней строке. Чтобы сделать это в формуле листа, вы должны использовать что-то вроде этой формулы массива.

=MIN(IF(--LEFT(B1:INDEX(B:B, MATCH(1E+99,B:B)),5)=C1, B1:INDEX(B:B, MATCH(1E+99,B:B)))) 

Это может быть переведено на ваш VBA Evaluate method, как показано ниже.

Sub Evaluation_Formula() 
    Dim i As Long 
    With Worksheets("Sheet1") 
     i = .Evaluate("MIN(IF(--LEFT(B1:INDEX(B:B, MATCH(1E+99,B:B)),5)=C1, B1:INDEX(B:B, MATCH(1E+99,B:B))))") 
     .Range("F3").Value2 = i 
    End With 
End Sub 

двойной унарный (ака двойной минус или --) делает ту же работу, умножая текст результата из LEFT function на 1. Там нет никакой необходимости передавать строку нулевой длины (например, ""), поскольку FALSE является достаточным для несоответствий в функции IF. Поскольку вы оцениваете текст в формуле, нет необходимости в абсолютных маркерах $.

Сохраните . в .Evaluate или добавьте имя рабочей таблицы в ссылки на ячейки в формуле. Без этого вы рискуете оценить другие ячейки B1: B89 и C1 листа листа, если Лист 1 не содержит ActiveSheet property книги.

+0

Aaahhh lovely .... спасибо миллиону Jeeped, это один полный ответ. God Bless You :) – StarShines

+0

@StarShines - и поблагодарить ВАС за то, что вы задали достойный вопрос, который показал как исследования, так и усилия с вашей стороны. – Jeeped

1

Я думаю, это будет размещать код нужного:

Sub Evaluation_Formula_w_LR() 
Dim i As Long 
Dim LR As Long 
With Worksheets("Sheet1") 
    LR = .Cells(.Rows.Count, 2).End(xlUp).Row 
    i = Evaluate("MIN(IF((LEFT($B$1:$B$" & LR & ",5)*1)=C1,$B$1:$B$" & LR & ",""""))") 
    .Range("F10").Value2 = i 
End With 
End Sub 
+0

Я сделал небольшое изменение. Когда вы можете отметить его как правильно. –

+0

Могу ли я узнать, как это сделать? :) – StarShines

+0

В конце концов, рядом с ответом появится зеленая галочка. нажмите здесь. –

 Смежные вопросы

  • Нет связанных вопросов^_^