Удалить все ячейки определенного цвета

Это кажется относительно простым и, насколько я понимаю, возможно. Но я не могу понять это или найти именно то, что ищу в Интернете.

У меня есть данные Excel в столбце A, и некоторые из них синие (0,0,255), некоторые красные (255,255,255), некоторые зеленые (0, 140, 0). Я хочу удалить все синие данные.

Мне сказали, что:

Sub test2()
    Range("A2").DisplayFormat.Font.Color
End Sub

Дает мне цвета ... но когда я запускаю, он говорит о недопустимом использовании свойства и выделяет .color

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

Итак, я попробовал:

Sub test()

Dim wbk As Workbook
Dim ws As Worksheet
Dim i As Integer
Set wbk = ThisWorkbook
Set ws = wbk.Sheets(1)

Dim cell As Range

With ws
    For Each cell In ws.Range("A:A").Cells
        'cell.Value = "'" & cell.Value
        For i = 1 To Len(cell)
            If cell.Characters(i, 1).Font.Color = RGB(0, 0, 255) Then
                If Len(cell) > 0 Then
                    cell.Characters(i, 1).Delete
                End If
                If Len(cell) > 0 Then
                    i = i - 1
                End If
            End If
        Next i
    Next cell
End With

End Sub

Я нашел это в Интернете как решение в нескольких местах, но когда я запускаю его, кажется, что ничего не происходит.

Вы имеете в виду, что некоторые данные в данной ячейке имеют разные цвета? Кроме того, если применяется к ячейке, это условное форматирование или обычное заполнение?

QHarr 14.09.2018 14:53

Это не условное форматирование, оно было скопировано и вставлено из текстового документа. И одна ячейка содержит только один цвет. Например, A1 = синий шрифт, A2 = красный шрифт, A3 = зеленый шрифт, тогда следующие 4 ячейки могут быть синими ... тогда следующие 2 могут быть зелеными ... и т. д.

XCELLGUY 14.09.2018 14:57

Я воссоздал это вручную, и ваш макрос сработал для меня, он избавился от любых ячеек с цветом 0,0,255, вы уверены, что лист правильный?

Ricards Porins 14.09.2018 15:01

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

XCELLGUY 14.09.2018 15:06

одинаковый ли цвет шрифта для всех символов ячейки?

DisplayName 14.09.2018 15:21

@XCELLGUY, одинаковый ли цвет шрифта для всех символов ячейки?

DisplayName 14.09.2018 15:36

да, это один и тот же цвет для всех символов ячейки

XCELLGUY 14.09.2018 15:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
7
3 659
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Что-то вроде следующего, когда все подходящие ячейки собираются вместе с помощью Union и удаляются за один раз. При удалении целых строк по отдельности вам всегда нужно выполнять цикл в обратном порядке. Удаление / очистка за один раз более эффективно.

Sub test()
    Dim wbk As Workbook, ws As Worksheet
    Dim i As Long, currentCell As Range, unionRng As Range

    Set wbk = ThisWorkbook
    Set ws = wbk.Worksheets("Sheet1")

    With ws
        For Each currentCell In .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)  '<==assuming actual data present
            If  currentCell.Font.Color = RGB(0, 0, 255) Then
                If Not unionRng Is Nothing Then
                    Set unionRng = Union(currentCell, unionRng)
                Else
                    Set unionRng = currentCell
                End If
            End If
        Next
    End With
    If Not unionRng Is Nothing Then unionRng.Delete
End Sub

Прошло некоторое время, но я на самом деле ищу способ удалить десятки тысяч строк одновременно, и большие объединения IIRC могут быть проблематичными и медленными - просто то, что нужно учитывать.

user1274820 22.01.2021 22:20

вы можете использовать метод Range объекта Autofilter() с оператором xlFilterFontColor;

Sub test()       
    With ThisWorkbook.Sheets(1)
        With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
            .AutoFilter Field:=1, Criteria1:=RGB(0, 0, 255), Operator:=xlFilterFontColor
            If Application.WorksheetFunction.Subtotal(103, .Cells) > 0 Then .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).ClearContents
        End With
        .AutoFilterMode = False
        If .Range("A1").Font.Color = RGB(0, 0, 255) Then .Range("A1").ClearContents ' check first row, too (which is excluded by AutoFilter)
    End With
End Sub

Я не хочу удалять строку ... только текст в ячейке

XCELLGUY 14.09.2018 16:41

@XCELLGUY, было бы неплохо с вашей стороны дать хороший отзыв людям, пытающимся вам помочь

DisplayName 14.09.2018 17:34
Ответ принят как подходящий

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

For Each cel In ActiveSheet.Range("A1:A30")
    If cel.Font.Color = RGB(0, 0, 255) Then cel.Delete
Next cel

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

Dim rng As Range
Set rng = Application.InputBox("Select a Cell:", "Obtain Range Object", Type:=8)

    With ActiveSheet
        Dim lr As Long
        lr = Cells(Rows.Count, 1).End(xlUp).Row

        Dim x As Long
        x = rng.Row

        For i = lr To x Step -1
            If .Cells(i, 1).Font.Color = rng.Font.Color Then .Cells(i, 1).Clear
        Next i
    End With 

Хорошо, это работает ... Мне пришлось добавить «dim cel as range» в начале и изменить «.delete» на «.clearcontents», потому что в противном случае все сдвинулось бы вверх ... и я не хотел этого ... и я изменил диапазон на A: A, потому что я не знаю, сколько строк у меня будет, и он будет отличаться ... Он работает ... но медленно ... вероятно, по причинам, указанным ниже QHarr, но я не мог заставить его работать.

XCELLGUY 14.09.2018 17:05

Скопируйте, просто указав базовый код, Delete использовался, потому что он был в вашем вопросе. Я рад, что вы смогли изменить его в соответствии со своими потребностями.

GMalc 14.09.2018 17:09

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

XCELLGUY 14.09.2018 17:20
Option Explicit
Sub test2()

Dim cel As Range
Dim LR As Long

LR = Cells.Find(What: = "*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row

For Each cel In ActiveSheet.Range("A1:A" & LR)

    If cel.Font.Color = RGB(0, 0, 255) Then cel.ClearContents
Next cel
End Sub

Другие вопросы по теме