Excel макрос очистки ячеек по условию

 

Oligarch

Пользователь

Сообщений: 34
Регистрация: 17.06.2015

#1

17.06.2015 13:31:11

Здравствуйте. Нужно, чтобы при выборе определённого значения в ячейке А1, содержимое ячеек B1 и C1 удалялось. Подскажите, пожалуйста, с помощью какого макроса можно ето реализовать. Пробовал так:

Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
  If Range("A1") = "ERASE" Then
  Range("B1,C1").ClearContents
  Application.EnableEvents = True
  End If
End Sub

Срабатывает один раз. При вводе нужного значения в ячейку A1, контент очищается. После смены значения на другое и повторном выборе нужного ничего не происходит. Подскажите, пожалуйста, где ошибка…

Прикрепленные файлы

  • Книга1.xlsm (14.1 КБ)

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

То есть вы хотите, чтобы когда в A1 не «ERASE», то вернулись старые значения? Тогда вам надо запоминать эти значения где-нибудь и возвращать когда не «ERASE». Ж)

Изменено: Johny17.06.2015 13:35:55

There is no knowledge that is not power

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#3

17.06.2015 13:50:28

Цитата
Oligarch написал:
После смены значения на другое и повторном выборе нужного ничего не происходит

А что должно произойти?

 

Екселист

Пользователь

Сообщений: 83
Регистрация: 16.06.2015

#4

17.06.2015 14:31:18

Так?

Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
  If Range("A1") = "ERASE" Then
  Range("B1,C1").ClearContents
  Application.EnableEvents = True
  End If
  Next 
End Sub

Изменено: Екселист17.06.2015 14:32:19

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Екселист, Вы свой код пробовали в деле? Чем он отличается от кода, показанного в стартовом сообщении? Разве, что только тем, что там есть строка Next? Зачем она?

 

Екселист

Пользователь

Сообщений: 83
Регистрация: 16.06.2015

#6

17.06.2015 15:44:37

Цитата
Юрий М написал: Зачем она?

Насколько я понял, юзеру нужно, чтобы при смене значения в ячейке A1 с нужного на другое, а потом обратно, содержимое ячеек B1 и C1 удалялось. А оно удаляется, только при ПЕРВИЧНОМ вводе нужного значения. Если так, то у меня мой вариант кода работает.

Изменено: Екселист19.06.2015 16:09:55

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#7

17.06.2015 15:48:59

Цитата
Екселист написал: мой вариант кода работает.

Это вряд-ли. Невооруженным глазом видно что Next без For, аесли его убрать, то он идентичен коду ТС  :)

Согласие есть продукт при полном непротивлении сторон.

 

Екселист

Пользователь

Сообщений: 83
Регистрация: 16.06.2015

Ну значит я ошибся, так как не силён в макросах.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#9

17.06.2015 15:51:02

Цитата
Екселист написал: мой вариант кода работает.

Чем он отличается от авторского?

 

Екселист

Пользователь

Сообщений: 83
Регистрация: 16.06.2015

Юрий М,
Процедурой Next . Но повторяю я ошибся.

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#11

17.06.2015 15:54:24

Цитата
Oligarch написал: После смены значения на другое и повторном выборе нужного ничего не происходит

Потому что Application.EnableEvents = True надо вынести из условия. Ведь Application.EnableEvents = False у Вас срабатывает при любом изменении ячейки, а возвращается-то только если условие выполняется…Т.е. корректнее так:

Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Range("A1") = "ERASE" Then
        Range("B1,C1").ClearContents
    End If
    Application.EnableEvents = True
End Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#12

17.06.2015 15:56:22

Цитата
Екселист написал: повторяю я ошибся.

Ещё раз: зачем повторять уже имеющийся код?

 

Екселист

Пользователь

Сообщений: 83
Регистрация: 16.06.2015

#13

17.06.2015 16:03:45

Юрий М,
Та я пытался допилить его. The_Prist,  тоже повторил

Цитата
Юрий М написал: уже имеющийся код

но по-другому чем я, и без ошибок.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#14

17.06.2015 18:14:44

Цитата
Екселист написал:
Та я пытался допилить его

И как же Вы его допилили? Вы просто его скопировали!

 

Екселист

Пользователь

Сообщений: 83
Регистрация: 16.06.2015

Юрий М,
Ну я Next  вставил — думал это решит проблему. Говорю же — ошибся.

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#16

17.06.2015 20:47:16

Да хватит уже выяснять. Автор появится и все расскажет.

Скрытый текст

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Oligarch

Пользователь

Сообщений: 34
Регистрация: 17.06.2015

#17

17.06.2015 21:17:00

Цитата
Екселист написал:
Насколько я понял, юзеру нужно, чтобы при смене значения в ячейке A1 с нужного на другое, а потом обратно, содержимое ячеек B1 и C1 удалялось. А оно удаляется, только при ПЕРВИЧНОМ вводе нужного значения. Если так, то у меня мой вариант кода работает.

Да. Вы правы. Но вариант кода с Next не работает.  

 

Екселист

Пользователь

Сообщений: 83
Регистрация: 16.06.2015

 

Oligarch

Пользователь

Сообщений: 34
Регистрация: 17.06.2015

#19

17.06.2015 21:24:51

Цитата
The_Prist написал: Потому что Application.EnableEvents = True надо вынести из условия.

Большое спасибо! То что нужно…
Еще один вопрос. Можно ли сделать так, чтобы значение ячейки D1 до выполнения команды  ClearContents додавалось к значению E1?

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#20

17.06.2015 21:31:07

Додавалось…Прикольно, надо запомнить :)

Код
Range("E1").value = Range("E1").value & Range("D1").value

это если под «додавалось» подразумевается сцепление данных, а не их суммирование. Если суммирование:

Код
Range("E1").value = Range("E1").value + Range("D1").value

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Oligarch

Пользователь

Сообщений: 34
Регистрация: 17.06.2015

The_Prist, Имелось ввиду — суммировать)))). Ещё раз спасибо и последний вопрос. В ячейке D1 находится формула, которая состоит из нескольких переменных. Нужно сделать так, чтобы excel предложил ( например, в сплывающем окошке) внести (подкорректировать) значение одной из переменных, а уже потом выполнялась команда суммирования.  

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#22

17.06.2015 22:35:15

Цитата
Oligarch написал: и последний вопрос

Уважайте правила форума. Конкретно — п.2.6. Перечитайте, вникните.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

5 / 5 / 0

Регистрация: 02.01.2017

Сообщений: 164

1

Нужен макрос для удаления значений в ячейках по условию

02.03.2017, 22:57. Показов 26092. Ответов 9


Студворк — интернет-сервис помощи студентам

Ребята каким можно макросом удалять значения определённых ячеек .Задача макроса ,в ячейках в каждой из строк начиная с 28 строки столбца I ,промониторить выполняется ли условия чтобы если в ячейке значение меньше 2,00 то в этой строке будут стерты значения в ячейках C28 D28 E28 M28 N28 O28 P28 и так по всем ниже расположенным строкам без ограничения.Если условие в строке выполняется то значения в ячейках столбцов C,D,E,M,N,O,P это же строки будут удалены.Значения во всех этих ячейках введены используя выпадающий список.



0



smeckoi77

61 / 60 / 16

Регистрация: 13.02.2017

Сообщений: 172

03.03.2017, 00:47

2

Лучший ответ Сообщение было отмечено Aleks 1978 как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub макрос()
 
For i = 28 To Range("A" & Rows.Count).End(xlUp).Row
    If Range("A" & i) < 2 Then
    Range("C" & i).ClearContents
    Range("D" & i).ClearContents
    Range("E" & i).ClearContents
    Range("M" & i).ClearContents
    Range("N" & i).ClearContents
    Range("O" & i).ClearContents
    Range("P" & i).ClearContents
    End If
Next i
 
End Sub



1



5 / 5 / 0

Регистрация: 02.01.2017

Сообщений: 164

03.03.2017, 03:03

 [ТС]

3

А можно пожалуйста ещё одно условие добавить в этот макрос ,к тому что в «A» ячейка < 2 .и ещё если в столбце «H» этой же строки ячейка имеет значение текст «ДА» то ‘макрос срабатывает на удаление значений в ячейках столбцов C,D,E,M,N,O,P.



0



k61

85 / 82 / 31

Регистрация: 13.10.2014

Сообщений: 167

03.03.2017, 05:46

4

Лучший ответ Сообщение было отмечено Aleks 1978 как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub макрос_1()
For Each x In Range(Cells(28, 9), Cells(Cells(Rows.Count, 9).End(xlUp).Row, 9))
Set rrr = Union(Range(x.Offset(, -6), x.Offset(, -4)), Range(x.Offset(, 4), x.Offset(, 7)))
  If x < 2 Then
    If x.Offset(, -8) < 2 Then
      If x.Offset(, 11) = "ДА" Then rrr.ClearContents
    End If
  End If
