Excel:個々のセルの内容に基づいた範囲の自動作成


0

私はまだマクロに触れていないので、ここで質問しています。斜めのセルのセットにグラデーションを設定したいスプレッドシートがありますが、60以上の列がある場合は非常に時間がかかります。セルに斜めに番号が付けられているテンプレートがあります。テンプレートの小さな例を次に示します。

例

これは現在、右と下の両方に60まで続きます。簡単に数値を入力できますが、条件付きで斜めにフォーマットするのには時間がかかります。領域を選択して、この領域の同じ番号を含むすべてのセルを選択し、番号が何であれ定義された範囲を作成し、その範囲が既に存在する場合はそのセルをその既存のセルに追加する方法があるかどうかを知りたい範囲。

たとえば、範囲「main」内に「1」を含むすべてのセルを取得し、範囲「_1」を作成してセルを追加します。その後、60の範囲すべてが完了するまで繰り返します。

次に、「_ 1」から「_60」までの範囲を取り、3つのカラーグラデーションの条件付き書式を簡単に追加して、数値を削除して数式に置き換えた後、各範囲の大きい数値を強調表示する方法も必要です。私はこの部分を手動で行う必要があるかもしれませんが、各対角線に既に範囲が定義されている場合ははるかに簡単になるので、「5」を含むエリア検索セルを選択して範囲「_5」を定義する必要はありません、その後、1〜60の各数値に対して条件付きでフォーマットします(現在は60のみですが、最終的には大きくなる可能性があります)。

グラデーションを使用した1行の例を次に示します。各対角線に勾配があります。最終的に各対角線を簡単に区別できるように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色の条件付きフォーマットを行う」などのようなものです。

それよりもはるかに多くのことがあることを知っていますが、それは私が必要とするすべてです。

これが不可能かどうか教えてください。たぶんそうですが、尋ねることに害はありません。

回答:


0

それには時間がかかりましたが、私はあなたを助けることができると思います。二次対角に名前を付けることができる3つのサブルーチンを作成しました。最初は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でなければなりません)、およびnamem番目の二次対角線を指定する文字列を受け取りますマトリックスの。

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

最後に、実行する必要があるサブルーチンは、単にメインのサブです。範囲全体を選択してこのサブルーチンを実行し、作業を行う他の2つを呼び出します。

Sub main()

    Dim matriz As Range

    Set matriz = Selection

    Call name_range(matriz)

End Sub

その後、条件付き書式をすべての範囲に適用します。先ほど述べたように、範囲が作成された後に手動でグラデーションを適用できます。ただし、私の提案は、VBAプロシージャを使用して適用することです。色の境界を指定し、名前付き範囲が既に定義されている状態で、すべての名前付き範囲に適用します。

PS:VBAなしでそれを行う方法を見つけることができませんでした。ここでの最大の問題は、セカンダリダイアゴナルの名前付き範囲を定義し、ダイナミックレンジまたは何らかの基準でカラースケーリングを使用することです。お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.