Excel:根据单个单元格内容自动创建范围

Excel:根据单个单元格内容自动创建范围

我还没有接触过宏,所以我在这里问。我有一个电子表格,我想将渐变设置为一组对角线单元格,但当你有 60 多个列时,这会非常耗时。我有一个模板,其中的单元格按对角线编号。以下是该模板的一个小示例:

例子

目前,右侧和下方的数值均为 60。我可以轻松填写​​数字,但对角线进行条件格式化将需要很长时间。我想知道是否有一种方法可以只选择一个区域,然后选择该区域内包含相同数字的所有单元格,并创建一个定义的范围,将其命名为任意数字,如果该范围已经存在,则将该单元格添加到现有范围。

例如,获取“main”范围内所有包含“1”的单元格,然后创建范围“_1”并向其中添加单元格。然后重复此操作,直到所有 60 个范围都完成。

然后,我还需要一种方法来获取范围“_1”到“_60”,并轻松地为它们添加条件格式,以获得 3 种颜色渐变,以便在我删除数字并用公式替换后突出显示每个范围内的较大数字。我可能必须手动完成这部分,但如果已经为每个对角线定义了范围,那么它会容易得多,这样我就不必去选择区域查找包含“5”的单元格,定义范围“_5”,然后为每个数字 1-60(目前只有 60,但最终可能会更大)设置条件格式。

以下是渐变线条的示例。每条对角线都有渐变。最终可能会有 3 种不同的颜色,以便轻松区分每条对角线,这样您就可以一眼看出您要查找的内容。渐变示例:

渐变示例

我可以在确定范围后手动进行渐变。

我知道这很可能是不可能的,但我想看看,因为我有相当多的事情要做,而且不喜欢花几个小时手动格式化数百个单元格。

我所需要的简单概述如下:

for all cells inside range "Main"
[  
    read cell

    if range "-[cell]" exists  
    [  
        add cell to range  
    ]  
    else  
    [  
        define range named "-[cell]"  
        add cell to range  
    ]  
]

一旦所有单元格都处于一个范围内,我希望有东西可以帮我做渐变。例如“对于每个范围 -1 到 -60,执行 3 种颜色条件格式”。

我知道还有很多事情要做,但这基本上就是我所需要的。

如果这不可能,请告诉我。这很可能是不可能,但问问也没什么坏处。

答案1

这花了一段时间,但我想我可以帮你。我写了三个可以命名次对角线的子程序。第一个是select_diagonal

Sub select_diagonal(matriz As Range, m As Integer, name As String)

Dim n As Integer, i As Integer, first As Boolean
Dim diag As Range

n = matriz.Rows.Count
'm must be at most 2n-1 (number of diagonals)
first = True

If m <= n Then
    For i = 0 To m - 1 Step 1
        If first Then
            Set diag = matriz.Item(1).Offset(i, m - i - 1)
            first = False
        Else
            Set diag = Union(diag, matriz.Item(1).Offset(i, m - i - 1))
        End If
    Next i

Else
    For i = (m Mod n) To m - (m Mod n) - 1 Step 1
        If first Then
            Set diag = matriz.Item(1).Offset(i, m - i - 1)
            first = False
        Else
            Set diag = Union(diag, matriz.Item(1).Offset(i, m - i - 1))
        End If
    Next i
End If

ActiveWorkbook.Names.Add name:=name, RefersTo:=diag

End Sub

它接收一个方阵作为参数作为范围(60x60 范围)、一个整数 m(必须最多为 2*n-1,即矩阵的对角线数)和一个name用于命名矩阵第 m 个次对角线的字符串。

还有name_range子函数,接收一个方阵作为范围,循环矩阵的每个次对角线并赋予它一个命名范围(根据您的指示,第 k 个次对角线命名为“_k”)

Sub name_range(matriz As Range)

    Dim n As Integer, ii As Integer
    n = matriz.Rows.Count

    For ii = 1 To 2 * n - 1
        Call select_diagonal(matriz, ii, "_" & CStr(ii))
    Next ii

End Sub

最后,您必须运行的子程序只是主子程序。只需选择整个范围并运行此子程序,即可调用其他两个子程序为您完成工作。

Sub main()

    Dim matriz As Range

    Set matriz = Selection

    Call name_range(matriz)

End Sub

之后,只需将条件格式应用于每个范围即可。正如您刚才所说,您可以在设置范围后手动应用渐变。但是,我的建议是通过 VBA 过程应用它。只需指定颜色范围,并在已定义命名范围的情况下,将其应用于每个命名范围。

PS:如果没有 VBA,我找不到办法做到这一点。这里最大的问题是定义次对角线的命名范围,并使用动态范围或某些标准的颜色缩放。希望这能有所帮助。

相关内容