Добрый день! Хотел вот узнать. Возможно ли в переменную как-то увязать условие (> < или =) Например [vba]
Код
Sub Удаление_строки_по_условию() Dim range1 As Range Dim i As Long, kol As Long, Stolbec As Long Dim perech As String Dim NameStolbec() As String Dim Uclovie As String
Stolbec = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1")
i_n = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To i_n If Cells(i, Stolbec) & Uclovie Then Application.ScreenUpdating = False Rows(i).Delete kol = kol + 1 Application.ScreenUpdating = True End If Next MsgBox ("Удалено " & kol & " столбцов") End Sub
[/vba] Вот в строке "If Cells(i, Stolbec) & Uclovie Then" как-нибудь правильно это описать можно? чтобы вместо переменной подставлялось само условие...?
Добрый день! Хотел вот узнать. Возможно ли в переменную как-то увязать условие (> < или =) Например [vba]
Код
Sub Удаление_строки_по_условию() Dim range1 As Range Dim i As Long, kol As Long, Stolbec As Long Dim perech As String Dim NameStolbec() As String Dim Uclovie As String
Stolbec = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1")
i_n = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To i_n If Cells(i, Stolbec) & Uclovie Then Application.ScreenUpdating = False Rows(i).Delete kol = kol + 1 Application.ScreenUpdating = True End If Next MsgBox ("Удалено " & kol & " столбцов") End Sub
[/vba] Вот в строке "If Cells(i, Stolbec) & Uclovie Then" как-нибудь правильно это описать можно? чтобы вместо переменной подставлялось само условие...?Roman777
Sub Удаление_строки_по_условию() Dim i As Long, kol As Long, Stolbec As Long Dim Uclovie As String, i_n& Stolbec = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1") i_n = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = i_n To 1 Step -1 If Evaluate(Cells(i, Stolbec) & Uclovie) Then Rows(i).Delete kol = kol + 1 End If Next Application.ScreenUpdating = True MsgBox ("Удалено " & kol & " строк") End Sub
[/vba]
[vba]
Код
Sub Удаление_строки_по_условию() Dim i As Long, kol As Long, Stolbec As Long Dim Uclovie As String, i_n& Stolbec = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1") i_n = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = i_n To 1 Step -1 If Evaluate(Cells(i, Stolbec) & Uclovie) Then Rows(i).Delete kol = kol + 1 End If Next Application.ScreenUpdating = True MsgBox ("Удалено " & kol & " строк") End Sub
Roman777, но учти, что если в указанном столбце есть пустые ячейки, то эти строки тоже будут удалены!
а избежать этого можно, например так:
[vba]
Код
' если в таблице только числа и пустые ячейки, то можно так: ' (но все равно остается оч. много ограничений на условие... ' например, условие: ="" не сработает НИКОГДА, условие <>"" удалит ВСЕ(!) строки, ' а условие: =0 удалит строки не только с ячейками =0, но и с пустыми ячейками) Sub Удаление_строки_по_условию() Dim i As Long, kol As Long, Stolbec As Long Dim Uclovie As String, i_n& Stolbec = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1") i_n = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = i_n To 1 Step -1 If Evaluate((Cells(i, Stolbec) * 1) & Uclovie) Then Rows(i).Delete kol = kol + 1 End If Next Application.ScreenUpdating = True MsgBox ("Удалено " & kol & " строк") End Sub
[/vba]
а с такой доработкой макрос должен корректно обработать почти все условия, даже, если нужно, такое "нестандартное", как: !=
[vba]
Код
' если в таблице может быть и текст (тем более с пробелами), то нужно так: ' (в качестве условия можно задать и поиск пустой строки, ' т.е. корректно обработаются такие условия, как: ="" ; <>"" ; >=1 ; <="1" ; =какой-то текст ; ="какой-то текст" ; и т.д., ' а также, если первый символ условия не >, < или =, то введенное значение будет заключено в кавычки, ' а перед ними будет добавлен символ =, например, если введено слово: доллар, то оно будет преобразовано в: ="доллар", ' а если нужно разрешить вводить не только <>, но и !=, то необходимо раскомментировать соответствующую строчку, см. ниже) Sub Удаление_строки_по_условию() Dim i As Long, i_n As Long, kol As Long, Stolbec As Long Dim Uclovie As String
Uclovie = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") ' если, вдруг, пользователь передумал и нажал "Отмена", или очистил поле и нажал "ОК", ' то не выполняем никаких действий If Len(Uclovie) Then ' если пользователь ввел не число If IsNumeric(Uclovie) Then Stolbec = Uclovie Else MsgBox "Введенное значение не является числом!", vbExclamation, ThisWorkbook.Name Exit Sub End If
Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1") If Len(Uclovie) Then ' если нужно разрешить вводить не только <>, но и !=, то необходимо раскомментировать следующую строчку 'Uclovie = Replace(Uclovie, "!=", "<>") Do While InStr("<=>", Mid$(Uclovie, i + 1, 1)) i = i + 1 Loop If i = 0 Then i = 1 Uclovie = "=" & Uclovie End If ' если правая часть условия не в кавычках, ' то заключаем ее в кавычки If Mid$(Uclovie, i + 1, 1) <> """" Then Uclovie = Left$(Uclovie, i) & """" & Mid$(Uclovie, i + 1) & """" End If
i_n = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = i_n To 1 Step -1 If Evaluate("""" & Cells(i, Stolbec) & """" & Uclovie) Then Rows(i).Delete kol = kol + 1 End If Next Application.ScreenUpdating = True MsgBox ("Удалено " & kol & " строк") End If End If End Sub
[/vba]
перед использованием, желательно проверить ВСЕ возможные условия! [p.s.]при желании, можно добавить проверку "от дурака", чтобы запретить ввод неправильных условий, типа: ==, ><, =>, <==, и т.д.
Roman777, но учти, что если в указанном столбце есть пустые ячейки, то эти строки тоже будут удалены!
а избежать этого можно, например так:
[vba]
Код
' если в таблице только числа и пустые ячейки, то можно так: ' (но все равно остается оч. много ограничений на условие... ' например, условие: ="" не сработает НИКОГДА, условие <>"" удалит ВСЕ(!) строки, ' а условие: =0 удалит строки не только с ячейками =0, но и с пустыми ячейками) Sub Удаление_строки_по_условию() Dim i As Long, kol As Long, Stolbec As Long Dim Uclovie As String, i_n& Stolbec = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1") i_n = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = i_n To 1 Step -1 If Evaluate((Cells(i, Stolbec) * 1) & Uclovie) Then Rows(i).Delete kol = kol + 1 End If Next Application.ScreenUpdating = True MsgBox ("Удалено " & kol & " строк") End Sub
[/vba]
а с такой доработкой макрос должен корректно обработать почти все условия, даже, если нужно, такое "нестандартное", как: !=
[vba]
Код
' если в таблице может быть и текст (тем более с пробелами), то нужно так: ' (в качестве условия можно задать и поиск пустой строки, ' т.е. корректно обработаются такие условия, как: ="" ; <>"" ; >=1 ; <="1" ; =какой-то текст ; ="какой-то текст" ; и т.д., ' а также, если первый символ условия не >, < или =, то введенное значение будет заключено в кавычки, ' а перед ними будет добавлен символ =, например, если введено слово: доллар, то оно будет преобразовано в: ="доллар", ' а если нужно разрешить вводить не только <>, но и !=, то необходимо раскомментировать соответствующую строчку, см. ниже) Sub Удаление_строки_по_условию() Dim i As Long, i_n As Long, kol As Long, Stolbec As Long Dim Uclovie As String
Uclovie = InputBox("Укажите номер столбца, в котором будем искать условие", "Номер столбца", "1") ' если, вдруг, пользователь передумал и нажал "Отмена", или очистил поле и нажал "ОК", ' то не выполняем никаких действий If Len(Uclovie) Then ' если пользователь ввел не число If IsNumeric(Uclovie) Then Stolbec = Uclovie Else MsgBox "Введенное значение не является числом!", vbExclamation, ThisWorkbook.Name Exit Sub End If
Uclovie = InputBox("Укажите, выражение, согласно которому будем удалять строки", "Условие", "=1") If Len(Uclovie) Then ' если нужно разрешить вводить не только <>, но и !=, то необходимо раскомментировать следующую строчку 'Uclovie = Replace(Uclovie, "!=", "<>") Do While InStr("<=>", Mid$(Uclovie, i + 1, 1)) i = i + 1 Loop If i = 0 Then i = 1 Uclovie = "=" & Uclovie End If ' если правая часть условия не в кавычках, ' то заключаем ее в кавычки If Mid$(Uclovie, i + 1, 1) <> """" Then Uclovie = Left$(Uclovie, i) & """" & Mid$(Uclovie, i + 1) & """" End If
i_n = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = i_n To 1 Step -1 If Evaluate("""" & Cells(i, Stolbec) & """" & Uclovie) Then Rows(i).Delete kol = kol + 1 End If Next Application.ScreenUpdating = True MsgBox ("Удалено " & kol & " строк") End If End If End Sub
[/vba]
перед использованием, желательно проверить ВСЕ возможные условия! [p.s.]при желании, можно добавить проверку "от дурака", чтобы запретить ввод неправильных условий, типа: ==, ><, =>, <==, и т.д.KSV
KSV, Спасибо! Оч широко раскрыли детали))). Подскажите, а что это за условие такое "!="? И ещё, в выражении: "If Evaluate((Cells(i, Stolbec) * 1) & Uclovie) Then" при "" значениях в столбце, будет ""*1. Разве это не будет ошибкой?
KSV, Спасибо! Оч широко раскрыли детали))). Подскажите, а что это за условие такое "!="? И ещё, в выражении: "If Evaluate((Cells(i, Stolbec) * 1) & Uclovie) Then" при "" значениях в столбце, будет ""*1. Разве это не будет ошибкой?Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Среда, 25.03.2015, 09:01
при "" значениях в столбце, будет ""*1. Разве это не будет ошибкой?
нет. интерпретатор VBA довольно лояльно относится к несоответствию типов подобного рода, и перед выполнением, выражение ""*1 будет преобразовано в 0*1, что в результате даст 0, именно поэтому:
при "" значениях в столбце, будет ""*1. Разве это не будет ошибкой?
нет. интерпретатор VBA довольно лояльно относится к несоответствию типов подобного рода, и перед выполнением, выражение ""*1 будет преобразовано в 0*1, что в результате даст 0, именно поэтому: