Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Работа макроса с вводом данных и выполнением на двух рабочих листах
 
Hugo, Я скормил код чату GPT от безнадежности (да простят мне мои грехи гуру excel)

Он предложил корректировку немного другой строчки. Код стал работать исправно как нужно.

Было
Код
If -(InStr(arr(li, 1), sSubStr) > 0) <> lMet Then
Стало
Код
If (InStr(arr(li, 1), sSubStr) = 0 And lMet = 1) Or (InStr(arr(li, 1), sSubStr) > 0 And lMet = 0) Then

То что Вы написали, мне тоже придётся скармливать в чат GPT т.к. я слабоват в понимании кода и поиска потенциальных проблем

Работа макроса с вводом данных и выполнением на двух рабочих листах
 
МатросНаЗебре, Да, Вы правы! Сейчас отрабатывает без ошибок, правда удаляет всё, включая то, что нужно. То есть вычищает абсолютно все строки кроме тех что выше (заголовки строк). Но тут я попробую сам найти проблему. Где то видимо не правильно прописано с какой строчки начинать и какие совпадения искать
Изменено: prohor_9 - 17.12.2024 19:35:32
Работа макроса с вводом данных и выполнением на двух рабочих листах
 
МатросНаЗебре, Спасибо за попытку помочь) Сейчас покажу как в общем и целом стал выглядеть код
Код
Sub Большой_макрос_для_PI()
    Dim lCol&
    Dim lMet As Long
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    sSubStr = InputBox("Введите значение для поиска")
    If sSubStr = "" Then lMet = 0 Else lMet = 1
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "www.excel-vba.ru", 5))
    If lCol = 0 Then Exit Sub

    Call Для_удаления_на_листе("SKU", 3, lCol) ' указываем название листа и с какой строки удалять
    Call Для_удаления_на_листе("другой лист", 4, lCol) ' указываем название листа и с какой строки удалять

End Sub

Sub Для_удаления_на_листе(Sh$, N&, lCol As Long)
    Worksheets(Sh).Activate
    Dim lCol As Long      'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim arr
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    arr = Cells(1, lCol).Resize(lLastRow).Value
    Application.ScreenUpdating = 0
    Dim rr As Range
    For li = N To lLastRow 'цикл с третьей строки до конца
        If -(InStr(arr(li, 1), sSubStr) > 0) <> lMet Then
            If rr Is Nothing Then
                Set rr = Cells(li, 1)
            Else
                Set rr = Union(rr, Cells(li, 1))
            End If
        End If
    Next li
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub

Но при таком написании Excel жалуется на
Код
Sub Для_удаления_на_листе(Sh$, N&, lCol As Long)

И говорит что "duplicate declaration in current scope". Как я понял справку, у меня столкнулись две переменные с одинаковым именем + в одной процедуре.

P.S. Я понимаю что название "другой лист" нужно менять на реальное название листа, но это как будто не связано

Изменено: prohor_9 - 17.12.2024 14:03:35
Работа макроса с вводом данных и выполнением на двух рабочих листах
 
Пока не получилось, пойду искать причину. Дебаг жалуется на строчку (ниже) Проблема application defined object defined error
Код
arr = Cells(1, lCol).Resize(lLastRow).Value

Изменено: prohor_9 - 17.12.2024 12:36:18
Работа макроса с вводом данных и выполнением на двух рабочих листах
 
irabel

Спасибо, сейчас попробую понять и разобраться :)  
Работа макроса с вводом данных и выполнением на двух рабочих листах
 
Коллеги, модераторы, прокомментируйте, если я некорректно составил обращение. Правила я почитал, тема вроде бы не дубликат (либо я туповат и не нашёл). Видел что кто то вставляет макросы файлами - я пока так не умею.  
Работа макроса с вводом данных и выполнением на двух рабочих листах
 
Всем привет.

Решил зарегистрироваться так как только начинаю выяснять азы работы макросов VBA.
Вопрос такой. Есть два макроса, которые я запускаю по очереди на двух разных рабочих листах в одном Excel файле. Оба макроса идентичные, отличается только строка с которой начинается цикл проверки. На первом листе работа макроса подразумевает "поиск Х в колонке 2 и удаление всех Y Z H (и т.д)". На втором листе работа такая же, но идёт "поиск Х в колонке 3 и удаление всех Y Z H (и т.д.)".

Я нашёл простую формулу объединения двух макросов через макрос Call. Но в этом случае оба макроса по очереди просят "вводить значение Х и колонку".
Есть ли способ это нивелировать? Указать "один раз Х и колонку" и заставить макрос отработать оба листа? Условно как то сделать работу на Sheets 1 затем переключиться на Sheets 2 и повторить

Макрос 1 будет ниже:
Код
Sub Для_удаления_строчек_на_листе_Привет()
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long      'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim lMet As Long
    Dim arr
 
    sSubStr = InputBox("Введите значение для поиска")
    If sSubStr = "" Then lMet = 0 Else lMet = 1
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "www.excel-vba.ru", 5))
    If lCol = 0 Then Exit Sub
 
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    arr = Cells(1, lCol).Resize(lLastRow).Value
    Application.ScreenUpdating = 0
    Dim rr As Range
    For li = 4 To lLastRow 'цикл с четвёртой строки до конца
        If -(InStr(arr(li, 1), sSubStr) > 0) <> lMet Then
            If rr Is Nothing Then
                Set rr = Cells(li, 1)
            Else
                Set rr = Union(rr, Cells(li, 1))
            End If
        End If
    Next li
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub
   
Макрос 2 выглядит похожим образом, только цикл начинается с другой строки
Код
Sub Для_удаления_на_листе_SKU()
    Worksheets("SKU").Activate
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long      'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim lMet As Long
    Dim arr
 
    sSubStr = InputBox("Введите значение для поиска")
    If sSubStr = "" Then lMet = 0 Else lMet = 1
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "www.excel-vba.ru", 5))
    If lCol = 0 Then Exit Sub
 
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    arr = Cells(1, lCol).Resize(lLastRow).Value
    Application.ScreenUpdating = 0
    Dim rr As Range
    For li = 3 To lLastRow 'цикл с третьей строки до конца
        If -(InStr(arr(li, 1), sSubStr) > 0) <> lMet Then
            If rr Is Nothing Then
                Set rr = Cells(li, 1)
            Else
                Set rr = Union(rr, Cells(li, 1))
            End If
        End If
    Next li
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub
Страницы: 1
Наверх