Set rrr = Nothing
Next x
End Sub



1



Aleks 1978

5 / 5 / 0

Регистрация: 02.01.2017

Сообщений: 164

03.03.2017, 06:20

 [ТС]

5

А как можно вот этот вариант кода с одним условием,закрепив его выполнение за кнопкой на Листе 9 ,чтобы он смог сделать свои вычисления с данными находящимися на Листе3 ?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub макрос()
 
For i = 28 To Range("A" & Rows.Count).End(xlUp).Row
    If Range("A" & i) < 2 Then
    Range("C" & i).ClearContents
    Range("D" & i).ClearContents
    Range("E" & i).ClearContents
    Range("M" & i).ClearContents
    Range("N" & i).ClearContents
    Range("O" & i).ClearContents
    Range("P" & i).ClearContents
    End If
Next i
 
End Sub



0



smeckoi77

61 / 60 / 16

Регистрация: 13.02.2017

Сообщений: 172

03.03.2017, 08:22

6

Лучший ответ Сообщение было отмечено Aleks 1978 как решение

Решение

Перед словом Range везде дописать Sheets(«Лист3»).

Visual Basic
1
Sheets("Лист3").Range("A" & i)

Добавлено через 3 минуты
добавить условие в строку

Visual Basic
1
If Range("A" & i) < 2 And Range("H" & i) = "ДА" Then



1



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

03.03.2017, 09:35

7

Лучший ответ Сообщение было отмечено Aleks 1978 как решение

Решение

Visual Basic
1
2
3
4
5
Range("C" & i).ClearContents
Range("D" & i).ClearContents
Range("E" & i).ClearContents
вариант в одну строчку
Range("C" & i).Resize(1,3).ClearContents



1



Aleks 1978

5 / 5 / 0

Регистрация: 02.01.2017

Сообщений: 164

05.03.2017, 20:36

 [ТС]

8

Добавил в макрос второе условие,которые будут в столбце A отбирать на удаление только значения меньше 1,50 и больше 1,70.Вопрос в чём ошибка строки в коде? а то макрос не работает.

Visual Basic
1
  If Range("A" & i) <  1,50  And Range("A" & i)  >  1,70 Then
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Макрос ()
 
For i = 28 To Range("A" & Rows.Count).End(xlUp).Row
    If Range("A" & i) <  1,50  And Range("A" & i)  >  1,70 Then
    Range("C" & i).ClearContents
    Range("D" & i).ClearContents
    Range("E" & i).ClearContents
    Range("M" & i).ClearContents
    Range("N" & i).ClearContents
    Range("O" & i).ClearContents
    Range("P" & i).ClearContents
    End If
Next i
 End Sub



0



smeckoi77

61 / 60 / 16

Регистрация: 13.02.2017

Сообщений: 172

05.03.2017, 20:45

9

Число не может быть меньше 1,5 и больше 1,7 одновременно.

Добавлено через 4 минуты
значения меньше 1,50 ИЛИ больше 1,70

Добавлено через 40 секунд

Visual Basic
1
If Range("A" & i) <  1,50  Or Range("A" & i)  >  1,70 Then



1



5 / 5 / 0

Регистрация: 02.01.2017

Сообщений: 164

05.03.2017, 21:28

 [ТС]

10

Благодарю за помощь!Работает теперь



0



Метод Range.Clear для полной очистки диапазона ячеек из кода VBA Excel. Методы очистки отдельных свойств и их групп в ячейках. Примеры использования.

Методы очистки ячеек

Метод Очищаемые свойства Примечание
Range.Clear Почти все свойства Ширина и высота ячеек не изменяются
Range.ClearComments Комментарии Для Excel в составе Office 365
Range.ClearContents Формулы и значения Исходное форматирование сохраняется
Range.ClearFormats Свойства, задающие форматы В том числе отмена объединения ячеек
Range.ClearHyperlinks Гиперссылки Текст и форматирование сохраняются
Range.ClearNotes Примечания и заметки Примечания – для локальных программ Excel, заметки – для Excel в составе Office 365
Range.ClearOutline Структура данных Смотрите, что такое структурирование данных

Range – выражение, возвращающее диапазон ячеек.

Примеры использования

1. Удаление гиперссылки из ячейки A1
Cells(1, 1).ClearHyperlinks

2. Очистка диапазона A1:L50 от формул и значений
Range("A1:L50").ClearContents

3. Очистка всех свойств ячеек в столбцах A:K
Columns("A:K").Clear

4. Очистка форматирования ячеек в строках 1:20
Rows("1:20").ClearFormats

Методы очистки диапазонов ячеек в VBA Excel возвращают очищаемые свойства ячеек к значениям по умолчанию. К таким, как на вновь созданном стандартном рабочем листе. При любых методах очистки высота строк и ширина столбцов не изменяются.


Фразы для контекстного поиска: очистка ячеек, очистка ячейки, очистка формул, очистка от формул, удаление формул, очистка значений, удаление значений, очистка форматов, удаление форматирования, удаление форматов.


Иногда вам может потребоваться очистить содержимое ячейки на основе условий в Excel, например очистка содержимого ячейки, если ячейка содержит определенное значение, очистка содержимого ячейки, если в другом столбце есть пустые ячейки, или очистка содержимого ячейки с определенным цветом фона и т. д. , Эта статья познакомит вас с некоторыми приемами для быстрого и легкого решения этих задач.

Очистить содержимое ячейки на основе значения ячейки с кодом VBA

Очистить целые строки, если значение больше или меньше определенного значения с кодом VBA

Очистить содержимое ячейки или строки на основе значения ячейки с помощью удобной функции

Очистить целые строки, если другая ячейка пуста с кодом VBA

Очистить содержимое ячейки на основе цвета фона с помощью кода VBA


Очистить содержимое ячейки на основе значения ячейки с кодом VBA

Например, у вас есть следующий диапазон данных, теперь вы хотите очистить содержимое ячейки «Толстовка», приведенный ниже код VBA может оказать вам услугу.

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модулии вставьте следующий код в окно модуля.

Код VBA: очистить содержимое ячейки, если ячейка равна определенному значению

Sub ClearContents()
'Updateby ExtendOffice
 Dim xRng As Range
 Dim xCell As Range
 Dim xText As String
 Set xRng = Application.Range("A2:A12")
 xText = "Hoodie" 'Change this text to your own
 For Each xCell In xRng
 If xCell.Value = xText Then
 xCell.clearContents
 End If
 Next xCell
End Sub

Внимание: В приведенном выше коде A2: A12 это диапазон данных, из которого вы хотите очистить содержимое ячейки, текст «Толстовка с капюшоном” — это конкретное значение, которое вы хотите очистить. Пожалуйста, измените их на свои.

3, Затем нажмите F5 key для запуска этого кода, и все ячейки с текстом «Толстовка» сразу очищаются, см. скриншот:


Очистить целые строки, если значение больше или меньше определенного значения с кодом VBA

Предположим, у вас есть приведенный ниже диапазон данных, чтобы очистить все содержимое строки, если значение в столбце D больше или меньше 300. Здесь я создам код VBA для его завершения.

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модулии вставьте следующий код в окно модуля.

Код VBA: очистить целые строки, если значение ячейки больше или меньше определенного значения

Sub ClearRowInValue()
'Updateby ExtendOffice
Dim xRg As Range
Dim xStrAddress As String
Dim xStrValue As Integer
Dim xCell As Range
Dim xRowRg As Range
Dim xF As Integer
Dim xBol As Boolean
xStrAddress = "D2:D12" 'Change cell range
xStrValue = 300 'change the value
Set xRg = Range(xStrAddress)
For xF = xRg.Rows.Count To 1 Step -1
    Set xRowRg = xRg.Rows.Item(xF)
    xBol = False
    For Each xCell In xRowRg.Cells
        If Application.IsNumber(xCell.Value) Then
        If xCell.Value > xStrValue Then
        xBol = True
        Exit For
        End If
        End If
    Next
    If xBol Then
        xRowRg.EntireRow.clearContents
    End If
Next
End Sub

Внимание: В приведенном выше коде D2: D12 содержит ли диапазон данных конкретное значение, на основе которого вы хотите очистить строки; 300 конкретное значение; в > персонаж в сценарии Если xCell.Value > xStrValue Тогда означает больше чем, используйте меньше чем, измените его на < характер, как вам нужно.

3, Затем нажмите F5 ключ для запуска этого кода, и все содержимое строки очищается, если значение в столбце D больше 300, см. снимок экрана:


