#excel #vba
#excel #vba
Вопрос:
Я пытаюсь прочитать или найти заголовок столбца, который окрашен в любой цвет, сохранить только те и удалить остальные.
При каждом изменении данных любое имя столбца или заголовок могут быть любого цвета.
Я получаю
ошибка 438 «объект не поддерживает этот метод свойства»
в строке Set Body = ........
Я не могу понять, верна ли моя логика для метода выбора случая или если оператор If решит проблему.
Option Explicit
Sub delcol()
Dim header As Range, body As Range, col As Long, found As Boolean, wsh As Worksheet, wb As Workbook
Dim HasColor As Range
Dim currentColumn As Integer
Set header = ActiveWorkbook.Worksheets("Main").UsedRange.Rows(1).Columns
Set body = ActiveWorkbook.Worksheets("Main").Offset(1).Columns
For col = 1 To header.Count
found = HasColor(body(col), vbGreen)
Select Case header
Case Is = found
Case Else
If InStr(1, _
ActiveWorkbook.Worksheets("Main").UsedRange.Cells(1, currentColumn).Value, _
"found", vbBinaryCompare) = 0 Then
ActiveWorkbook.Worksheets("Main").Columns(col).Delete
End If
End Select
Next
End Sub
Комментарии:
1. Как эти ячейки получают цвет? Вручную, через
VBA
или черезConditional Formatting
? Находится ли код вActiveWorkbook
?
Ответ №1:
Удалить столбцы, не содержащие указанный цвет в заголовке
- Это решение для начинающих и промежуточного уровня, которое вычислит последний столбец в указанном листе, используя его строку заголовка. Затем он будет выполнять цикл от последнего до указанного первого столбца и проверять каждую ячейку в строке заголовка, если ее цвет заливки НЕ зеленый (
vbGreen
). Если это так (не зеленый), он скроет / удалит столбец. - Код будет работать только для вручную заданных цветов в строке заголовка (вкл. через
VBA
) . Это не будет работать дляConditional Formatting
. - Код должен быть скопирован в стандартный модуль, например
Module1
. - Крайне важно, чтобы, если это должно произойти в книге, содержащей этот код, все вхождения
ActiveWorkbook
были заменены наThisWorkbook
. - Перед запуском этого кода настройте две константы:
hRow
(Строка заголовка) иFirst
(Первый столбец). - Обратите внимание, что вы не можете отменить эту операцию. Поэтому код использует
Hidden
вместоDelete
для целей тестирования. Если код работает для вас, закомментируйте строкуws.Columns(j).Hidden = True
и раскомментируйте строкуws.Columns(j).Delete
.
Код
Option Explicit
Sub deleteColumns()
' Define constants.
Const hRow As Long = 1
Const First As String = "A"
' Define worksheet.
Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets("Main")
' Show all columns.
ws.Columns.Hidden = False
' Calculate First Column.
Dim FirstCol As Long
FirstCol = ws.Columns(First).Column
' Calculate Last Column.
Dim LastCol As Long
LastCol = ws.Cells(hRow, ws.Columns.Count).End(xlToLeft).Column
' Declare variables.
Dim j As Long
' Loop through columns from First to Last Column.
For j = LastCol To FirstCol Step -1
' Check color in current cell.
If Not ws.Cells(hRow, j).Interior.Color = vbGreen Then
' Test with 'Hidden', later change to 'Delete'.
ws.Columns(j).Hidden = True
'ws.Columns(j).Delete
End If
Next j
End Sub
Sub showColumns()
ActiveWorkbook.Worksheets("Main").Columns.Hidden = False
End Sub
Комментарии:
1. Спасибо за подробное объяснение, оно работает, спасибо… @VBasic2008
Ответ №2:
Не могли бы вы опубликовать весь код? Я не вижу строки с
SetBody=...
Однако, что делает ваш
HasColor(body(col), vbGreen)
сделать точно?
Однако один вопрос: вы пытаетесь добиться того, чтобы все столбцы, в которых заголовок (например, верхняя ячейка), который не имеет никакого цвета, удалялись при выполнении, верно?