Сохраните столбцы, заголовок столбца которых окрашен, и удалите остальные

#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)
 

сделать точно?

Однако один вопрос: вы пытаетесь добиться того, чтобы все столбцы, в которых заголовок (например, верхняя ячейка), который не имеет никакого цвета, удалялись при выполнении, верно?