powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Найти и удалить строку
25 сообщений из 25, страница 1 из 1
Найти и удалить строку
    #37096041
Zerat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!

Подскажите пожалуйста, что не так в коде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub УдалениеСтрок()
Application.ScreenUpdating = False
Dim s As Range
  
    Set s = Columns("B:B").Find(What:="песок", LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False)
    If s Is Nothing Then
        Do
           Rows(s.Row).Delete
        Loop While s Is Nothing
    End If
End Sub

Мне нужно удалить все строки, если в ячейках столбца B не содержится слово "песок". (Т.е. чтобы оставлял такие строки как "песок строительный", "используется кварцевый песок", а все остальные удалил)
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096143
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeratчто не так в коде
то, что вы ищете, где песок, а надо искать, где нет песка
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096148
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто переберите нужные ячейки, проверяя функцией InStr наличие ключевого слова.
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096223
Zerat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProZeratчто не так в коде
то, что вы ищете, где песок, а надо искать, где нет песка

Ну да, я ищу ячейки, где есть песок, и если в ячейке нет песка, то удаляю строку, если есть то пропускаю. Именно так я хотел бы сделать. Но код не работает.
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096224
Zerat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПросто переберите нужные ячейки, проверяя функцией InStr наличие ключевого слова.

Хотелось бы для начала попробовать поиском. Если не получится буду пробовать функцией InStr.
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096231
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeratНу да, я ищу ячейки, где есть песок, и если в ячейке нет песка , то удаляю строку, если есть то пропускаю. Именно так я хотел бы сделать. Но код не работает.
код работает
именно так как написан

вы не видите противоречия в выделенном????
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096287
Zerat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProZeratНу да, я ищу ячейки, где есть песок, и если в ячейке нет песка , то удаляю строку, если есть то пропускаю. Именно так я хотел бы сделать. Но код не работает.
код работает
именно так как написан

вы не видите противоречия в выделенном????

Тогда подскажите как подправить код, чтобы заработал. Или это невозможно с помощью этого метода?
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096329
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeratТогда подскажите как подправить код, чтобы заработал. Или это невозможно с помощью этого метода?
я не знаю, возможно ли в более старших версиях экселя делать поиск по НЕвхождению подстроки в строку, у меня под рукой только 2000-й, тут такой возможности нет.
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096492
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zerat,

с помощью этого метода - нельзя.
Можно создать столбец и в нем через формулы выставлять признак наличия или отсуствия искомого значения в строке. Потом можно будет искать по стообцу.
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096880
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно попробовать так, если в колонке 2 используется Validation,то можно использовать закомментированные строки с FormatConditions

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Sub A_не_удалить_ли_НЕпесок()
Dim RMinusR As Range, WP As Range, WM As Range, FlagHi As Boolean
  If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
  Columns("B:B").AutoFilter Field:= 1 , Criteria1:="=*песок*", Operator:=xlAnd
  Set WP = Columns( 2 ): FlagHi = WP.Hidden: WP.Hidden = False
  Set WM = WP.SpecialCells(xlCellTypeVisible).EntireRow

'  WP.FormatConditions.Delete: Call WP.FormatConditions.Add(xlCellValue, xlEqual, 1): WM.FormatConditions.Delete
'  On Error Resume Next
'    Set RMinusR = WP.SpecialCells(xlCellTypeAllFormatConditions).EntireRow
'  On Error GoTo 0

  WP.Validation.Delete: WP.Validation.Add Type:=xlValidateInputOnly: WM.Validation.Delete
  On Error Resume Next
    Set RMinusR = WP.SpecialCells(xlCellTypeAllValidation).EntireRow
  On Error GoTo  0 

  If Not RMinusR Is Nothing Then RMinusR.Delete
  Columns( 2 ).Validation.Delete: Columns( 2 ).Hidden = FlagHi: Application.EnableEvents = True
  If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
End Sub
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37096928
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может, не "код не работал", а "код работал не совсем верно"?
и чем InStr() не нравится?
Код: plaintext
1.
2.
3.
4.
5.
Set s=Columns("B:B").UsedRange
i=s.Rows.Count
While i> 0 
 If InStr(s.Cells(i, 1 ),"песок")= 0  Then s.Rows(i).EntireRow.Delete
