Страницы: 1
RSS
Макрос, который ищет конкретный текст в ячейках определенных колонок, и выдает сообщение о наличии или отсутствии этого текста
 

Добрый день.

У меня для обработки данных на основе прайсов поставщиков с помощью макроса  делается таблица (файл ПРИМЕР, лист РЕЗУЛЬТАТ). Обычно все данные в итоге есть, кроме некоторых данных КАТЕГОРИЯ (столбец M). В моем макросе включался автофильтр по этому столбцу, и по окончании работы я сразу видел, где надо дополнительно поискать данные.

Однако теперь данных может не хватать в трех столбцах (J, K, M). В этом случае автофильтр не помогает, так как нужных данных может не быть в разных строках.

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

Критерии проверки

В колонке J надо искать строки с текстом год ? (если такие строки есть, то данных не хватает)

В колонке К надо искать строки с текстом нет аннотации (если такие строки есть, то данных не хватает)

В колонке M надо искать строки с текстом № ??? (если такие строки есть, то данных не хватает)

Сообщение желательно вида, например

КОЛОНКА J есть все данные

КОЛОНКА K данных не хватает

КОЛОНКА M данных не хватает

И было бы замечательно, если бы макрос проверял, что если все данные есть (а такое бывает), то в колонках J, K, M формулы заменяются на их значения и макрос останавливается.

Заранее всем спасибо за помощь

 
В столбец "T" формулу
Код
=ИЛИ(J3="Год";K3="Нет аннотации";M3="№ ???")
Установить фильтр, и отфильтровать по столбцу "Т" значение "Истина"
 
Цитата
msi2102 написал:
В столбец "T" формулу
Как вариант — да. Хорошая идея, спасибо. А есть тогда способ добавить в макрос только проверку по столбцу Т? Если там есть истина, то этот столбец остается с включенным автофильтром. Если все значения в этом столбце ЛОЖЬ (т.е., все данные есть) столбец Т просто удаляется
 
Цитата
karlson7 написал:
добавить в макрос
Тут нет макроса, это просто функция и автофильтр, если вам необходимо оставить только Истину, то отфильтруйте наоборот по значению Ложь и удалите строки, после чего поставьте галочку в фильтре напротив Истина
 
Цитата
karlson7 написал:
Тут нет макроса,
Это понятно, просто хочется максимально автоматизировать работу
 
karlson7, что из листа результат находится на листе изначально или это все формируется макросом или се же нас интересуют данные трех вышеуказанных столбцов?
Изменено: Mershik - 18.08.2021 16:43:31
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
karlson7 написал:
Сообщение желательно вида, напримерКОЛОНКА J есть все данныеКОЛОНКА K данных не хватаетКОЛОНКА M данных не хватает
не понятно только что с этим вы будете делать...но хозяин-барин
Код
Sub mrshkei()
Dim K As Long, M As Long, J As Long, t As String, t2 As String, t3 As String
J = Application.WorksheetFunction.CountIf(Columns(10), "год ?")
K = Application.WorksheetFunction.CountIf(Columns(11), "Нет аннотации")
M = Application.WorksheetFunction.CountIf(Columns(13), "№ ???")
If J > 0 Then t = "КОЛОНКА J данных не хватает" Else t = "КОЛОНКА J есть все данные"
If K > 0 Then t2 = "КОЛОНКА K данных не хватает" Else t2 = "КОЛОНКА K есть все данные"
If M > 0 Then t3 = "КОЛОНКА M данных не хватает" Else t3 = "КОЛОНКА M есть все данные"
MsgBox (t & vbLf & t2 & vbLf & t3 & vbLf)
End Sub


Изменено: Mershik - 18.08.2021 16:56:56
Не бойтесь совершенства. Вам его не достичь.
 
Ещё вариант. Макрос в приложенном файле

Код
Sub Проверка_таблицы()
    Dim YearOfPublish As Long, BookDesc As Long, IdCategory As Long

    With ActiveSheet
        'если на активном листе установлен Автофильтр, то снимаем его
        If .FilterMode = True Then .ShowAllData
        'считаем в столбце J наличие 'год ?'
        YearOfPublish = WorksheetFunction.CountIf(.Range("J:J"), "год ?")
        'считаем в столбце K наличие 'Нет аннотации'
        BookDesc = WorksheetFunction.CountIf(.Range("K:K"), "Нет аннотации")
        'считаем в столбце M наличие '№ ???'
        IdCategory = WorksheetFunction.CountIf(.Range("M:M"), "№ ???")

        If YearOfPublish > 0 Or BookDesc > 0 Or IdCategory > 0 Then
            MsgBox "Колонка J отсутствует: " & YearOfPublish & vbNewLine & "Колонка K отсутствует: " & BookDesc & vbNewLine & "Колонка M отсутствует: " & IdCategory, vbInformation, "Проверка"
        Else
            If MsgBox("Есть все данные!" & vbNewLine & "Заменить формулы на значения в столбцах J, K, M ?", vbQuestion + vbYesNo, "Вопрос") = vbYes Then
                Application.ScreenUpdating = False
                Application.Calculation = xlCalculationManual
                .Range("J:J").Value = .Range("J:J").Value
                .Range("K:K").Value = .Range("K:K").Value
                .Range("M:M").Value = .Range("M:M").Value
                .Range("K:K").WrapText = False
                Application.Calculation = xlCalculationAutomatic
                Application.ScreenUpdating = True
                MsgBox "Формулы заменены на значения!", vbInformation, "Конец"
            End If
        End If
    End With
End Sub
Изменено: New - 18.08.2021 19:54:56
 
Цитата
Mershik написал:
что из листа результат находится на листе изначально
На листе РЕЗУЛЬТАТ изначально ничего нет. Эта таблица формируется в результате работы макроса, где-то просто копируются данные из оригинальных прайсов, а где-то отрабатывают формулы: расчет цены подстановка данных из справочников и т.п.

Если позиции у поставщиков старые, то все нормально. Но, как только появляются новые товары (а это книги, они издаются практически каждый месяц), для заполнения трех вышеуказанных столбцов может не хватать данных. Например, издатель ввел новый жанр книг, не поставил год издания или не написал аннотацию. К сожалению, такое происходит регулярно. Поэтому надо отслеживать эти "пустоты" и исправлять их.

Так как количество строк в разных прайсах может доходить до пары десятков тысяч, было бы удобнее (как мне кажется) в конце работы макроса получить сообщение, что все в порядке, можно просто закрыть файл и загрузить его в складскую программу, или надо добавить данные в справочник
Вариант, который предложил msi2102, хороший, спасибо , надо взять его на вооружение. Но в данном случае, получается много строк и столбцов, поэтому, если после работы макроса получается на экране сообщение, что надо делать дальше (или ничего не делать, если все в порядке), работать гораздо проще, Прайсов поставщиков больше 20, и все надо так обрабатывать
 
Mershik,
на Ваш макрос получаю сообщение (у меня на работе Excel 2010)
Invalid outside procedure
 
karlson7,странно проверил на 2010 и  все ок, показали бы в какой стркое она....попробуйте с файлом
Изменено: Mershik - 18.08.2021 17:32:21
Не бойтесь совершенства. Вам его не достичь.
 
Mershik,
Да, все работает, спасибо. Закрыл-открыл EXCEL и все заработало. Много было открыто файлов, глюк приключился

New,
спасибо огромное, именно то, что хотелось получить!
Страницы: 1
Читают тему
Наверх