2015-03-25 2 views
0

Как пропустить все строки столбца в VBA?Пронумеруйте весь столбец, чтобы найти значение

Вот мой пример:

Function FindRow(Item As String, Rng As range) As Variant 

Dim row As Integer 
Dim col As Integer 

For col = 1 To Rng.Columns.Count 
    For row = 1 To Rng.Rows.Count   
     If Rng.Cells(row, col).Value = Item Then 
      FindRow = row + Rng.row - 1 
      Exit Function 
     End If 
    Next row 
Next col 

FindRow = CVErr(XlCVError.xlErrNA) 

End Function 

Если мой диапазон один столбец, Rng.Columns.Count является 1 и Rng.Rows.Count является 1048576. Моей функции останавливается перед входом второй для. Если добавить часы на Rng.Cells (строка, столбец) .Value, я получил

<Application-defined or object-defined error> 

в окне просмотра, но не всплывающие окна.

спасибо.

EDIT

Второе решение

Использование Rng.Find (Item) .Row

Function FindRow(Item As String, Rng As range) As Variant 

FindRow = Rng.Find(Item).Row 

End Function 

/! \ Возвращает #VALUE вместо # N/A, если Пункт не находится в диапазоне

+1

Почему вы Перебор более миллиона строк, когда вы можете просто использовать 'Range.Find()'? –

+0

... или 'MATCH'? –

+0

Но если вы хотите пройти через цикл, возможно, установите i = 1 и используйте «Do до i> Rng.Columns.Count», а в конце i = i + 1 –

ответ

3

Почему бы не просто использовать встроенный MATCH фикция?

=MATCH(C3,A:A,0) 

enter image description here


... потому что вы хотите найти много столбцов сразу. Для этого, вы можете использовать эту UDF:

Function FindRow(lookFor As String, rng As Range) 
    Dim v As Variant 
    Dim iRow As Long 
    Dim iCol As Long 

    'Read contents of range into a Variant array 
    v = rng.Value 

    'Loop through contents to locate the desired element 
    For iRow = LBound(v, 1) To UBound(v, 1) 
     For iCol = LBound(v, 2) To UBound(v, 2) 
      If v(iRow, iCol) = lookFor Then 
       FindRow = iRow 
       Exit Function 
      End If 
     Next iCol 
    Next iRow 



    FindRow = CVErr(XlCVError.xlErrNA) 
End Function 

enter image description here

+0

+1 Я бы сделал это, но для OP только для справок в будущем, когда вы перебираете все строки на листе, вам лучше объявить тип переменной Long, а не Integer, потому что тип данных Integer может хранить только значения до 32768. – Dave

+0

Мне нужно пройти через неизвестное количество столбцов и строк – Sara

+0

@Dave Полностью педантичный я знаю, но целое число может содержать до 32 767 в VBA –

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