С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/120: Рейтинг темы: голосов - 120, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9

Удалить столбцы с определенным заголовком

01.12.2014, 17:21. Показов 23782. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья,

пытаюсь найти макрос для чтобы удалять ненужные столбцы т.к. каждый день имею дело с таблицами содержащими более 100 столбцов - предыдущий работник делал все это вручную.

Вот нашел какой-то макрос на просторах интернета:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub deleteIrrelevantColumns()
    Dim keepColumn As Boolean
    Dim currentColumn As Integer
    Dim columnHeading As String
 
    currentColumn = 1
    While currentColumn <= ActiveSheet.UsedRange.Columns.Count
        columnHeading = ActiveSheet.UsedRange.Cells(1, currentColumn).Value
 
        'CHECK WHETHER TO KEEP THE COLUMN
        keepColumn = False
        If columnHeading = "State" Then keepColumn = True
        If columnHeading = "Customer name" Then keepColumn = True
        If columnHeading = "Gallons" Then keepColumn = True
        If columnHeading = "Supplier" Then keepColumn = True
        If columnHeading = "Carrier" Then keepColumn = True
 
 
        If keepColumn Then
        'IF YES THEN SKIP TO THE NEXT COLUMN,
            currentColumn = currentColumn + 1
        Else
        'IF NO DELETE THE COLUMN
            ActiveSheet.Columns(currentColumn).Delete
        End If
 
        'LASTLY AN ESCAPE IN CASE THE SHEET HAS NO COLUMNS LEFT
        If (ActiveSheet.UsedRange.Address = "$A$1") And (ActiveSheet.Range("$A$1").Text = "") Then Exit Sub
    Wend
 
End Sub
Но почему-то он удаляет все столбцы, а не только те, которые я указываю. Пожалуйста, помогите.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.12.2014, 17:21
Ответы с готовыми решениями:

Помогите удалить надоевшую панель с заголовком 'Обновить'
Помогите удалить надоевшую панель с заголовком 'Обновить' На ней всего одна кнопка 'Не обновлять' но в настройке нет ни такой кнопки ни...

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

Ожидать появления окна с заголовком "Удалить файл"
Доброе утро. Подскажите пожалуйста, как ожидать появления окна с заголовком &quot;Удалить файл&quot; и в случае его появления - писать...

16
3946 / 2339 / 790
Регистрация: 02.11.2012
Сообщений: 6,214
01.12.2014, 17:39
данный макрос удаляет все столбцы кроме "State" "Customer name" "Gallons" "Supplier" "Carrier" этих.
0
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
01.12.2014, 18:26  [ТС]
уже разобрался - не подумал что регистр имеет значение. Все равно спасибо.
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
01.12.2014, 18:32
Kharon, Если лист/книга не перегружена формулами, то удалить ненужные столбцы можно также так :

Visual Basic
1
2
3
4
5
6
7
Private Sub Test()
    Dim iCell As Range, iColumn As Variant
    For Each iColumn In Array("State", "Customer name", "Gallons", "Supplier", "Carrier")
        Set iCell = ActiveSheet.UsedRange.Rows(1).Find(iColumn, , xlValues, xlWhole, , , False)
        If Not iCell Is Nothing Then iCell.EntireColumn.Delete
    Next
End Sub
Если же перегружен, то так :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Test2()
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    
    Dim iHeader As Range, iCell As Range, iColumn As Variant
    Set iHeader = ActiveSheet.UsedRange.Rows(1)
    For Each iColumn In Array("State", "Customer name", "Gallons", "Supplier", "Carrier")
        Set iCell = iHeader.Find(iColumn, , xlValues, xlWhole, , , False)
        If Not iCell Is Nothing Then iCell.EntireColumn.Delete
    Next
    
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
End Sub
2
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
03.12.2014, 17:00  [ТС]
Я пока еще не разбираюсь в VBA, не могли бы вы объяснить в чем разница между ними двумя?
0
3946 / 2339 / 790
Регистрация: 02.11.2012
Сообщений: 6,214
03.12.2014, 17:07
Цитата Сообщение от Kharon Посмотреть сообщение
в чем разница между ними двумя?
во втором в начале кода отключено обновление экрана (строка 2) и автопересчет формул отключен (строка 3).
В конце кода все назад включено. Данные отключения ускоряют работу макроса.
1
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
03.12.2014, 17:16  [ТС]
Vlad,

не могли бы еще помочь?
Пытаюсь создать макрос, который бы удалял строки которые содержат в столбце Н значение "IL". вот нашел такой код, но он почему-то каждый раз удаляет несколько строк из таблицы, но не все. В чем проблема?

Вот код:


Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub NorthernPlains()
 Dim MyCol As String
 Dim i As Integer
For i = 1 To Range("C" & "65536").End(xlUp).Row Step 1
If Application.WorksheetFunction.CountIf(Range("A" & i & ":AZ" & i), "IL") > 0 Then
 Range("C" & i).EntireRow.Delete
End If
Next i
 
 End Sub
т.е. приходится его перезапускать, пока не удалятся все строки с этим значением
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.12.2014, 17:35
Если Вы считаете, что для решения данного вопроса, нам нужна стандартная функция рабочего листа =СЧЁТЕСЛИ(), хотя на самом деле, это не так, то :

