Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2009, 21:23   #1
julius
Пользователь
 
Регистрация: 22.11.2009
Сообщений: 25
Вопрос Макрос для удаления строки

Здравствуйте!
Никогда не занимался написанием макросов, вот решил попробовать, но сразу столкнулся с проблемой.
Нужно написать макрос, который проверяет значение в определенной ячейке таблицы и, если это значение равно нулю, то удаляет текущую строку.
Вот то, до чего я пока смог дойти:

If Cells(11, b) = 0 Then \Если ячейка 11B=0
Rows("11:11").Delete Shift:=xlUp \То нужно удалить 11 строку
Else
End If
End Sub

Программа выдает ошибку "Application-defined or object-defined error".
Судя по всему ошибка в первой строке, только не могу понять какая.
Помогите, пожалуйста, кто знает.
Заранее благодарен.
julius вне форума Ответить с цитированием
Старый 22.11.2009, 21:35   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

R=11
If Cells(r, 2) = 0 Then 'Если ячейка 11B=0
' или так: if range("B" & R) = 0 then
Rows(r).Delete Shift:=xlUp 'То нужно удалить 11 строку
Else
r = r+1
End if
осталось только придумать когда это все остановить, потому что когда R выйдет за пределы таблицы, ячейка (R, 2) всегда будет = 0, собственно вся строка будет пустая, а этот код будет их удалять, удалять и удалять...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 22.11.2009, 21:51   #3
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Код:
Sub DelNulRows() 'удалит пустые СТРОКИ
With ThisWorkbook.Worksheets(1)
     For iRow& = 10 To 1 Step -1
         If IsEmpty(.Cells(iRow&, "A").Value) = True Then .Rows(iRow&).Delete
     Next
End With
End Sub
Значение iRow& = 10 взято для примера.
Кол-во строк можно подсчитать и поместить в переменную.
***
Вот так сделано в рабочем проекте
Код:
Sub DelNulRows()    
    With ThisWorkbook.Worksheets("СкладМаг")
        iost = [A9]
        For iRow& = iost + 10 To 1 Step -1
            iadress = Cells(iRow&, "X").Address(0, 0)
            If iadress = "X10" Then Exit Sub
            zn = .Cells(iRow&, "X")
            If zn = 0 Then .Rows(iRow&).Delete
        Next
    End With
End Sub
Здесь проверяются на 0 ячейки столбца Х и удаляется строка.
Для подстраховки проверяется авдрес ячейки и если адрес Х10 (заголовок таблицы) все заканчивается.
Скорее всего не самый оптимальный вариант, но работает.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499

Последний раз редактировалось VictorM; 22.11.2009 в 22:02.
VictorM вне форума Ответить с цитированием
Старый 22.11.2009, 22:27   #4
julius
Пользователь
 
Регистрация: 22.11.2009
Сообщений: 25
По умолчанию

Все спасибо! Теперь как надо работае. Буду усложнять алгоритм дальше.
julius вне форума Ответить с цитированием
Старый 23.11.2009, 13:54   #5
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Предлагаю такую заморочку, на случай если есть большое количество строк.
Собирает данные в "кучу" и стирает одним махом!
(подсказали тут на форуме).

Код:
Sub DELETE()  

Dim AllRows As Object, FirstCell As Object, FoundCell As Object

    Application.ScreenUpdating = False

    Set FirstCell = Columns("B").Find(what:=0, LookAt:=xlWhole)
    If FirstCell Is Nothing Then Exit Sub

    Set AllRows = Rows(FirstCell.Row)
    Set FoundCell = FirstCell

    Do
        Set FoundCell = Columns("B").FindNext(After:=FoundCell)
        Set AllRows = Union(Rows(FoundCell.Row), AllRows)
        If FoundCell.Address = FirstCell.Address Then Exit Do
    Loop
    AllRows.Delete
End Sub
Jungo must die!!! (C) Bill Gates.
jungo вне форума Ответить с цитированием
Старый 07.12.2010, 21:12   #6
vitaminius@mail.ru
Новичок
Джуниор
 
Регистрация: 07.12.2010
Сообщений: 2
По умолчанию нужен небольшой скрипт

товарищи помогите нужен макрос для excel'я
есть таблица 10 столбцов и дофига строк(2000-3000),
ну так вот из нее нужно удалить
строки в которых хотя-бы одна из десяти ячеек пустая
как обычно нужно еще вчера!!!
в макросах практически как свинья в апельсинах.....
заранее спасибо
vitaminius@mail.ru вне форума Ответить с цитированием
Старый 07.12.2010, 22:41   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Схематично так - без определения последней строки, чтоб легче понять:

Код:
Sub tt()
Dim i As Long
For i = 3000 To 1 Step -1
If Application.CountBlank(Range(Cells(i, 1), Cells(i, 10))) > 0 Then Rows(i).Delete
Next
End Sub
определение последней строки (по первой колонке):
Код:
Dim iLastRow As Long, i As Long
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = iLastRow To 1 Step -1
...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 07.12.2010 в 22:47.
Hugo121 вне форума Ответить с цитированием
Старый 07.12.2010, 22:44   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub DelBlank()
  Dim r As Long, c As Long
  For r = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
    For c = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
      If Cells(r, c) = "" Then Rows(r).Delete: Exit For
    Next
  Next
End Sub
теперь у Вас есть две процедуры
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 08.12.2010 в 00:05.
IgorGO вне форума Ответить с цитированием
Старый 07.12.2010, 23:22   #9
vitaminius@mail.ru
Новичок
Джуниор
 
Регистрация: 07.12.2010
Сообщений: 2
По умолчанию

Спасибо Огромное! Все Отлично работает!!!! то что надо!!!
vitaminius@mail.ru вне форума Ответить с цитированием
Старый 10.12.2010, 16:04   #10
leech
 
Регистрация: 25.11.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от jungo Посмотреть сообщение
Предлагаю такую заморочку, на случай если есть большое количество строк.
Собирает данные в "кучу" и стирает одним махом!
(подсказали тут на форуме).

Код:
Sub DELETE()  

Dim AllRows As Object, FirstCell As Object, FoundCell As Object

    Application.ScreenUpdating = False

    Set FirstCell = Columns("B").Find(what:=0, LookAt:=xlWhole)
    If FirstCell Is Nothing Then Exit Sub

    Set AllRows = Rows(FirstCell.Row)
    Set FoundCell = FirstCell

    Do
        Set FoundCell = Columns("B").FindNext(After:=FoundCell)
        Set AllRows = Union(Rows(FoundCell.Row), AllRows)
        If FoundCell.Address = FirstCell.Address Then Exit Do
    Loop
    AllRows.Delete
End Sub
может кто нибудь помочь переварить это все?
задача такая - надо удалить несколько строк. Циклом - скучно, нудно и главное долго. А вот оптом их удалять никак не получается
(т.е. нужен аналог удаления
Rows("A:L").Delete
где вместо явного указания строк используются переменные)
leech вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Macros для нахождения и удаления слов конгер Microsoft Office Word 1 13.10.2009 18:14
скрипт для удаления Cookies mahnograd Софт 10 18.09.2009 08:53
отмена удаления строки: вопрос Evgenii БД в Delphi 1 19.06.2009 01:43
Программа для удаления AutoRun вирусов pomoshnic Помощь студентам 1 01.04.2009 04:57
Нужна программа для удаления содержимого папки DNK1980 Фриланс 6 11.02.2008 16:52