0

重複行を強調表示する VBA を使用して、Excel で手順を実行しています。このプロシージャは、ワークシート関数 sumproduct の結果を評価して、行に重複があるかどうかを判断します。

評価された数式は、次のようになります。

SUMPRODUCT(--(A1:A10 = A1), --(B1:B10 = B1), --(C1:C10 = C1))

これまでのところ、手順はうまく機能していますが、非表示の行と列を評価から無視する必要があります。を使用してループ内の列の非表示の行をスキップできますがRange.Hidden = False、SUMPRODUCT から非表示の行と列を除外する方法がわかりません。

また、2 つの入れ子になったループを使用してすべての行を 2 回繰り返し、一度に 2 行ずつ値を比較しようとしましたが、N 乗または O(n 2 ) の繰り返しになるため、その方法をあきらめました。

スプレッドシートの数式 SUBTOTAL で可能なように、非表示の行を無視するように SUMPRODUCT を強制する方法はありますか?

これが私がこれまでに使用したものEvaluate(SUMPRODUCT)です:ありがとう!

Private Sub ShowDuplicateRows()

    Dim lngRow As Long
    Dim lngColumn As Long
    Dim strFormula As String

    With Selection

        For lngRow = 1 To .Rows.Count
            If Not .Rows(lngRow).Hidden Then

                strFormula = "SUMPRODUCT("
                For lngColumn = 1 To .Columns.Count
                    If Not .Columns(lngColumn).Hidden Then
                        If strFormula <> "SUMPRODUCT(" Then
                            strFormula = strFormula & ", "
                        End If
                        strFormula = strFormula _
                        & "--(" & .Columns(lngColumn).Address _
                        & " = " & .Cells(lngRow, lngColumn).Address & ")"
                    End If
                Next
                strFormula = strFormula & ")"

                If Evaluate(strFormula) > 1 Then
                    .Rows(lngRow).Font.Color = RGB(255, 0, 0)
                End If

            End If
        Next lngRow

    End With

End Sub
4

2 に答える 2

1

RowHeight/Hidden プロパティは、どの数式にも公開されていません。ソリューションは VBA である必要があります。これを実現する 1 つの方法は、必要な機能を実行するユーザー定義式 (UDF) を作成し、それを sumproduct 式で使用することです。

Public Function IsVisible(ByVal rng As Excel.Range) As Variant
    Dim varRtnVal As Variant
    Dim lRow As Long, lCol As Long
    Dim ws As Excel.Worksheet
    ReDim varRtnVal(1 To rng.Rows.Count, 1 To rng.Columns.Count)
    For lRow = 1& To rng.Rows.Count
        For lCol = 1& To rng.Columns.Count
            varRtnVal(lRow, lCol) = CDbl(-(rng.Cells(lRow, lCol).RowHeight > 0&))
        Next
    Next
    IsVisible = varRtnVal
End Function

次に、式は次のようになります。

=SUMPRODUCT(IsVisible($A$2:$A$11),--($A$2:$A$11=1),--($B$2:$B$11=1),--($C$2:$C$11=1))
于 2010-01-29T23:49:34.280 に答える
0

これは完全に更新されたコードです。最初にメイン プロシージャ、次にユーザー定義関数です。

ネストされたループを UDF に配置する方がメイン プロシージャに配置するよりも高速である理由を誰かが説明できる場合は、大いに感謝します。再びOorangに感謝します!

IsVisible UDF のバージョンをもう少し柔軟にしました。パラメータとして渡された範囲を使用できます。何も渡されない場合は を使用しますApplication.Caller

Private Sub ShowDuplicateRows()

    Dim lngRow As Long
    Dim lngColumn As Long
    Dim strFormula As String

    With Selection

        For lngRow = 1 To .Rows.Count
            If Not .Rows(lngRow).Hidden Then

                strFormula = "SUMPRODUCT(--(ISVISIBLE(" _
                & .Columns(1).Address & "))"
                For lngColumn = 1 To .Columns.Count
                    If Not .Columns(lngColumn).Hidden Then
                        strFormula = strFormula _
                        & ", --(" & .Columns(lngColumn).Address _
                        & " = " & .Cells(lngRow, lngColumn).Address & ")"
                    End If
                Next
                strFormula = strFormula & ")"

                If Evaluate(strFormula) > 1 Then
                    .Rows(lngRow).Font.Color = RGB(255, 0, 0)
                Else
                    .Rows(lngRow).Font.ColorIndex = xlAutomatic
                End If

            End If
        Next lngRow

    End With

End Sub

Public Function IsVisible(Optional ByVal Reference As Range) As Variant

    Dim varArray() As Variant
    Dim lngRow As Long
    Dim lngColumn As Long

    If Reference Is Nothing Then Set Reference = Application.Caller

    With Reference

        ReDim varArray(1 To .Rows.Count, 1 To .Columns.Count)

        For lngRow = 1 To .Rows.Count
            For lngColumn = 1 To .Columns.Count
                varArray(lngRow, lngColumn) _
                = Not .Rows(lngRow).Hidden _
                And Not .Columns(lngColumn).Hidden
            Next lngColumn
        Next lngRow

    End With

    IsVisible = varArray

End Function
于 2010-01-30T01:19:42.987 に答える