Visual Basic
1
2
3
4
5
6
Private Sub Test3()
    Dim iRow&
    For iRow = Cells(Rows.Count, "H").End(xlUp).Row To 1 Step -1
        If Application.CountIf(Cells(iRow, "H"), "IL") > 0 Then Rows(iRow).Delete
    Next
End Sub
P.S. Тоже самое удаление, только без перебора лишних ячеек столбца

Visual Basic
1
2
3
4
5
6
7
8
Private Sub Test4()
    Dim iSource As Range, iCell As Range
    Set iSource = [H:H]: Set iCell = iSource.Find("IL", , xlValues, xlWhole)
    Do Until iCell Is Nothing
       iCell.EntireRow.Delete
       Set iCell = iSource.FindNext
    Loop
End Sub
1
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
03.12.2014, 18:07  [ТС]
Pashulka,

Спасибо огромное! А если я еще какие значения захочу добавить, могу ли я их просто через запятую в кавычках перечислить?

Visual Basic
1
Set iSource = [H:H]: Set iCell = iSource.Find("IL", "IN", "IA" , xlValues, xlWhole)
похоже что нет - выдает ошибку.

Добавлено через 5 минут
кстати, одна деталь. Я создал кнопку для выполнения этих макросов, но получается, что когда я ее нажимаю, она удаляется вместе со столбцами/строками. есть-ли способ поставить эту кнопку поверх книги или как-нибудь, чтобы макрос ее не задевал?
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.12.2014, 18:37
1) А вот для таких целей я, как раз, и использую вышеупомянутую функцию СЧЁТЕСЛИ()

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Test3v2()
    Dim iRow&, iArr As Variant
    iArr = Array("IL", "IN", "IA")
    
    With Application
         For iRow = Cells(Rows.Count, 8).End(xlUp).Row To 1 Step -1
             If .Sum(.CountIf(Cells(iRow, 8), iArr)) > 0 Then Rows(iRow).Delete
         Next
    End With
End Sub
P.S. Возможно не помешает добавить ScreenUpdating/Calculation (см. Test2)

2) Find это всего лишь поиск - CTRL+F (правда мы можем последовательно удалять ненужные строки, т.е. сначала, допустим, все "IL", затем "IN" и т.д.)

3) Выделите кнопку - затем кликните правой кнопкой мышки - выберите команду Формат объекта - закладка Свойства - переключатель супротив Не перемещать и не изменять размеры
0
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
03.12.2014, 20:02  [ТС]
Класс!

А для чего ScreenUpdating/Calculation? вроде и так неплохо работает.
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.12.2014, 20:23
Если при тестировании Вы не заметили разницы во времени, то, возможно, Вам нет смысла сейчас их использовать. Ежели в дальнейшем всё изменится, то перед тем, как создавать подобные темы, рекомендую всё-таки вспомнить о "ускорителях"
1
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
03.12.2014, 20:54  [ТС]
Да, загрузил таблицу побольше - заметно медленнее стало работать. Вставил ScreenUpdating/Calculation ,теперь всё как надо!

Добавлено через 6 минут
а как бы выглядел код если бы вместо удаления, я бы наоборот захотел строки с этими значениями оставить, а всё остальное удалить?
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.12.2014, 21:11
Лучший ответ Сообщение было отмечено Kharon как решение

Решение

Также, как и раньше, токмо вместо > 0 мы бы увидели = 0
1
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
03.12.2014, 22:53  [ТС]
Есть идеи почему макрос можеть удалять и оставшиеся строки после повторного запуска? первый раз все нормально, удаляет ненужные строки, но когда запускаю его еще раз, удаляется и то, что осталось.
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
03.12.2014, 23:12
Так может быть имеет смысл просто глянуть на книгу, где происходят подобные безобразия ?

(разумеется, достаточно "лёгкой версии", т.е. строк 100 и без конфиденциальных данных)

P.S. На всякий случай, выкладываю свою версию, где удаление значений, проистекает без проблем.
Вложения
Тип файла: zip Sample_for_Kharon.zip (6.7 Кб, 37 просмотров)
0
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 9
04.12.2014, 00:32  [ТС]
Всё, разобрался! Это мой предыдущий код удалял строку с названиями столбцов, а макрос который удалял столбцы по названию запускался после. вот и получалось, что удалялось все. Спасибо еще раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.12.2014, 00:32
Помогаю со студенческими работами здесь

Удалить две первые буквы из сформированого двунаправленого списка с звеном-заголовком. Вывести оба списка
Удалить две первые буквы из сформированого двунаправленого списка с звеном-заголовком. Вывести оба списка. Помогите написать...

Удалить из Memo строки с определенным значением
Добро! Короче в мемо есть строки при нажати на кнопку буттон должна удаляться строка котрое имеет определенное имя, но вот как сделать...

Удалить элемент в SQLite под определенным ID
cursor.moveToLast(); int a = cursor.getPosition(); sqLiteDatabase.delete(DATABASE_TABLE,null,new String{String.valueOf(a)}); //...

Удалить рисунок (с определенным именем) | MS Word
Здравствуйте Коллеги! Прошу помочь с циклом (For) - удаление рисунков. Ситуация следующая: в документе имеются n - количество...

Удалить папки не содержащие файл с определенным наименованием
Добрый день! Прошу помощи! Нужен batник который удалит все папки в заданной директории кроме тех папок, которые содержат файлы с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru