【问题标题】:Click one cell and change all cells of the same color单击一个单元格并更改相同颜色的所有单元格
【发布时间】:2019-08-26 12:57:25
【问题描述】:

我目前正在制作一个日历,其中有些日子(每个单独的单元格)有绿色、蓝色和其他红色背景

我希望能够单击给定范围内的一个单元格(日历中的一天)。如果该单元格具有特定的背景颜色,我希望该范围内所有其他相同颜色的单元格都可以更改,并且文本为粗体。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True

    Dim cell As Range
    Dim Rng As Range
    Set Rng = ActiveWorkbook.Sheets("Tickets").Range("N11:AW20")

    For Each cell In Rng

    If Target.Interior.ColorIndex = 37 Then
        Target.Font.Bold = True
    End If

    Exit For

    Next cell

End Sub

到目前为止,目标单元格的文本变为粗体,但该范围内的其余单元格没有变为粗体。

如何让 excel 扫描范围的其余部分并应用更改?

PS:最初我希望在将鼠标悬停在单元格上时触发宏,但我找不到任何这样做的方法。

这是带有日历的文件,可让您更好地了解整个事情。

https://drive.google.com/file/d/17tveiFHu4nlw47jqmXixIQoe6j7iOTe-/view?usp=sharing

提前致谢!

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    如果您将此代码放入带有日历的工作表的模块中,它应该会激活日历范围中与当前选择具有相同背景颜色的每个单元格。

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        Dim rngCalendar As Range
        Set rngCalendar = Range("N11:AW20")
    
        If Not Intersect(Target, rngCalendar) Is Nothing Then
    
            SpeedUp True
    
            rngCalendar.Font.Bold = False
    
            Dim cel As Range
            For Each cel In rngCalendar
                If cel.Interior.ColorIndex = Target.Interior.ColorIndex Then
                    cel.Font.Bold = True
                End If
            Next cel
    
            SpeedUp False
    
        End If
    
    End Sub
    
    Private Function SpeedUp(ByVal toggleOn As Boolean)
    
        With Application
            .Calculation = IIf(toggleOn, xlCalculationManual, xlCalculationAutomatic)
            .ScreenUpdating = Not toggleOn
            .EnableEvents = Not toggleOn
        End With
    
    End Function
    

    【讨论】:

    • 太棒了,这就是诀窍!非常感谢!扫描所有东西需要这么长时间是正常的还是我的电脑速度慢?
    • 考虑到它必须更改多少个单元格,可能不是您的计算机。让我们看看关闭常用的东西是否会加快速度
    • Excel 正在实时更新您的工作表。如果您尝试在 for..next 语句之前使用 Application.ScreenUpdating = false 禁用该行为并在 for... next 语句之后使用 Application.ScreenUpdating = true 重新启用它,也许它会加快速度
    • @MikeRophone 让我知道该更改是否有帮助。我刚刚制作了一个与您列出的范围相同大小的模型 excel 文件,甚至在我添加我的 SpeedUp 函数之前,更改非常即时,所以我无法确定是否有更改
    【解决方案2】:

    问题是你的循环实际上并没有对它所在的单元格做任何事情。

    你可以把它改成这样的

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    
    Dim cell As Range
    Dim Rng As Range
    Set Rng = ActiveWorkbook.Sheets("Tickets").Range("N11:AW20")
    
        If target.Interior.Colorindex = 37 then
    
         For Each cell In Rng
    
             If cell.Interior.ColorIndex = 37 Then
               cell.Font.Bold = True
             End If
    
        Next cell
    
        End if
    
    End Sub
    

    【讨论】:

    • 感谢您的回复。我也试过了,但它只会使目标单元格变粗..
    • 这很奇怪,它对我使用你的日历有效。您确定您在没有“exit for”语句的情况下尝试过吗?因为这样可以确保您只执行一次循环。
    • 你说得对,它确实有效!复制粘贴时我一定错过了什么
    【解决方案3】:

    我认为它应该有所帮助:)

    Dim cell As Range
    Dim Rng As Range
    Dim status As Integer
    Set Rng = ActiveWorkbook.Sheets("Tickets").Range("N11:AW20")
    
    For Each cell In Rng
        If Target.Interior.ColorIndex = 37 Then
            Target.Font.Bold = True
            status = 1
            Exit For
        End If
    
    Next cell
    If status = 1 Then
        Rng.Interior.ColorIndex = 37
        Rng.Font.Bold = True
    End If
    

    【讨论】:

    • 好的,我们越来越近了,但是范围内的所有内容现在都变成蓝色和粗体了:/
    • 是的,这就是我想成为的样子……那么当它在指定范围内检测到颜色 37 时应该是蓝色和粗体?
    • 我只想突出显示相同颜色的单元格 :) 不过非常感谢,下一个答案解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多