Проверьте, существует ли значение ячейки на двух разных листах, используя VBA - PullRequest
1 голос
/ 14 сентября 2011

У меня есть два разных листа, которые содержат более 500 имен. Мне нужно посмотреть, существует ли имя на одном листе на другом. и если он говорит да или нет в указанном столбце.

Имя будет примерно таким же, как ASmith на одном листе, а затем ASMITH на другом листе, поэтому регистр не требуется

Я так запутался в части VBA. Я программирую на Java, и делать подобные вещи на Java легко для меня. Но в Excel не так уж и много. Ваша помощь приветствуется. ТИА

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Попробуйте что-то вроде этого:

Sub HTH()

    With Sheet1.Range("B1", Sheet1.Cells(Rows.Count, "B").End(xlUp))
        .FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC[-1],Sheet2!C[-1],1,FALSE)),""NO"",""YES"")"
        .Value = .Value
    End With

End Sub

ПРИМЕЧАНИЯ

Предполагается, что искомые значения находятся в столбце A листа1, столбец поиска - столбец листа sheet2. В столбце B листа 1 указывается Да / Нет, чтобы показать, найдено или нет значение. Vlookup не чувствителен к регистру. Вам нужно будет изменить ссылки / столбцы R1C1 в соответствии с вашей рабочей книгой.

Это будет выполняться очень быстро.

1 голос
/ 14 сентября 2011

Во-первых, Visual Basic заботится о чувствительности к регистру, поэтому при сравнении двух листов вам нужно будет преобразовать все в верхний регистр, используя VBA.UCase. Я также включил функцию обрезки, так как вокруг самого слова могут быть пробелы. Любые дальнейшие манипуляции с текстом, необходимые для создания двух сопоставимых строк, должны быть исследованы. Я бы рекомендовал это экспертное руководство по работе с текстовыми строками с помощью макросов Excel

Итак ... при условии, что оба листа находятся в одной и той же книге, наилучшей отправной точкой будет получение кодовых имен двух листов из редактора Visual Basic (по умолчанию Sheet1 / Sheet2 и т. Д.). Ниже я предположил, что Sheet1 - это выходной лист, а Sheet2 - данные, которые вы ищете. Если вы не можете уточнить кодовые имена, вы можете заменить Sheets ("SheetName1") и Sheets ("SheetName2") в следующем коде:

Dim SourceRow as Long
Dim DestRow as Long

For DestRow = 1 to 10
      For SourceRow = 1 to 10

            If VBA.Trim(VBA.UCase(Sheet1.Cells(DestRow,"DestCol"))) = VBA.Trim(VBA.UCase(Sheet2.Cells(SourceRow,"SourceCol"))) then
            Sheet1.Cells(DestRow,"OutputCol") = "Yes"
                  Goto NextDestRow
            End If
      Next SourceRow

Sheet1.Cells(DestRow,"OutputCol") = "No"

NextDestRow:
Next DestRow

Код предполагает, что вы ищете данные в одном столбце на каждом листе, и там, где я написал «DestCol» и «SourceCol», вы должны просто вставить числовое значение этого столбца (где A = 1, B = 2 и т. Д.). «OutputCol» - это столбец, в который вы хотите поместить выходные данные на листе назначения.

Цикл предполагает, что вас интересуют строки с 1 по 10 на каждом листе; при необходимости отрегулируйте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...