首页 > 解决方案 > 使用 VBA 选择并突出显示一个随机单元格

问题描述

我目前有一个 Excel 电子表格,当用户单击 Go 时,它会为工作表中的单元格分配一个新的随机数。范围值在 20 x 25 矩阵中的 1 到 500 之间。每次用户单击“开始”按钮时,我只想随机选择一个单元格的背景颜色并将其更改为红色。下面的代码目前正在为单元格分配随机数,并选择并突出显示随机单元格。但是,当再次单击 Go 时,先前选择的单元格仍然与新选择的单元格一起突出显示。单击Go时如何对其进行编码以仅突出显示新选择的单元格?

Public Sub GenerateRandom()
    Set MyRange = Range("C4:AA23")
        For i = 1 To 500
            MyRange.Cells(i) = i
        Next
        For Each Cell In MyRange
            swapcell = 1 + Int(Rnd * 500)
            savedValue = Cell.Value
            Cell.Value = MyRange.Cells(swapcell).Value
            MyRange.Cells(swapcell) = savedValue
        Next

       With MyRange.Cells(1 + Int(Rnd * 500))
                MyRange.Cells(RndBetween(1, 500)).Interior.Color = vbRed        
      End With        
    End Sub

    Public Function RndBetween(ByVal Low, ByVal High) As Integer
       Randomize
       RndBetween = Int((High - Low + 1) * Rnd + Low)
    End Function

标签: excelvba

解决方案


如上所述,在突出显示单元格之前清除范围颜色是最快的方法。但是,如果您的单元格的背景颜色设置为其他颜色,那么以下应该可以工作:

替代解决方案: 存储单元格的位置和颜色以突出显示单元格,然后在每次运行时恢复其原始颜色。您将声明子外部的位置,以便在子结束后它不会消失。如果您的背景颜色是其他颜色,这将有所帮助。问题在于它仅在 Excel 会话期间有效,如果您关闭并保存该位置将会丢失,除非您将其保存到隐藏的工作表中 = 此任务不必要的复杂性。

    Dim OriginalCell As Range
    Dim OriginalCol

    Public Sub GenerateRandom()

    Dim myRange As Range
    Dim NewCell As Range

    Set myRange = Range("C4:AA23")

    For i = 1 To 500
        myRange.Cells(i) = i
    Next

    For Each Cell In myRange
        swapcell = 1 + Int(Rnd * 500)
        savedValue = Cell.Value
        Cell.Value = myRange.Cells(swapcell).Value
        myRange.Cells(swapcell) = savedValue
    Next

    ''''new code
    Set NewCell = myRange.Cells(RndBetween(1, MyRange.Cells.Count))

    If OriginalCell Is Nothing Then
        Set OriginalCell = NewCell
        OriginalCol = OriginalCell.Interior.Color
    Else
        OriginalCell.Interior.Color = OriginalCol
        Set OriginalCell = NewCell
        OriginalCol = OriginalCell.Interior.Color
    End If

    NewCell.Interior.Color = vbRed
    '''''

    End Sub

附带说明一下,将范围发送到数组并使用数组要快得多,但这是另一个主题。希望这可以帮助!


推荐阅读