Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 10:36   #1
~Forgotten~
Новичок
Джуниор
 
Регистрация: 23.01.2013
Сообщений: 1
По умолчанию Трудности с написанием проверки.

Есть exel документ в нем 2 листа, на первом свод файлов, которые группируются в таблицу, на втором листе словарь. В словаре актуальные данные. Нужно организовать проверку. нужно для каждой записи свода найти по коду лесничества соответствующее значение в словаре (лист2) и проверить у найденной записи наименование лесничества, сходиться оно с данными в строчке на листе 1.
В итоге мне нужно организовать для каждой записи начиная со строки А11 (лист 1) пока не пустое значение в этой ячейке, находить ему соответствующее значение в столбце G7 (лист 2). После нахождения искомой записи, нужно проверить будут ли совпадать значения в B11 (лист 1) с F3 (лист2). Если нет, сообщение об ошибке. Заранее благодарю!!!
Вложения
Тип файла: rar Копия Копия Свод =).rar (81.6 Кб, 10 просмотров)
~Forgotten~ вне форума Ответить с цитированием
Старый 24.01.2013, 10:39   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Код для книги из сообщения #1:
Код:
Sub Procedure_1()

    'В константе "myStartSheet_1" указываем номер строки,
        'с которой начинаются данные на листе "1".
    Const myStartSheet_1 As Long = 11
    'В константе "myStartSheet_2" указываем номер строки,
        'с которой начинаются данные на листе "2".
    Const myStartSheet_2 As Long = 3

    Dim shSheet_1 As Excel.Worksheet
    Dim shSheet_2 As Excel.Worksheet
    Dim mySearchRange As Excel.Range
    Dim myFind As Excel.Range
    Dim myLastRow As Long
    Dim i As Long
    
    '1. Для удобства написания кода, даём имена листам.
    'Через эти имена будем осуществлять доступ к листам.
    'В скобках в данном случае имена листов. Порядковые номера
        'пишутся без кавычек.
    Set shSheet_1 = Worksheets("1")
    Set shSheet_2 = Worksheets("2")
    
    '2. Для поиска буду использовать команду "Find".
        'Чтобы сузить диапазон поиска, чтобы код работал быстрее,
        'задаю диапазон, в котором нужно искать данные на листе "2".
    '2.1. Определяю последнюю строку с данными на листе "2" в столбце "G".
    'What:="?" - знак вопроса - это специальный символ в данном случае.
    'SearchDirection:=xlPrevious - поиск с конца в начало.
    myLastRow = shSheet_2.Columns("G").Find(What:="?", LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
        MatchCase:=False, SearchFormat:=False).Row
    
    '2.2. Даю имя "mySearchRange" диапазону ячеек, в которых нужно искать данные.
    Set mySearchRange = shSheet_2.Range("G" & myStartSheet_2 & ":G" & myLastRow)
    
    'В цикле с "Do ... Loop" двигаемся по листу "1" по первому
        'столбцу до первой пустой ячейки.
    '3. Задаём, с какой строки нужно начать двигаться.
    i = myStartSheet_1
    Do While IsEmpty(shSheet_1.Cells(i, "A")) = False
        
        'Ищем на листе "2" нужные данные.
        'What:=CStr(shSheet_1.Cells(i, "A").Value) - здесь находится текст,
            'который ищется.
            '"CStr" используется, чтобы перевести тип данных, который есть в ячейке
                'в текст, т.к. можно искать только текст.
            'LookAt:=xlWhole - ищется полное совпадение.
        Set myFind = mySearchRange.Find(What:=CStr(shSheet_1.Cells(i, "A").Value), _
            LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
            SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
            
        'Если будет найдено искомое, то ячейке, где найдено, будет
            'дано имя "myFind". Если не будет найдено, то в переменной
            '"myFind" будет содержаться слово "Nothing".
        If Not myFind Is Nothing Then
            'Если найдено, то сравниваем данные из двух листов.
            '"OffSet" используется в данном случае, чтобы обратиться
                'к ячейке, которая находится в той же строке, но слева.
            If shSheet_1.Cells(i, "B").Value <> myFind.Offset(0, -1).Value Then
                'Если данные не совпадают, то выдаём сообщение.
                MsgBox "Данные не совпадают в строке " & i, vbExclamation
                'Выходим из кода.
                Exit Sub
            End If
        End If
        
        'Переход к следующей строке на листе "1".
        i = i + 1
        
    Loop
    
    'Сообщение о завершении работы кода.
    MsgBox "Работа кода завершена", vbInformation
    
End Sub

Примечание
  1. В коде использована Excel-команда Find. Эта команда имеет следующие характеристики:
    1. ищет текст, который состоит не больше, чем из 255 символов;
    2. чувствительна к объединённым ячейкам. Может не найти, если есть объединённые ячейки;
    3. не ищет в скрытых строках и столбцах;
    4. в коде нужно указывать все параметры (я не указываю только параметр "After"), т.к. команда "Find" связана с окном "Найти и заменить" и если не указать какой-то параметр, то параметр может взяться из окна "Найти и заменить";
    5. я получаю нужные параметры команды "Find" всегда с помощью макрорекордера, а затем корректирую эти параметры.
  2. Команда "Find" работает быстрее, чем просмотр каждой ячейки в заданном диапазоне. Но если код с использованием команды "Find" будет медленным, то можно попробовать помещать данные в VBA-массивы и там вести поиск.
Скрипт вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# и Java трудности. LaiQue Общие вопросы .NET 0 24.04.2010 15:50
Трудности перевода Elidan Общие вопросы C/C++ 0 10.06.2009 01:49
Трудности с нестандартным кодом проверки формы Greg189 JavaScript, Ajax 2 29.03.2009 21:01
Трудности с формулой arr1val Microsoft Office Excel 1 15.08.2008 17:18
Трудности перевода Maks1978 Свободное общение 6 30.05.2008 12:55