Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Удалить столбцы, НЕ содержащие набор слов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить столбцы, НЕ содержащие набор слов (Формулы/Formulas)
Удалить столбцы, НЕ содержащие набор слов
Lans90 Дата: Воскресенье, 12.04.2015, 14:12 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Добрый день.

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

[vba]
Код

Sub Delete_columns()
Dim i&
List = Array("Column1", "Column2", "Column3") 'список слов'
Application.ScreenUpdating = False
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
     For Each word In List
         If Cells(1, i) = word Then Columns(i).Delete
     Next word
Next
Application.ScreenUpdating = True
End Sub
[/vba]

Но мне наоборот нужно такие столбцы не удалять, и замена '=' на '<>' здесь не поможет, так как тогда он вообще последовательно всю таблицу удалит. Есть вариант, но мне он кажется слишком некрасивым, хотелось бы, чтобы была возможность задать массив значений как в первом примере (а не перечислять в if кучу условий):

[vba]
Код

Sub Delete_columns()
Dim i&
Application.ScreenUpdating = False
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
  If Cells(1, i) = "Column1" AND If Cells(1, i) = "Column2" AND If Cells(1, i) = "Column3" Then Columns(i).Delete
Next
Application.ScreenUpdating = True
End Sub
[/vba]
Заранее спасибо.
 
Ответить
СообщениеДобрый день.

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

[vba]
Код

Sub Delete_columns()
Dim i&
List = Array("Column1", "Column2", "Column3") 'список слов'
Application.ScreenUpdating = False
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
     For Each word In List
         If Cells(1, i) = word Then Columns(i).Delete
     Next word
Next
Application.ScreenUpdating = True
End Sub
[/vba]

Но мне наоборот нужно такие столбцы не удалять, и замена '=' на '<>' здесь не поможет, так как тогда он вообще последовательно всю таблицу удалит. Есть вариант, но мне он кажется слишком некрасивым, хотелось бы, чтобы была возможность задать массив значений как в первом примере (а не перечислять в if кучу условий):

[vba]
Код

Sub Delete_columns()
Dim i&
Application.ScreenUpdating = False
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
  If Cells(1, i) = "Column1" AND If Cells(1, i) = "Column2" AND If Cells(1, i) = "Column3" Then Columns(i).Delete
Next
Application.ScreenUpdating = True
End Sub
[/vba]
Заранее спасибо.

Автор - Lans90
Дата добавления - 12.04.2015 в 14:12
buchlotnik Дата: Воскресенье, 12.04.2015, 14:28 | Сообщение № 2
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
ну если в лоб: [vba]
Код
Sub Delete_columns()
Dim i&, j&
List = Array("Column1", "Column2", "Column3")
Application.ScreenUpdating = False
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
     j = 0
     For Each word In List
         If Cells(1, i) = word Then j = j + 1
     Next word
     If j = 0 Then Columns(i).Delete
Next
Application.ScreenUpdating = True
End Sub
[/vba]
 
Ответить
Сообщениену если в лоб: [vba]
Код
Sub Delete_columns()
Dim i&, j&
List = Array("Column1", "Column2", "Column3")
Application.ScreenUpdating = False
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
     j = 0
     For Each word In List
         If Cells(1, i) = word Then j = j + 1
     Next word
     If j = 0 Then Columns(i).Delete
Next
Application.ScreenUpdating = True
End Sub
[/vba]

Автор - buchlotnik
Дата добавления - 12.04.2015 в 14:28
Lans90 Дата: Воскресенье, 12.04.2015, 15:44 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Большое спасибо. Почему то не подумал о таком способе решения)
 
Ответить
СообщениеБольшое спасибо. Почему то не подумал о таком способе решения)

Автор - Lans90
Дата добавления - 12.04.2015 в 15:44
vovka Дата: Вторник, 14.04.2015, 17:00 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
всем привет! рекомендую сайт для подробного разбора кода макроса!

Удалено. Несанкционированная реклама


Сообщение отредактировал Pelena - Вторник, 14.04.2015, 17:06
 