Wend
Set s=Nothing
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097035
LKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LKO
Гость
С технической точки зрения "не так" в Вашем коде следующее:
Код: plaintext
1.
2.
3.
4.
5.
    If s Is Nothing Then
        Do
           Rows(s.Row).Delete
        Loop While s Is Nothing
    End If

Вы пытаетесь удалять строки внутри диапазона, использую пустую ссылку на диапазон.

Для Вашей задачи поиск вхождений не эффективен, Вам всеравно придется перебирать строки в цикле, что бы найти строку, не попавшую в диапазон найденых. Лучше (на мой взгляд) вобще отказаться от поиска и просто перебрать строки в цикле с проверкой наличия подстроки в ключевом столбце (в Вашем случае "B"). Тут вполне подходит InStr.
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097095
LKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LKO
Гость
AndreTMА может, не "код не работал", а "код работал не совсем верно"?
и чем InStr() не нравится?
Код: plaintext
1.
2.
3.
4.
5.
Set s=Columns("B:B").UsedRange
i=s.Rows.Count
While i> 0 
 If InStr(s.Cells(i, 1 ),"песок")= 0  Then s.Rows(i).EntireRow.Delete
Wend
Set s=Nothing


Ваш код - бесконечный цикл, т.к. i не меняется в ходе цикла. Если повезте так, что в последней строке использованного диапазона будет строка с наличием слова "песок", то не будет удалена ни одна строка, если в последней строке не будет песка, то будет удаляться строка с номером i до бесконечности
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097763
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LKO,
вообще-то с файнд может и лучше :)

ищем первое вхождение песка, удаляем все строки до него, запоминаем строку, ищем дальше, удаляем строки от запомненной до найденной..

быстрее может быть, чем по одной удалять..
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097820
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_,

не надо запоминать, надо строить Range под удаление
Application.Union
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097832
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-duke,
не надо union - он тормозит :)

надо именно как я сказал :)
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097875
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: big-duke
> Application.Union


Может не пойти, я как-то эксперементировал и натолкнулся что там есть ограничение, то ли на количество унионов(255
штук), то ли на длину строки(255 символов) в которой хранятся адреса Range'ей

Короче мы пошли старым путём :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097905
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносМожет не пойти, я как-то эксперементировал и натолкнулся что там есть ограничение, то ли на количество унионов(255
штук), то ли на длину строки(255 символов) в которой хранятся адреса Range'ей
Да-да, в VB даже топик был на эту тему, решали-решали задачу, в итоге наткнулись на ограничение для .Address

Но если просто объединять строки, то есть это не будет несколько несвязанных диапазонов, то Addess
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097908
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.... Address расти не будет

Ctrl+Enter - зло
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097912
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет..... Если Дюк имел ввиду именно сбор всех строк, а потом удаление за один раз - тогда таки-да можно упереться в ограничение.
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097982
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

так это помимо.. а оно еще и тормозит...
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37097990
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_,

ну, кстати, не обязательно при этом файнд, можно и перебирать в массиве, тока не удалять, пока не наберется..
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37098003
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверить видно не судьба.
Длина адреса действительно ограничена в 255 символов, но нам для удаления адрес особо не нужен.
Вот тестовый код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Public Sub b()
Dim r As Range, u As Range
Set u = Range("C1")

For i =  1  To  10000  Step  2 
    Set u = Union(u, Range("A" & i))
    Debug.Print i
Next i
End Sub
На строке 2843 excel замер на пару минут, потом очухался и пошел дальше.
u.Areas.Count = 5001
u.select - выделяет то что нужно
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37099020
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LKOВаш код - бесконечный цикл, т.к. i не меняется в ходе цикла.Извиняюсь, забыл
Выдавал прямо в форум, без тестирования
Ну, кто меня знает, - уже наверняка сочли за feature in code...
...
Рейтинг: 0 / 0
Найти и удалить строку
    #37099248
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMНу, кто меня знает, - уже наверняка сочли за feature in code...

Эх, блин, была мысль сказать "AndreTM не ошибается, AndreTM дает возможность подумать автору"... но промолчал чего-то
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Найти и удалить строку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]