Страницы: 1
RSS
Проверка макросом соответствия шапки таблицы шаблону
 
Уважаемые эксперты, доброго времени суток!
Прошу помочь в следующем вопросе:
Имеется  таблица.
Количество и заголовки столбцов должны соответствовать шаблону (последовательность не важна).
Соответствие должно быть по ячейке и по регистру.
С помощью макрорекордера я начал запись макроса, но к сожалению не могу исправить  код как нужно.
Прошу скорректировать код так , чтобы если значение, прописанное в макросе не находится, выводилось сообщение с этим значением, и макрос останавливался.
Excel 2016, 64 bit.

Пробовал способ " On Error GoTo  метка с сообщением" не помог,  у меня не получается остановить макрос, он все равно выполняется полностью.

С уважением, Lari.
Изменено: Lari - 23.11.2017 18:24:15
 
Код
Sub Глaбол()
    Dim a()
    Dim j&
'-----------
    a = Sheets("Шапка").UsedRange.Rows(21).Value
    With CreateObject("Scripting.Dictionary")
        For j = 1 To UBound(a, 2)
            If a(1, j) <> "" Then .Item(a(1, j)) = ""
        Next
        a = Sheets("Шапка").UsedRange.Rows(1).Value
        For j = 1 To UBound(a, 2)
            If a(1, j) <> "" Then
                If Not .Exists(a(1, j)) Then
                    MsgBox "Нет заголовка """ & a(1, j) & """"
                    Exit Sub
                End If
            End If
        Next
    End With
    Beep
    MsgBox "Всё на месте"
End Sub
 
kalbasiatka,   этот макрос не вывел сообщения что нет значения b.
В примере я указал каким бы хотел видеть результат работы макроса.
Не могли бы вы подсказать команду , подставив которую , в случае ненахождения макросом искомого значения, выводилось сообщение что это значение не найдено и выполнение макроса останавливалось?
С уважением, Lari.
 
MsgBox "Не найдено!":  End
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, доброго времени суток!
Спасибо за ответ.
Немного поэкспериментировал, получился следующий код
Тут пример для позиции "b" (16-я строка кода), для остальных столбцов я также повторю.
А  нельзя записать приведенный мной вариант проще,чтобы , если ошибка, выводим сообщение "нет b" и завершаем макрос?
С уважением, Lari.
Код
Sub Глобал()

    Rows("1:1").Select
    With Application.ReplaceFormat.Interior
        .PatternColorIndex = xlAutomatic
        .Color = 15773696
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Selection.Replace What:="A", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=True
    Selection.Replace What:="b", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=True
        On Error GoTo Errors1
Errors1:
    MsgBox ("Не найдено b!")
    Resume Next
    GoTo Ends:
    Selection.Replace What:="C", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=True
    Selection.Replace What:="D", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=True
    Selection.Replace What:="E", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=True
    Selection.Replace What:="F", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=True
    Selection.Replace What:="G", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=True
Ends:
 End Sub
Изменено: Lari - 24.11.2017 14:35:52
 
Всем доброго времени суток!

Lary,
1) Зачем Вы используете замену в макросе? Вам же нужно просто найти, и если не находится - вывести сообщение
   Имхо, вместо метода replace нужно использовать find
2) Чтобы не повторять участки кода отдельно для А,В,С - нужно прописывать такой код в цикл

Переделала Ваш файлик, посмотрите
Изменено: Sasha0601 - 24.11.2017 14:36:11
 
Sasha0601, Добрый день!
Большое спасибо за помощь, и не хотел бы показаться неблагодарным, но у меня  150 файлов для проверки, мне легче 1 раз прописать в макросе нужные названия столбцов, чем 150 раз копировать в соседний лист для образца.
К тому же Ваш код не чувствителен к регистру символа.
К сожалению мой код , который я здесь привел, даже при всех правильных столбцах, все равно теперь останавливает макрос.
Поэтому вопрос остается открытым, какой нужно добавить код чтобы ы случае необнаружения проверяемого значения, которое прописано в макросе, макрос останавливался, и выводил сообщение что такое-то значение не найдено.
В таком случае я сам скорректирую и еще раз запущу проверку столбцов.
С уважением, Lari.
 
Lari, тогда вместо шаблонного листа используем массив и цикл по массиву.
У функции Find есть параметр MatchCase – чувствительность к регистру.
Посмотрите вложение
 
Sasha0601, Наличие проверяет, но нельзя ли те значения, которые проверены и совпадают, окрашивать в какой-нибудь цвет.
Т.к. в таблице 50 столбцов, последовательность не всегда совпадает, и искать где именно некорректно заполненный столбец будет сложнее, чем если корректные будут окрашены.
С уважением, Lari.
 
Прошу закрыть тему.
Страницы: 1
Наверх