Ответить
Сообщениевсем привет! рекомендую сайт для подробного разбора кода макроса!

Удалено. Несанкционированная реклама

Автор - vovka
Дата добавления - 14.04.2015 в 17:00
krosav4ig Дата: Вторник, 14.04.2015, 17:36 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
еще вариантик
[vba]
Код
Sub Delete_columns()
     Dim rng As Range, cell As Range, tmp As Range, s, Addr$
     For Each s In Array("Column1", "Column2", "Column3")
         Set rng = ActiveSheet.UsedRange.Rows(1)
         Set cell = rng.Find(s, , xlValues, xlWhole)
         If Not cell Is Nothing Then
             Addr = cell.Address
             Do
                 If tmp Is Nothing Then _
                 Set tmp = cell Else _
                 Set tmp = Union(tmp, cell)
                 Set cell = rng.FindNext(cell)
             Loop Until cell.Address = Addr
         End If
     Next
     If Not tmp Is Nothing Then tmp.EntireColumn.Delete
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениееще вариантик
[vba]
Код
Sub Delete_columns()
     Dim rng As Range, cell As Range, tmp As Range, s, Addr$
     For Each s In Array("Column1", "Column2", "Column3")
         Set rng = ActiveSheet.UsedRange.Rows(1)
         Set cell = rng.Find(s, , xlValues, xlWhole)
         If Not cell Is Nothing Then
             Addr = cell.Address
             Do
                 If tmp Is Nothing Then _
                 Set tmp = cell Else _
                 Set tmp = Union(tmp, cell)
                 Set cell = rng.FindNext(cell)
             Loop Until cell.Address = Addr
         End If
     Next
     If Not tmp Is Nothing Then tmp.EntireColumn.Delete
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 14.04.2015 в 17:36
KSV Дата: Вторник, 14.04.2015, 20:47 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
buchlotnik, можно чуть упростить и ускорить (т.к. из внутреннего цикла будет выходить при первом же совпадении, а не гонять перебор до конца списка слов):
[vba]
Код
Sub Delete_Columns()
     Dim i&
     List = Array("Column1", "Column2", "Column3") ' список слов
     Application.ScreenUpdating = False
     For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
         For Each word In List
             If Cells(1, i) = word Then Exit For
         Next word
         If IsEmpty(word) Then Columns(i).Delete
     Next
     Application.ScreenUpdating = True
End Sub
[/vba]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
Сообщениеbuchlotnik, можно чуть упростить и ускорить (т.к. из внутреннего цикла будет выходить при первом же совпадении, а не гонять перебор до конца списка слов):
[vba]
Код
Sub Delete_Columns()
     Dim i&
     List = Array("Column1", "Column2", "Column3") ' список слов
     Application.ScreenUpdating = False
     For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
         For Each word In List
             If Cells(1, i) = word Then Exit For
         Next word
         If IsEmpty(word) Then Columns(i).Delete
     Next
     Application.ScreenUpdating = True
End Sub
[/vba]

Автор - KSV
Дата добавления - 14.04.2015 в 20:47
Hugo Дата: Вторник, 14.04.2015, 23:56 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Можно один цикл убрать:
[vba]
Код
Sub Delete_Columns()
      Dim i&
      List = "|Column1|Column2|Column3|" ' список слов
      Application.ScreenUpdating = False
      For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
              If InStr(List, "|" & Cells(1, i) & "|") = 0 Then Columns(i).Delete
      Next
      Application.ScreenUpdating = True
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Вторник, 14.04.2015, 23:56
 
Ответить
СообщениеМожно один цикл убрать:
[vba]
Код
Sub Delete_Columns()
      Dim i&
      List = "|Column1|Column2|Column3|" ' список слов
      Application.ScreenUpdating = False
      For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
              If InStr(List, "|" & Cells(1, i) & "|") = 0 Then Columns(i).Delete
      Next
      Application.ScreenUpdating = True
End Sub
[/vba]

Автор - Hugo
Дата добавления - 14.04.2015 в 23:56
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить столбцы, НЕ содержащие набор слов (Формулы/Formulas)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!