Очистить содержимое ячейки или строки на основе значения ячейки с помощью удобной функции

Если у вас есть Kutools for Excel, С его Выбрать определенные ячейки функцию, вы можете выбрать ячейки или строки на основе определенного значения, а затем сразу удалить содержимое ячейки.

После установки Kutools for Excel, пожалуйста, сделайте так:

1. Выберите диапазон данных со значениями, на основе которых вы хотите очистить содержимое ячейки или строки, а затем щелкните Кутулс > Выберите > Выбрать определенные ячейки, см. снимок экрана:

2. В открытом Выбрать определенные ячейки диалоговом окне выполните следующие операции:

  • Нажмите Ячейка or Весь ряд что вы хотите выбрать;
  • Укажите критерии под Конкретный тип раздел, как вам нужно. Здесь я хочу выбрать строки, значение которых в столбце D больше 300.

3. Затем нажмите Ok кнопка, и будут выбраны все строки со значением больше 300. Теперь вам просто нужно нажать клавишу Delete на клавиатуре, чтобы удалить содержимое ячейки, см. снимок экрана:

Tips: Есть много других критериев, которые вы можете использовать, пожалуйста, укажите свое собственное условие в диалоговом окне, как показано ниже:


Очистить данные строк в диапазоне, если он содержит пустую ячейку с кодом VBA

В этом случае, если ячейка в диапазоне данных содержит пробел, я хочу очистить данные строк из диапазона, как показано ниже.

Чтобы завершить эту задачу, примените следующий код VBA:

1. Удерживая нажатой ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модули, а затем вставьте следующий код в Модули Окно.

Код VBA: очистить данные строк, если они содержат пустую ячейку

Sub ClearContents()
'Updateby ExtendOffice
Dim xcell As Range
Set xrng = Application.Range("A2:D12")
For Each xcell In xrng
If xcell.Value = "" Then
Intersect(xcell.EntireRow, xrng).ClearContents
End If
Next
End Sub

Внимание: В приведенном выше коде A2: D12 диапазон данных содержит пустые ячейки, из которых вы хотите очистить содержимое ячеек.

3, Затем нажмите F5 ключ для запуска этого кода, и данные строк с пустыми ячейками очищаются сразу в определенном диапазоне, как вам нужно.


Очистить содержимое ячейки на основе цвета фона с помощью кода VBA

Чтобы очистить ячейки, заполненные определенным цветом фона, вы можете использовать следующий код VBA.

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модули, а затем вставьте следующий код в Модули Окно.

Код VBA: очистить содержимое ячейки на основе цвета фона

Sub Clearcontents()
'Updateby ExtendOffice
Dim xcell As Range
Dim xrng As Range
Set xrng = Application.Range("A2:D12")
    For Each xcell In xrng
        If xcell.Interior.Color = RGB(252, 228, 214) Then
            xcell.Clearcontents
        End If
    Next
End Sub

Внимание: В приведенном выше коде A2: D12 диапазон данных, который вы хотите использовать, RGB (252, 228, 214) — это конкретный цвет, на основе которого вы хотите очистить ячейки, вы можете извлечь режим RGB цвета фона, используя Рисовать программа на вашем компьютере.

3. А затем нажмите F5 для запуска этого кода, и содержимое ячейки с указанным цветом фона немедленно очищается. Смотрите скриншот:


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы и хранение данных; Разделить содержимое ячеек; Объедините повторяющиеся строки и сумму / среднее значение… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Избранные и быстро вставляйте формулы, Диапазоны, диаграммы и изображения; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Группировка сводной таблицы по номер недели, день недели и другое … Показать разблокированные, заблокированные ячейки разными цветами; Выделите ячейки, у которых есть формула / имя

вкладка kte 201905


Вкладка Office — предоставляет интерфейс с вкладками в Office и значительно упрощает вашу работу

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Всем привет!
Необходимо откорректировать код.

