2015-11-21 8 views
1

У меня есть требование, которое идет как это:Range.Find() терпит неудачу

  • У меня есть два файла Excel с данными из колонок А Q
  • я итерация по каждой строке в каждом листе Excel одного , получить значения в столбце A и найти их в другом Excel для соответствующего листа.
  • Если есть совпадение, я проверяю значения в столбцах A, G и J в обоих Excel. Если они не совпадают, они регистрируются в файле журнала (Excel с представлением матричного типа, где указано несоответствие). (Еще предстоит реализовать)
  • Если нет совпадения, я должен снова зарегистрировать их. (Еще не Реализована)

Кодекс:

For Each workSheet1 In MainWorkBook.Worksheets 
Set MainWorksheet = workSheet1 
Set SecondaryWorksheet = workSheet1 
MainWorksheet.Activate 
Cells.Select 
Selection.EntireColumn.Hidden = False 
Selection.EntireRow.Hidden = False 
rowcount = MainWorksheet.Cells(Rows.count, 1).End(xlUp).Row 
For i = 3 To rowcount 
    MainCheckName = Trim(MainWorksheet.Cells(i, "A")) 
    If (PreviousCheck <> MainCheckName And MainCheckName <> "") Then 
     SecondaryWorksheet.Activate 
     rowcount = SecondaryWorksheet.Cells(Rows.count, 1).End(xlUp).Row 
     SecondaryWorksheet.Range(SecondaryWorksheet.Cells(1, "A"), SecondaryWorksheet.Cells(rowcount, "A")).Select 
     Set SecondaryCheckName = Selection.Find(what:=MainCheckName, LookAt:=xlWhole) 
     If Not SecondaryCheckName Is Nothing Then 
      CheckRow = Selection.Find(what:=MainCheckName, LookAt:=xlWhole).Row 
       <further process here> 

Next Next 

Теперь у меня есть проблема с этой линии:

Set SecondaryCheckName = Selection.Find(what:=MainCheckName, LookAt:=xlWhole) 

После обработки этой деятельности в течение десяти листов, хотя У меня есть содержимое, которое соответствует в обеих листах разных книг, я получаю Nothing для функции Find.

Что не так и почему здесь не работает условие?

+0

Я вижу, что у вас есть 2 'For's, но только один следующий –

+0

К сожалению, забыли добавить, что' Next' в коде –

+0

'MainWorksheet' и' SecondaryWorksheet' устанавливаются на один и тот же рабочий лист во время каждой итерации внешней стороны 'For .. Каждый ... Следующий'. Как может быть какая-то разница? – Jeeped

ответ

1

Вы не указали объявления для SecondaryCheckName, но каждое указание состоит в том, что это строка, не являющаяся переменной диапазона. Вы не должны Set его номер Range object, возвращенный Range.Find method; он должен быть просто присвоен значению результата .Find. В качестве альтернативы объявите его как переменную типа Range, чтобы вы могли указать Set на объект диапазона для будущего использования.

SecondaryCheckName = Selection.Find(what:=MainCheckName, LookAt:=xlWhole).Value2 

Это ответ на вопрос, почему вы получаете сообщение об ошибке. Однако я не думаю, что это лучший способ достижения вашей цели. Существует определенное отсутствие контроля ошибок, и вы должны уменьшить, если не полностью избежать использования. Выберите «and Выбор».

+0

Спасибо за тонну Jeeped. Да, методы контроля ошибок еще не установлены, но сначала подготовьте скелет. –

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