2013-05-14 2 views
0

В этой ситуации я проверяю каждую ячейку в диапазоне «F». и посмотреть, будет ли каждая ячейка соответствовать любой из ячеек в отдельном диапазоне «D». Если это так, я хочу знать номер строки, в которой эта ячейка существует, и скопировать ее (а также информацию в другом столбце той же строки) на другой лист. если он не может найти совпадение, он распечатает ячейку, которую он не смог найти, а рядом с ней «0». Как я могу найти значение строки, в которой эти данные существуют?Как найти номер строки ячейки, которая соответствует любому заданному значению

Dim lastrow As Integer 
lastrow = Range("F65336").End(xlUp).Row 
Dim C As Integer 
C = 2 
For Each cell In Range("F2:F" & lastrow) 
If cell.Value = Range("D2:" & lastrow) Then 
    sheet2.Range("B" & C).Value = Sheet1.Range("D" & C).Value 
    Sheet1.Range("D" & C).Value = Sheet1.Range("F" & VALUE_OF_ROW_OF_MATCHING_CELL).Value 
    sheet2.Range("C" & C).Value = Sheet1.Range("H" & VALUE_OF_ROW_OF_MATCHING_CELL).Value 
Else 
    sheet2.Range("B" & C).Value = Sheet1.Range("D" & C).Value 
    Sheet1.Range("C" & C).Value = 0 
End If 
C = C + 1 
Next cell 
+1

Если вы хотите найти определенное значение в диапазоне, вы можете использовать (например) 'Set f = rangeToSearch.Find (valueyouwant ,, xlvalues, xlwhole)' f будет установлен в диапазон (если бы значение было найдено) или «Ничего», если это не так. –

+0

набор @TimWilliams f = rangeToSearch.Find ("D" & C ,, F2, F10000) ' будет f значить номер строки или конкретную ячейку? потому что мне нужны данные из соседних (левых и правых) ячеек. – Nick

+0

'f' является (одноячеистым) объектом Range, поэтому' f.Row' выдаст вам номер строки –

ответ

1

Как это работает?

If cell.Value = Range("D2:" & lastrow) Then 

Он пытается сравнить одну ячейку с коллекцией клеток, и что никогда не будет вычисляться так.

Поскольку вы упоминаете вы хотите увидеть, если каждая ячейка соответствует одному из элементов в отдельном диапазоне «D», я думаю, вам нужен еще один для каждого в вашем коде:

Dim lastrow As Integer 
lastrow = Range("F65336").End(xlUp).Row 

Dim fCell, dCell 
For Each fCell In Range("F2:F" & lastrow) 
    Dim fRow As Integer 
    fRow = fCell.Row 

    'prepopulate with default, not-found values 
    Sheet2.Range("B" & fRow).Value = Sheet1.Range("D" & fRow).Value 
    Sheet1.Range("C" & fRow).Value = 0 

    For Each dCell In Range("D2:D" & lastrow) 
     If fCell.Value = dCell.Value Then 
      Dim dRow As Integer 
      dRow = dCell.Row 
      Sheet2.Range("B" & fRow).Value = Sheet1.Range("D" & dRow).Value 
      Sheet1.Range("D" & fRow).Value = Sheet1.Range("F" & dRow).Value 
      Sheet2.Range("C" & fRow).Value = Sheet1.Range("H" & dRow).Value 
     End If 
    Next dCell 

Next fCell 

Заметим, что вышесказанное предполагает, что диапазоны охватывают один и тот же набор строк. Если это действительно так, то я бы предложил вместо этого использовать vlookup.

Например, вы можете использовать столбец G для выполнения vlookup. Поместите это в G2 и заполнить вниз:

=IFERROR(VLOOKUP(F2,D:D,1,FALSE), "") 

Затем в Лист2 ячейке B2, можно ссылаться на G2:

=IF(Sheet1!G2="","",Sheet1!D2) 

... и так далее.

+0

, это не сработает; вот почему я спрашиваю. – Nick

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