Есть код…

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range: Set rng = [C5] 'диапазон вашей таблицы
    If Not Intersect(rng, Target) Is Nothing Then Макрос2
    With ActiveWorkbook.Worksheets("Лист2").AutoFilter.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("F5:F" & Range("D" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .SortFields.Add Key:=Range("G5:G" & Range("E" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .Apply
        End With
End Sub
   

…в котором интересует вот эта часть.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range: Set rng = [C5] 'диапазон вашей таблицы
    If Not Intersect(rng, Target) Is Nothing Then Макрос2

Суть состоит в том, что если в ячейке C5 меняется значение, то выполняется очистка данных ячейки D5 в виде такого кода.

Sub Макрос2()
Range("D5").Select
Selection.ClearContents
End Sub

Вопрос 1: будучи неграмотным в VBA не знаю, как в этом коде:

Sub Макрос2()
Range("D5").Select
Selection.ClearContents
End Sub

…сделать так, чтобы производилась очистка данных еще в ячейках E5 и J5.

Вопрос 2: как сделать, чтобы действия очистки производились и на остальные ячейки в столбце C. Т.е. если в C6 меняется значение — очищаем ячейки D6, E6 и J6.  И.т.д.


1.

Range("D5:E5,J5").ClearContents


1. макрос будет срабатывать при изменении в диапазоне «C5:C10»

If Not Intersect(Target, Range("C5:C10")) Is Nothing Then R = Target.Row: макрос2
2.

Public R&
Sub макрос2()
Range("D" & R & ":E" & R & ",J" & R).ClearContents
End Sub


Цитата: cheshiki1 от 20.05.2014, 13:57
1.Range("D5:E5,J5").ClearContents

Спасибо!

Все работает, ячейки очищаются. Одно но, я не уточнил. Кажется, что очистка происходит, когда в ячейки столбца C вводятся новые данные, но у меня там формулы, которые извлекают данные из другого места. Поэтому необходимо, чтобы он производил очистку не при вводе и впоследствии изменении значения в ячейки, а просто при изменении :)


тогда вам нужно код вешать на событие пересчета

Private Sub Worksheet_Calculate(). здесь я пас, моих знаний не хватает.


Цитата: cheshiki1 от 20.05.2014, 16:28
тогда вам нужно код вешать на событие пересчета Private Sub Worksheet_Calculate(). здесь я пас, моих знаний не хватает.

Окей. В любом случае спасибо вам за помощь!


Кстати, вот нашел такой вариант.

Private Sub Worksheet_Calculate()
If [a1] <> test Then MsgBox "Изменилось!!!": test = [a1]
End Sub

При изменении значения ячейки a1 — появляется окошко с текстом.

Не подскажете, как мне заменить

Then MsgBox "Изменилось!!!": test = [a1]

на выполнение моего «макроса2»?

Т.е. грубо говоря вот так должно быть:

Private Sub Worksheet_Calculate()
If [C5] <> test Then макрос2
End Sub

а макрос 2 выглядит так:

Public R&
Sub макрос2()
Range("D" & R & ":E" & R & ",J" & R).ClearContents
End Sub


ЦитироватьТ.е. грубо говоря вот так должно быть:

Так оно и есть. Только здесь одно но где то нужно записывать текущее значение ячейки чтобы после срабатывания процедуры было с чем сравнивать. ([a1] <> test, где test это ячейка где сохранено предыдущее значение.) По моему так но могу и ошибаться.


Цитата: cheshiki1 от 21.05.2014, 11:11

ЦитироватьТ.е. грубо говоря вот так должно быть:

Так оно и есть. Только здесь одно но где то нужно записывать текущее значение ячейки чтобы после срабатывания процедуры было с чем сравнивать. ([a1] <> test, где test это ячейка где сохранено предыдущее значение.) По моему так но могу и ошибаться.

Видимо вот это.

Код в рабочей книге:

Option Explicit

Private Sub Workbook_Open()
test = Лист.[a1]
End Sub

и вот еще код в дополнительном модуле:

Option Explicit

Public test


ЦитироватьВидимо вот это.

да.
вот нашел примеры для одной ячейки.

вариант 1
Private Sub Worksheet_Change(ByVal Target As Range)
Application.DisplayAlerts = False
    If Not (Intersect(Target, Union(Me.Range("A1"), Me.Range("A1").Precedents)) Is Nothing) Then
        MsgBox "A1 изменена"
    End If
Application.DisplayAlerts = True
End Sub

вариант 2
Private Sub Worksheet_Calculate()
Static v As Variant
    If Me.Range("A1").Value <> v Then
        MsgBox "A1 изменена"
        v = Me.Range("A1").Value
    End If
End Sub


Вот этот вариант у меня работает.

Код листа

Private Sub Worksheet_Calculate()
If [C5] <> test Then MsgBox "Изменилось!!!": test = [C5]
End Sub

Код книги

Option Explicit
Private Sub Workbook_Open()
test = Лист2.[C5]
End Sub

Модуль

Option Explicit

Public test

Все отлично, если значение ячейки меняется по расчету формулы — выскакивает сообщение.

Единственное что, мне вместо мэссэджбокса надо запускать свой макрос 2

Public R&
Sub макрос2()
Range("D" & R & ":E" & R & ",J" & R).ClearContents
End Sub

Но как вписать корректно, не пойму. Так не работает.

Private Sub Worksheet_Calculate()
If [C5] <> test Then макрос2
End Sub


ЦитироватьТак не работает.

По идее должно работать. единственное вы пропустили «: test = [C5]» а оно обязательно иначе значение test не будет меняться.
последний вариант файла приложите.
П.С. у вас R не найдено. т.к. проверяется одна ячейка то «Range(«D» & R & «:E» & R & «,J» & R).ClearContents » замените на
«Range(«D5:E5,J5″).ClearContents»


cheshiki1, спасибо Вам за то, что уделяете время!

Скидываю 2 варианта.

Сначала тот работающий, чтобы понятнее было, в чем вообще моя задача состоит. Есть два файла — «Инвентаризационная» и «База данных с группами123456789». В файле «База данных с группами123456789» ячейка C5 извлекает код из ячейки B17 в файле «Инвентаризационная». Задача: если в ячейке C5 в первом файле меняется код — очищаются ячейки D5, E5 и J5. Далее у меня если D5, E5 и J5 становятся пустыми, то по коду моей сортировки они опускаются вниз.

Для наглядности того, что этот вариант работает. Меняем в ячейке B17 в файле «Инвентаризационная» номенклатурный код и видим, что файле «База данных с группами123456789» в ячейке C5 обновился код, но не очистились D5, E5 и J5. А вот если вручную сменить в ячейке C5 значение — D5, E5 и J5 очищаются и сортируются вниз.

А теперь второй пример со всеми замечаниями и обновлениями. Я вроде все учел. Опять же, меняем в ячейке B17 в файле «Инвентаризационная» код и видим, что файле «База данных с группами123456789» в ячейке C5 обновился код, но не очистились D5, E5 и J5. А вот теперь если вручную сменить в ячейке C5 значение — ячейки D5, E5 и J5 очищаются, но не сортируются вниз и эксель вообще полностью виснет :)


Доброго дня!
Причину не сработки сценария, Вам верно указал, уважаемый cheshiki1: Значение старое, которое Вы заносите в test, нужно сохранять до того как Вы пересчитали ячейку С5! Иначе у Вас и текущее значение С5 и занесенное в test будут одинаковы!

К стати:

Private Sub Worksheet_Calculate()
    Dim test As String

    If [C5] <> test Then
        test = [C5]
        Range("D5:E5,J5").ClearContents
    End If
End Sub

вот так можно реализовать очистку в «теле» Worksheet_Calculate, тогда Макрос 2 не нужен.

P.S.
Набросал вариант, на скрепке.
На всякий случай, продублирую представленный в файле код:

Private Sub Worksheet_Calculate()
    If Cells(ActiveCell.Row - 1, 5).Value <> Cells(ActiveCell.Row - 1, 16).Value Then
        ySNo = MsgBox("Удалить значения в диапазоне и в ячейке?" & Chr(13) & "- Да / Нет.", vbQuestion + vbYesNo, "Запрос системы:")
        If ySNo = 6 Then '- Да (=6)
            Range(Cells(ActiveCell.Row - 1, 9), Cells(ActiveCell.Row - 1, 11)).ClearContents
            Cells(ActiveCell.Row - 1, 14).ClearContents
        Else '- Нет (=7)
            MsgBox "Вы выбрали довольно странный путь!" & Chr(13) & "- Прощайте!", vbInformation + vbOKOnly, "Сообщение системы:"
        End If
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 3 Or Target.Column = 4 Then
        Cells(Target.Row, 16) = Cells(Target.Row, 5).Value
    End If
End Sub

Путей к вершине — множество. Этот один из многих!


#14




27.05.2014, 11:36

Последнее редактирование: 27.05.2014, 11:50 от Michael Holbrook

GWolf, здравствуйте! Спасибо за помощь!

Попробовал ваш код без моей сортировки и с сортировкой:

Private Sub Worksheet_Calculate()
    Dim test As String

    If [C5] <> test Then
        test = [C5]
        Range("D5:E5,J5").ClearContents
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range: Set rng = [C5:C3000] 'диапазон вашей таблицы
    If Not Intersect(Target, Range("C5:C3000")) Is Nothing Then R = Target.Row: макрос2
    With ActiveWorkbook.Worksheets("Лист2").AutoFilter.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("F5:F" & Range("D" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .SortFields.Add Key:=Range("G5:G" & Range("E" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .Apply
        End With
End Sub 

Куча ошибок продолжает мне выдавать. К примеру Out of stack space. Так же VBA выделяет эту часть кода:

If [C5] <> test Then

Архив прикрепил.

Спасибо также за ваш вариант с удалением ячеек. Но мне он не подходит, потому что файл «Инвентаризационная» может за день довольно значительно поменять свое наполнение и расположение этой номенклатуры может постоянно прыгать по ячейкам. Именно поэтому поставили задачу автоматической очистки ячеек.


Доброго дня, Michael Holbrook!

Цитата: Michael Holbrook от 27.05.2014, 11:36
… VBA выделяет эту часть кода:If [C5] <> test Then

Удивляться нечему! Дело в том что с одной стороны условия у Вас ячейка, по абсолютному ее адресу: [C5], и поскольку ячейка является контейнером, по сути своей, то и содержать может все что угодно и Вы ее не приводите к нужному виду, ну например так: Thisworkbooks.Cells(5,3).text. Почему .text? — Да потому что, другая сторона условия — переменная типа String, т.е. Строковая!
Вот за что я не люблю адресацию вида [CR]. Но, если уж Вам так нужно, то попробуйте сначала присвоить некоей переменной содержимое [C5], а уж затем сравнивайте эту переменную с test.

ЦитироватьСпасибо также за ваш вариант с удалением ячеек. Но мне он не подходит, потому что файл «Инвентаризационная» может за день довольно значительно поменять свое наполнение и расположение этой номенклатуры может постоянно прыгать по ячейкам. Именно поэтому поставили задачу автоматической очистки ячеек.

А вот тут я бы не торопился! Расскажите по-подробнее про: «может за день довольно значительно поменять свое наполнение и расположение этой номенклатуры может постоянно прыгать по ячейкам». Ведь, насколько я понимаю, Вы поменяв значение получаете мгновенное изменение, которое и влияет на решение: удалять или нет?! Ну та эта последовательность ЛИНЕЙНА и, происходит столько раз, сколько Вы будете менять значения. При чем тут «прыжки»? Или я чего то не понял?

Путей к вершине — множество. Этот один из многих!


#16




27.05.2014, 17:04

Последнее редактирование: 29.05.2014, 16:56 от Michael Holbrook

GWolf, «Инвентаризационная» — экспортированный файл номенклатуры с 1С. Складовщик постоянно заносит новые данные или же удаляет. Плюс номенклатура у него сортируется по алфавиту. Следствием этих изменений может быть постоянное изменение адреса конкретной номенклатуры.

Во втором файле я забил формулы поиска по ВПР с первого файла номенклатурного кода и на основе его изымаются названия, кол-во и единицы измерения номенклатуры.
Данные вставляются во второй файл и в нем уже вручную в колонках D и E мы выбираем в какой группе должна быть конкретная номенклатура и к какому производителю относится. В колонке J выбирается расположение на складе. Спискам производителей и групп у меня присвоены свои коды, по которым они сортируются. (коды находятся в скрытых колонках F и G)

Сортируются по этому коду:

Private Sub Worksheet_Change(ByVal target As Range)
Dim rng As Range: Set rng = [C5:C3000]
    If Not Intersect(target, Range("C5:C3000")) Is Nothing Then Range("D5:E5,J5").ClearContents
    With ActiveWorkbook.Worksheets("Лист2").AutoFilter.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("F5:F" & Range("D" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .SortFields.Add Key:=Range("G5:G" & Range("E" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .Apply
        End With
End Sub

Проделав это все я понял, что при изменении базы первого главного файла данные заменяются во втором вполне неплохо. Но вот данные в колонках D, E, J остаются конечно же теми же, что и были, ибо они выбираются вручную из списков.

Вот я и хотел сделать так. Если меняется код конкретной номенклатуры — происходит очистка списков в колонках D, E и J в ее строке. После чего срабатывает сортировка.


#17




28.05.2014, 11:56

Последнее редактирование: 29.05.2014, 17:40 от Michael Holbrook

Также не могу после кода очистки выполнить сортировку, которая ранее выглядела так и работала (вообще обидно, код ниже меня во всем удовлетворял бы и задача была бы полностью решена, если бы он реагировал на изменение значения в ячейке по формуле, а не на ручной ввод в ячейку):

Private Sub Worksheet_Change(ByVal target As Range)
Dim rng As Range: Set rng = [C5:C3000]
    If Not Intersect(target, Range("C5:C3000")) Is Nothing Then Range("D5:E5,J5").ClearContents
    With ActiveWorkbook.Worksheets("Лист2").AutoFilter.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("F5:F" & Range("D" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .SortFields.Add Key:=Range("G5:G" & Range("E" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .Apply
        End With
End Sub

Т.е. фактически после очистки, которая происходит, если меняется значение C5:

Private Sub Worksheet_Calculate()
Static OldVal1 As Variant, OldVal2 As Variant
If Range("C5").Value <> OldVal1 Then
    OldVal1 = Range("C5").Value
    Range("D5") = Range("A1")
    Range("E5") = Range("B1")
    Range("J5") = Range("C1")
End If
End Sub

Эта сортировка не выполняется:

Private Sub Worksheet_Change(ByVal target As Range)
Dim rng As Range: Set rng = [C5:C3000]
    If Not Intersect(target, Range("C5:C3000")) Is Nothing Then Range("D5:E5,J5").ClearContents
    With ActiveWorkbook.Worksheets("Лист2").AutoFilter.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("F5:F" & Range("D" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .SortFields.Add Key:=Range("G5:G" & Range("E" & Rows.Count).End(xlUp).Row), Order:=xlAscending
        .Apply
        End With
End Sub

Выделяется почему-то как ошибка эта строка и выскакивает Subscript out of range

With ActiveWorkbook.Worksheets("Лист2").AutoFilter.Sort


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

Option Explicit

Private Sub Worksheet_Calculate()
  Dim r As Long
  Application.EnableEvents = False
  For r = 7 To 100
    If Cells(r, 3).Value <> ThreeC(r, 1) Then
      ThreeC(r, 1) = Cells(r, 3).Value: Cells(r, 12) = 0
      Cells(r, 5).Resize(1, 2).ClearContents: Cells(r, 10).ClearContents
    End If
  Next
  Application.EnableEvents = True
End Sub


Путей к вершине — множество. Этот один из многих!


автоматизация очищения ячеек

nikitan95

Дата: Суббота, 01.09.2012, 16:52 |
Сообщение № 1

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

С Праздником Знания всех!
В прилагаемом примере отчет прихода и расхода материалов и запчастей для автомашин. После перехода на след.месяц приходится вручную очищать поля столбцов Прихода (кол-во и сумма) и Расходов по каждой автомашине (только кол-во). Для этого вручную выделяю данные поля и очищаю их. Машин более ста штук, так что это уже превращается в муку. Попробовал через присвоение имен. Согласитесь. что и это не выход. Вопрос: как посредством встроенных функций Excel выделить соответствующие ячейки для быстрого удаления их содержимых? Заранее благодарствую за постоянную выручку и помощь.

К сообщению приложен файл:

8270214.xlsx
(36.3 Kb)

Сообщение отредактировал nikitan95Суббота, 01.09.2012, 16:55

 

Ответить

light26

Дата: Суббота, 01.09.2012, 17:10 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

макрос устроит? и какой диапазон очистить надо?


Я не волшебник. Я только учусь

Сообщение отредактировал light26Суббота, 01.09.2012, 17:13

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 17:12 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

Quote (light26)

макрос устроит?

только как крайняя мера(

 

Ответить

light26

Дата: Суббота, 01.09.2012, 17:14 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Quote (nikitan95)

только как крайняя мера(

Ну, насколько я знаю, формулы очищать содержимое ячеек не умеют


Я не волшебник. Я только учусь

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 17:17 |
Сообщение № 5

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

а встроенными функциями Excel никак?

 

Ответить

light26

Дата: Суббота, 01.09.2012, 17:27 |
Сообщение № 6

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Quote (nikitan95)

а встроенными функциями Excel никак?

Ждите остальных. может че подскажут. но сомневаюсь я.


Я не волшебник. Я только учусь

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 17:31 |
Сообщение № 7

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

Quote (light26)

но сомневаюсь я.

я тоже.. хорошо, если Вас не затруднить, давайте Вашим макросом.. просто я с ними не в ладах, поэтому если потом завалю Вас азбучными вопросами надеюсь на Ваше снисхождение..

 

Ответить

light26

Дата: Суббота, 01.09.2012, 17:40 |
Сообщение № 8

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Просто жмем кнопку «Новый месяц»
Перед этим надо включить макросы в настройках безопасности

К сообщению приложен файл:

1526409.xlsm
(42.6 Kb)


Я не волшебник. Я только учусь

Сообщение отредактировал light26Суббота, 01.09.2012, 17:42

 

Ответить

light26

Дата: Суббота, 01.09.2012, 17:50 |
Сообщение № 9

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Если диапазон нужно изменить, то топаем мышом по имени листа, выбираем «Исходный текст» и указываем диапазон по аналогии


Я не волшебник. Я только учусь

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 17:51 |
Сообщение № 10

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

не работает однако. скорее Вы поспешно прочли условие. загляните в Формулы-Диспетчер имен-перем_. именно этот диапазон надо очистить. впрочем это лишь малая часть диапазона..

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 17:53 |
Сообщение № 11

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

Quote (light26)

Если диапазон нужно изменить, то топаем мышом по имени листа, выбираем «Исходный текст» и указываем диапазон по аналогии

с таким же успехом можно было желаемому диапазону присвоить имя в Диспетчере имен и потом выбрав его очистить его содержимое… и притом без макросов

Сообщение отредактировал nikitan95Суббота, 01.09.2012, 17:54

 

Ответить

Gustav

Дата: Суббота, 01.09.2012, 18:03 |
Сообщение № 12

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

Вот таким макросом можно выделить подлежащие очистке ячейки:
[vba]

Code

Sub selectBeforeClear()
       Range(«E5:BM24»).SpecialCells(xlCellTypeConstants, xlNumbers).Select
End Sub

[/vba]
Запустите, убедитесь, что выделяются нужные ячейки и жмите Delete.

Выделение затрагивает только числа (константы) в диапазоне, формулы не трогаются. Когда освоитесь и обретете уверенность, то можно сразу очищать, не выделяя:
[vba]

Code

Range(«E5:BM24»).SpecialCells(xlCellTypeConstants, xlNumbers).ClearContents

[/vba]
Причем, последнюю команду можно выполнить в Окне отладке редактора VBA, не создавая отдельного макроса.

Ну, хотя собственно всё это можно выполнить и вручную! smile


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavСуббота, 01.09.2012, 18:08

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 18:04 |
Сообщение № 13

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

можно ли в Диспетчере имен при присвоении имени использовать функцию ИНДЕКС или наподобие того? думаю, что можно, но вот как? может знатоки помогут..

 

Ответить

Gustav

Дата: Суббота, 01.09.2012, 18:12 |
Сообщение № 14

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

Quote (Gustav)

Range(«E5:BM24»).SpecialCells(xlCellTypeConstants, xlNumbers).ClearContents

Ну, хотя собственно всё это можно выполнить и вручную!

Вручную:
1. Выделяете E5:BM24
2. Ctrl+G, Выделить
3. Константы, оставить только флажок «числа», OK
4. Клавиша Delete


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavСуббота, 01.09.2012, 18:15

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 18:14 |
Сообщение № 15

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

Спасибо, Gustav,
Работает на ура. Поправил чуток диапазон и будто не было никаких проблем и в помине. Макрос конечно удивительная вещица, но все-таки предыдущий мой пост (сообщение № 13) еще в силе)) Да здравствует День Знания с excelworld.ru

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 18:22 |
Сообщение № 16

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

Урррррррррррррааааа! Бесподобно!!! Наконец-то День Знания прошло не зря!
Спасибо, Gustav!

 

Ответить

Gustav

Дата: Суббота, 01.09.2012, 18:25 |
Сообщение № 17

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

Quote (nikitan95)

но все-таки предыдущий мой пост (сообщение № 13) еще в силе

На эту тему у меня следующее предложение.

Когда очистите ячейки (вручную!) алгоритмом моего сообщения №14, сделайте еще раз почти так же, а именно:

Вручную:
1. Выделяете E5:BM24
2. Ctrl+G, Выделить
3. Пустые ячейки, OK
4. В строке адреса ячейки (слева от строки ввода) задаете имя типа «ДляОчистки».

В следующий раз, когда подойдет время чиститься, просто выделите через Ctrl+G диапазон «ДляОчистки» и нажмите Delete.


МОИ: Ник, Tip box: 41001663842605

 

Ответить

nikitan95

Дата: Суббота, 01.09.2012, 18:36 |
Сообщение № 18

Группа: Проверенные

Ранг: Обитатель

Сообщений: 410


Репутация:

0

±

Замечаний:
0% ±


2016

думаю меня не расстреляют в такой день, если я добавлю Gustav-у счастливое 88-ое число.. лично я считаю его вполне заслуженным. Спасибо, за ценный урок!

Сообщение отредактировал nikitan95Суббота, 01.09.2012, 18:37

 

Ответить

light26

Дата: Суббота, 01.09.2012, 19:34 |
Сообщение № 19

Группа: Друзья

Ранг: Старожил

Сообщений: 1341


Репутация:

91

±

Замечаний:
0% ±


2007, 2010, 2013

Quote (nikitan95)

не работает однако

Не знаю причины.


Я не волшебник. Я только учусь

 

Ответить

Hugo

Дата: Суббота, 01.09.2012, 20:27 |
Сообщение № 20

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Может быть я что-то не понял — но что мешает просто иметь один такой чистый шаблон под именем например «шаблон.xls».
Открываете его, заносите первое число, сохраняете как «201209.xls»
Через месяц снова открываете шаблон и т.д.
Ничего очищать не нужно, все данные за все года сохраняются.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Содержание

  1. VBA Excel. Range.Clear и другие методы очистки ячеек
  2. Методы очистки ячеек
  3. Примеры использования
  4. 6 комментариев для “VBA Excel. Range.Clear и другие методы очистки ячеек”
  5. Удаление пустых ячеек из диапазона
  6. Постановка задачи
  7. Способ 1. Грубо и быстро
  8. Способ 2. Формула массива
  9. Способ 3. Пользовательская функция на VBA
  10. Удалите ячейки с помощью параметра «For Each. Цикл «Далее» в Excel
  11. Аннотация
  12. Дополнительная информация
  13. Образец данных
  14. Пример макроса
  15. Поведение примера макроса в Excel 2002 и более поздних версиях Excel
  16. Поведение примера макроса в Microsoft Excel 5.0 и Microsoft Excel 7.0
  17. Рекомендуемый метод для удаления ячеек с помощью цикла
  18. Дополнительный метод для удаления ячеек с помощью цикла
  19. Как удалить ячейки в Excel по условию?
  20. Удаление стандартными средствами Excel
  21. Удаление с помощью макроса (надстройки)
  22. Как удалить строки по условию?

VBA Excel. Range.Clear и другие методы очистки ячеек

Метод Range.Clear для полной очистки диапазона ячеек из кода VBA Excel. Методы очистки отдельных свойств и их групп в ячейках. Примеры использования.

Методы очистки ячеек

Метод Очищаемые свойства Примечание
Range.Clear Почти все свойства Ширина и высота ячеек не изменяются
Range.ClearComments Комментарии Для Excel в составе Office 365
Range.ClearContents Формулы и значения Исходное форматирование сохраняется
Range.ClearFormats Свойства, задающие форматы В том числе отмена объединения ячеек
Range.ClearHyperlinks Гиперссылки Текст и форматирование сохраняются
Range.ClearNotes Примечания и заметки Примечания – для локальных программ Excel, заметки – для Excel в составе Office 365
Range.ClearOutline Структура данных Смотрите, что такое структурирование данных

Range – выражение, возвращающее диапазон ячеек.

Примеры использования

1. Удаление гиперссылки из ячейки A1
Cells(1, 1).ClearHyperlinks

2. Очистка диапазона A1:L50 от формул и значений
Range(«A1:L50»).ClearContents

3. Очистка всех свойств ячеек в столбцах A:K
Columns(«A:K»).Clear

4. Очистка форматирования ячеек в строках 1:20
Rows(«1:20»).ClearFormats

Методы очистки диапазонов ячеек в VBA Excel возвращают очищаемые свойства ячеек к значениям по умолчанию. К таким, как на вновь созданном стандартном рабочем листе. При любых методах очистки высота строк и ширина столбцов не изменяются.

Фразы для контекстного поиска: очистка ячеек, очистка ячейки, очистка формул, очистка от формул, удаление формул, очистка значений, удаление значений, очистка форматов, удаление форматирования, удаление форматов.

6 комментариев для “VBA Excel. Range.Clear и другие методы очистки ячеек”

Здравствуйте!
Есть такая проблема:
1. В отдельном модуле написана процедура, которая при запуске и вводе в inputbox данных генерирует таблицу с данными. Вот перед каждой генерацией сделал так, чтобы содержимое листа , кроме первой строки (шапки), очищалось: Thisbooks.Worksheets(«Лист3»).Range(«A2»,Cells(lastRow, lastColumn).clear

2. На первом листе у меня как бы меню управления. Там кнопка, к которой привязана эта процедура. При запуске выполнение процедуры доходит до строки с очисткой и уходит в ошибку 1004 run time error: Application-defined or object-defined error.

При этом, если эту же процедуру запускать с кнопки, или через F5, но с открытого Лист3 — все отлично выполняется!

Никак не могу додуматься в чем же проблема. Подскажите пожалуйста!

Источник

Удаление пустых ячеек из диапазона

Постановка задачи

Имеем диапазон ячеек с данными, в котором есть пустые ячейки:

Задача — удалить пустые ячейки, оставив только ячейки с информацией.

Способ 1. Грубо и быстро

  1. Выделяем исходный диапазон
  2. Жмем клавишу F5, далее кнопка Выделить(Special) . В открывшмся окне выбираем Пустые ячейки(Blanks) и жмем ОК.

Выделяются все пустые ячейки в диапазоне.

  • Даем в меню команду на удаление выделенных ячеек: правой кнопкой мыши Удалить ячейки (Delete Cells) со сдвигом вверх.
  • Способ 2. Формула массива

    Для упрощения дадим нашим рабочим диапазонам имена, используя Диспетчер Имен (Name Manager) на вкладке Формулы (Formulas) или — в Excel 2003 и старше — меню Вставка — Имя — Присвоить (Insert — Name — Define)


    Диапазону B3:B10 даем имя ЕстьПустые, диапазону D3:D10 — НетПустых. Диапазоны должны быть строго одного размера, а расположены могут быть где угодно относительно друг друга.

    Теперь выделим первую ячейку второго диапазона (D3) и введем в нее такую страшноватую формулу:

    В английской версии это будет:
    =IF(ROW()-ROW(НетПустых)+1>ROWS(ЕстьПустые)-COUNTBLANK(ЕстьПустые),»»,INDIRECT(ADDRESS(SMALL((IF(ЕстьПустые<>«»,ROW(ЕстьПустые),ROW()+ROWS(ЕстьПустые))),ROW()-ROW(НетПустых)+1),COLUMN(ЕстьПустые),4)))

    Причем ввести ее надо как формулу массива, т.е. после вставки нажать не Enter (как обычно), а Ctrl+Shift+Enter. Теперь формулу можно скопировать вниз, используя автозаполнение (потянуть за черный крестик в правом нижнем углу ячейки) — и мы получим исходный диапазон, но без пустых ячеек:

    Способ 3. Пользовательская функция на VBA

    Если есть подозрение, что вам часто придется повторять процедуру удаления пустых ячеек из диапазонов, то лучше один раз добавить в стандартный набор свою функцию для удаления пустых ячеек, и пользоваться ей во всех последующих случаях.

    Для этого откройте редактор Visual Basic (ALT+F11), вставьте новый пустой модуль (меню Insert — Module) и скопируйте туда текст этой функции:

    Не забудьте сохранить файл и вернитесь из редактора Visual Basic в Excel. Чтобы использовать эту функцию в нашем примере:

    1. Выделите достаточный диапазон пустых ячеек, например F3:F10.
    2. Идем в меню Вставка — Функция (Insert — Function) или жмем на кнопку Вставить функцию(Insert Function) на вкладке Формулы (Formulas) в новых версиях Excel. В категории Определенные пользователем (User Defined) выберите нашу функцию NoBlanks.
    3. В качестве аргумента функции укажите исходный диапазон с пустотами (B3:B10) и нажмите Ctrl+Shift+Enter, чтобы ввести функцию как формулу массива.

    Источник

    Удалите ячейки с помощью параметра «For Each. Цикл «Далее» в Excel

    Аннотация

    Microsoft Excel 2002 и более поздних версий Excel удаляет ячейки в поле «Для каждого. Далее» цикл отличается от Microsoft Excel 97 и более ранних версий Excel.

    В этой статье описываются различия, а также Visual Basic для приложений пример макроса, иллюстрирующий удаление ячеек в цикле.

    Дополнительная информация

    Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Данное положение включает, но не ограничивается этим, подразумеваемые гарантии товарной пригодности или соответствия отдельной задаче. Эта статья предполагает, что пользователь знаком с представленным языком программирования и средствами, используемыми для создания и отладки процедур. Инженеры службы поддержки Майкрософт могут объяснить функциональность отдельной процедуры. обязаны изменять примеры для реализации дополнительных возможностей или удовлетворения требований конкретных пользователей.

    Образец данных

    Чтобы использовать макрос в этой статье, введите следующие примеры данных на листе:

    Пример макроса

    В новом модуле макросов введите следующий макрос.

    Поведение примера макроса в Excel 2002 и более поздних версиях Excel

    При запуске макроса DeleteCells в Excel 2002 и более поздних версиях Excel удаляются только строки 3, 6 и 8. Хотя строки 4 и 9 содержат «x» в столбце A, макрос не удаляет строки. Результат макроса выглядит следующим образом:

    Когда Microsoft Excel удаляет строку 3, все ячейки перемещаются вверх на одну строку. Например, ячейка A3 предполагает содержимое ячейки A4, ячейка A4 предполагает содержимое ячейки A5 и т. д. После параметра For Each. Следующий цикл вычисляет ячейку, он вычисляет следующую ячейку; Таким образом, при сдвиге ячеек они могут быть пропущены циклом.

    Поведение примера макроса в Microsoft Excel 5.0 и Microsoft Excel 7.0

    При запуске макроса DeleteCells в Excel 5.0 и Excel 7.0 макрос удаляет все строки, содержащие символ «x». Результат макроса выглядит следующим образом:

    При удалении строки 3 все ячейки перемещаются вверх на одну строку. Затем ячейка A3 предполагает содержимое ячейки A4, ячейка A4 предполагает содержимое ячейки A5 и т. д.

    Однако в отличие от поведения цикла в Excel 2002 и более поздних версиях Excel, когда «For Each. Цикл «Далее» вычисляет ячейку в Excel 5.0, а в Excel 7.0 — повторно вычисляет ячейку, если она удаляется в цикле. Таким образом, ячейки не пропускаются.

    Рекомендуемый метод для удаления ячеек с помощью цикла

    Используйте следующий макрос, если вы хотите использовать цикл для удаления ячеек:

    Результаты этого макроса во всех версиях Excel:

    Дополнительный метод для удаления ячеек с помощью цикла

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

    Источник

    Как удалить ячейки в Excel по условию?

    Часто при работе с табличными данными в Excel возникает необходимость удалить пустые или повторяющиеся ячейки. Встречаются также ситуации, когда необходимо скрыть либо удалить ячейки, с определенными значениями или удовлетворяющие заданным условиям. Ячейки можно удалить разными способами, например вместе со строкой, вместе со столбцом, со сдвигом влево или со сдвигом вниз. Сделать это можно как стандартными средствами Excel, так и программно, при помощи макросов, что гораздо более удобно и эффективно. Рассмотрим различные способы удаления ячеек.

    Удаление стандартными средствами Excel

    Перед удалением необходимо выделить удаляемую ячейку или группу ячеек, после чего щелкнуть правой кнопкой мыши на выделенной области, что приведет к появлению контекстного меню. В появившемся меню выбираем пункт «Удалить».

    Выбор этого пункта меню предусматривает 4 варианта удаления, удаление строк и удаление столбцов, в которых содержатся ячейки, а также удаление непосредственно самих ячеек с выбором направления сдвига. В Excel предусмотрено два направления сдвига – либо вверх либо влево.

    После выбора одного из четырех пунктов меню в диалоговом окне остается нажать кнопку «ОК». Окно «Удаление ячеек» можно вызвать также и через вкладку «Главная», в группе «Ячейки», если вызвать меню кнопки «Удалить» и в списке команд выбрать пункт «Удалить ячейки».

    Удаление с помощью макроса (надстройки)

    При преобразовании таблиц большого размера путем удаления в них, к примеру пустых строк, столбцов или ячеек, либо при удалении строк, столбцов или ячеек, содержащих определенные числовые значения или заданный текст, эффективнее, быстрее и безошибочнее применять программное преобразование, то есть использовать для этой работы макрос (надстройку). Вот наглядный пример того, как таблица, содержащая более четырехсот строк буквально за 2-3 секунды превращается в упорядоченную таблицу, в которой уже не более 100 строк.

    С помощью макроса, в используемом диапазоне листа удалены все пустые ячейки со сдвигом вверх. Используемый диапазон — это диапазон между первой и последней заполненными ячейками. Надстройка, при помощи которой производится подобное преобразование таблицы, дает возможность удалять и скрывать не только пустые ячейки, но и ячейки, отвечающие заданным условиям и значениям, например, содержащим определенный текст либо числовые значения, а также эта надстройка позволяет пользователю выбирать диапазон, который необходимо обрабатывать макросу. Так выглядит диалоговое окно представленной надстройки, возможности которой Вы можете оценить сами.

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

    Источник

    Как удалить строки по условию?

    Предположу, что почти каждый сталкивался с ситуацией, когда необходимо удалить только определенные строки: имеется большая таблица и необходимо удалить из неё только те строки, которые содержат какое-то слово (цифру, фразу). Для выполнения подобной задачи можно воспользоваться несколькими способами.

    Способ первый:
    Использовать встроенное средство Excel — фильтр. Сначала его необходимо «установить» на листе:

    • Выделяем таблицу с данными, включая заголовки. Если их нет — то выделяем с самой первой строки таблицы, в которой необходимо удалить данные
    • устанавливаем фильтр:
      • для Excel 2003 : ДанныеФильтрАвтофильтр
      • для Excel 2007-2010 : вкладка Данные (Data)Фильтр (Filter)(или вкладка Главная (Home)Сортировка и фильтр (Sort&Filter)Фильтр (Filter) )

    Теперь выбираем условие для фильтра:

    • в Excel 2003 надо выбрать Условие и в появившейся форме выбрать непосредственно условие(«равно», «содержит», «начинается с» и т.д.), а напротив значение в соответствии с условием.
    • Для 2007-2010 Excel нужно выбрать Текстовые фильтры (Text Filters) и либо сразу выбрать одно из предлагаемых условий, либо нажать Настраиваемый фильтр (Custom Filter) и ввести значения для отбора в форме

    После этого удалить отфильтрованные строки. В 2007 Excel могут возникнуть проблемы с удалением отфильтрованных строк, поэтому рекомендую сначала так же прочитать статью: Excel удаляет вместо отфильтрованных строк — все?! Как избежать.

    Способ второй:
    применить код VBA, который потребует только указания значения, которое необходимо найти в строке и номер столбца, в котором искать значение.

    Sub Del_SubStr() Dim sSubStr As String ‘искомое слово или фраза(может быть указанием на ячейку) Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim lMet As Long Dim arr sSubStr = InputBox(«Укажите значение, которое необходимо найти в строке», «www.excel-vba.ru», «») If sSubStr = «» Then lMet = 0 Else lMet = 1 lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) 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 = 1 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

    Если значение sSubStr не будет указано, то будут удалены строки, ячейки указанного столбца которых, пустые.
    Данный код необходимо поместить в стандартный модуль. Вызвать с листа его можно нажатием клавиш Alt + F8 , после чего выбрать Del_SubStr и нажать Выполнить. Если в данном коде в строке
    If -(InStr(Cells(li, 1), sSubStr) > 0) = lMet Then
    вместо = lMet указать <> lMet , то удаляться будут строки, не содержащие указанное для поиска значение. Иногда тоже удобно.
    Но. Данный код просматривает строки на предмет частичного совпадения указанного значения. Например, если Вы укажете текст для поиска «отчет», то будут удалены все строки, в которых встречается это слово(«квартальный отчет», «отчет за месяц» и т.д.). Это не всегда нужно. Поэтому ниже приведен код, который будет удалять только строки, указанные ячейки которых равны конкретно указанному значению:

    Sub Del_SubStr() Dim sSubStr As String ‘искомое слово или фраза(может быть указанием на ячейку) Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim arr sSubStr = InputBox(«Укажите значение, которое необходимо найти в строке», «www.excel-vba.ru», «») lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) 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 = 1 To lLastRow ‘цикл с первой строки до конца If CStr(arr(li, 1)) = sSubStr 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

    Здесь так же, как и в случае с предыдущим кодом можно заменить оператор сравнения( Cells(li, lCol) = sSubStr ) с равно на неравенство( Cells(li, lCol) <> sSubStr ) и тогда удаляться будут строки, значения ячеек которых не равно указанному.

    УДАЛЕНИЕ СТРОК НА ОСНОВАНИИ СПИСКА ЗНАЧЕНИЙ(МНОЖЕСТВЕННЫЕ КРИТЕРИИ)
    Иногда бывают ситуации, когда необходимо удалить строки не по одному значению, а по нескольким. Например, если строка содержит или Итог или Отчет. Ниже приведен код, при помощи которого можно удалить строки, указав в качестве критерия диапазон значений.
    Значения, которые необходимо найти и удалить перечисляются на листе с именем «Лист2». Т.е. указав на «Лист2» в столбце А(начиная с первой строки) несколько значений — они все будут удалены. Если лист называется иначе(скажем «Соответствия») в коде необходимо будет «Лист2» заменить на «Соответствия». Удаление строк происходит на активном в момент запуска кода листе. Это значит, что перед запуском кода надо перейти на тот лист, строки в котором необходимо удалить.

    Sub Del_Array_SubStr() Dim sSubStr As String ‘искомое слово или фраза Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim avArr, lr As Long Dim arr lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) If lCol = 0 Then Exit Sub Application.ScreenUpdating = 0 lLastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count ‘заносим в массив значения листа, в котором необходимо удалить строки arr = Cells(1, lCol).Resize(lLastRow).Value ‘Получаем с Лист2 значения, которые надо удалить в активном листе With Sheets(«Лист2») ‘Имя листа с диапазоном значений на удаление avArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) End With ‘удаляем Dim rr As Range For lr = 1 To UBound(avArr, 1) sSubStr = avArr(lr, 1) For li = 1 To lLastRow ‘цикл с первой строки до конца If CStr(arr(li, 1)) = sSubStr Then If rr Is Nothing Then Set rr = Cells(li, 1) Else Set rr = Union(rr, Cells(li, 1)) End If End If DoEvents Next li DoEvents Next lr If Not rr Is Nothing Then rr.EntireRow.Delete Application.ScreenUpdating = 1 End Sub

    Чтобы код выше удалял строки не по точному совпадению слов, а по частичному(например, в ячейке записано «Привет, как дела?», а в списке есть слово «привет» — надо удалить, т.к. есть слово «привет»), то надо строку:

    If CStr(arr(li, 1)) = sSubStr Then

    заменить на такую:

    If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then

    ‘процедура оставляет в листе только те значения, которые перечислены в списке Sub LeaveOnlyFoundInArray() Dim sSubStr As String ‘искомое слово или фраза Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim avArr, lr As Long Dim arr Dim IsFind As Boolean lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) If lCol = 0 Then Exit Sub Application.ScreenUpdating = 0 lLastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count ‘заносим в массив значения листа, в котором необходимо удалить строки arr = Cells(1, lCol).Resize(lLastRow).Value ‘Получаем с Лист2 значения, которые надо удалить в активном листе With Sheets(«Лист2») ‘Имя листа с диапазоном значений на удаление avArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) End With ‘удаляем Dim rr As Range For li = 1 To lLastRow ‘цикл с первой строки таблицы до конца IsFind = False For lr = 1 To UBound(avArr, 1) ‘цикл по списку значений на удаление sSubStr = avArr(lr, 1) If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then IsFind = True End If DoEvents Next lr ‘если значение таблицы не найдено в списке — удаляем строку If Not IsFind Then If rr Is Nothing Then Set rr = Cells(li, 1) Else Set rr = Union(rr, Cells(li, 1)) End If End If DoEvents Next li If Not rr Is Nothing Then rr.EntireRow.Delete Application.ScreenUpdating = 1 End Sub

    Чтобы код выше сравнивал значения таблицы со значениями списка по точному совпадению слов, а не по частичному, то надо строку:

    If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then

    заменить на такую:

    If CStr(arr(li, 1)) = sSubStr Then

    Для всех приведенных кодов можно строки не удалять, а скрывать. Для этого надо строку:

    If Not rr Is Nothing Then rr.EntireRow.Delete

    заменить на такую:

    If Not rr Is Nothing Then rr.EntireRow.Hidden = True

    По умолчанию все коды начинают просмотр строк с первой по последнюю заполненную на листе. И если необходимо удалять строки не с первой или не по последнюю, то надо внести корректировки в эту строку:

    For li = 1 To lLastRow ‘цикл с первой строки до конца

    1 — это первая строка; lLastRow — определяется автоматически кодом и равна номеру последней заполненной строки на листе. Если надо начать удалять строки только с 7-ой строки(например, в первых 6-ти шапка), то код будет выглядеть так:

    For li = 7 To lLastRow ‘цикл с седьмой строки до конца

    А если надо удалять только с 3-ей по 300-ю, то код будет выглядеть так:

    For li = 3 To 300 ‘цикл с третьей строки до трехсотой

    Статья помогла? Поделись ссылкой с друзьями!

    Источник

    макрос удалит на листе все строки, в которых содержится искомый текст:

    (пример — во вложении ConditionalRowsDeleting.xls)

    Sub УдалениеСтрокПоУсловию()
        Dim ra As Range, delra As Range, ТекстДляПоиска As String
        Application.ScreenUpdating = False    ' отключаем обновление экрана
    
        ТекстДляПоиска = "Наименование ценности"    ' удаляем строки с таким текстом
    
        ' перебираем все строки в используемом диапазоне листа
        For Each ra In ActiveSheet.UsedRange.Rows
            ' если в строке найден искомый текст
            If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
                ' добавляем строку в диапазон для удаления
                If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
            End If
        Next
        ' если подходящие строки найдены - удаляем их
        If Not delra Is Nothing Then delra.EntireRow.Delete
    End Sub

    Чтобы вместо удаления просто скрыть такие строки, замените строку

    If Not delra Is Nothing Then delra.EntireRow.Delete

    на

    If Not delra Is Nothing Then delra.EntireRow.Hidden=TRUE

    Расширенная версия этого макроса — с использованием UserForm для ввода искомого значения

    Function ПоискСтрокПоУсловию(ByVal ТекстДляПоиска As String, Optional HideOnly As Boolean) As Long
        ' функция получает в качестве параметра ТекстДляПоиска (можно использовать символы * и ?)
        ' Если HideOnly = TRUE, то строки, содержащие в ячейках ТекстДляПоиска, скрываются,
        ' иначе (HideOnly = FALSE - по умолчанию) - удаляются
        ' Функция возвращает количество удалённых строк
        Dim ra As Range, delra As Range
        Application.ScreenUpdating = False    ' отключаем обновление экрана
    
        ' перебираем все строки в используемом диапазоне листа
        For Each ra In ActiveSheet.UsedRange.Rows
            ' если в строке найден искомый текст
            If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
                ' добавляем строку в диапазон для удаления
                If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
            End If
        Next
        On Error Resume Next: ПоискСтрокПоУсловию = delra.Areas.Count ' количество найденных строк
        
        If Not delra Is Nothing Then    ' если подходящие строки найдены - скрываем или удаляем их
            If HideOnly Then delra.EntireRow.Hidden = True Else delra.EntireRow.Delete
        End If
    End Function

    Ещё один вариант кода, позволяющего выполнять поиск (с последующим удалением или скрытием строк) сразу по нескольким условиям:

    Sub УдалениеСтрокПоНесколькимУсловиям()
        Dim ra As Range, delra As Range
        Application.ScreenUpdating = False    ' отключаем обновление экрана
    
        ' ищем и удаляем строки, содержащие заданный текст
        ' (можно указать сколько угодно значений, и использовать подстановочные знаки)
        УдалятьСтрокиСТекстом = Array("Наименование *", "Количество", _
                                      "текст?", "цен*сти", "*78*")
     
        ' перебираем все строки в используемом диапазоне листа
        For Each ra In ActiveSheet.UsedRange.Rows
            ' перебираем все фразы в массиве
            For Each word In УдалятьСтрокиСТекстом
                ' если в очередной строке листа найден искомый текст
                If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
                    ' добавляем строку в диапазон для удаления
                    If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
                End If
            Next word
        Next
     
        ' если подходящие строки найдены, то: (оставьте одну из 2 следующих строк)
        If Not delra Is Nothing Then delra.EntireRow.Hidden = True    ' скрываем их
        If Not delra Is Nothing Then delra.EntireRow.Delete    ' удаляем их
    End Sub

    Понравилась статья? Поделить с друзьями:
  • Excel макрос очистить столбец
  • Excel макрос очистить буфер обмена
  • Excel макрос отобразить скрытый лист в excel
  • Excel макрос отобразить все ячейки
  • Excel макрос открыть файл если нет то создать