0

このサイトを利用するのは初めてなので、説明不足で申し訳ありません。行の内容に基づいて行を非表示/非表示にするマクロを使用していますが、より高速にしたいだけです。チェックボックスを使用して、ボックスがチェックされると、列 D に「x」があるすべての行が再表示され、「x」がない行は非表示になります。D ではなく列 C を参照することを除いて、チェックを外しても同じことが起こります。

現在、このコードは機能しています。これをたくさんの人と共有しているので、思ったよりも少し遅いです。それをスピードアップする方法についてのアイデアはありますか?私は VB にまったく慣れていません (インターネットは驚くほど賢く、優れた教師です) が、それは問題ではありません。私はすでにコードを改善しました-各行を選択してから列を参照する前に、それはひどかったです。(できれば画面を動かさずに)スピードアップするアイデアは素晴らしいでしょう。

どうもありがとう、DS

Sub NewLuxCheck()
    Dim x As Integer
    NumRows = Range("A42", "A398").Rows.Count
    Range("A42").Select
    If ActiveSheet.Shapes("checkbox2").OLEFormat.Object.Value = 1 Then
        For x = 42 To NumRows + 41 Step 1
            If Worksheets("Base").Range("D" & x).Value = "x" Then
                Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = False
            Else
                Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = True
            End If
        Next
    Else
        For x = 42 To NumRows + 41 Step 1
            If Worksheets("Base").Range("C" & x).Value = "x" Then
            Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = False
            Else
                Worksheets("Base").Range(x & ":" & x).EntireRow.Hidden = True
            End If
        Next
    End If
    MsgBox ("Done")
End Sub
4

1 に答える 1

0

配列数式を使用して、「x」値が発生する行番号を含む配列を Excel に返すことができます。高速になりますが、コードを再編成して別の関数を作成する必要があります。

この例では、配列数式が列 'D' のセルの値が 'x' である行を検索します。次に、この行番号の文字列が「A1、A5、A10」の形式で作成されます...「x」が行1、5、10で見つかったことを意味します。最後に Range(rowsJoind).EntireRow.Hidden を使用して、すべての行を 1 ステップで非表示/非表示にします。

'x' とは異なる値を持つ行については、'=IF({0}<>""x"", ROW({0}), -1)' のような数式を使用する必要があります。

Sub test()
    Dim inputRange As Range
    Dim lastRow As Long
    Dim myFormula As String
    Dim rowsJoined As String, i As Long
    Dim result As Variant

    With Worksheets("Base")
        lastRow = .Range("D" & .Rows.Count).End(xlUp).Row
        Set inputRange = .Columns("D").Resize(lastRow)

        Application.ReferenceStyle = xlR1C1
        myFormula = "=IF({0}=""x"", ROW({0}), -1)"
        myFormula = VBA.Strings.Replace(myFormula, "{0}", inputRange.Address(ReferenceStyle:=xlR1C1))
        result = Application.Evaluate(myFormula)
        result = Application.Transpose(result)
        Application.ReferenceStyle = xlA1

        For i = LBound(result) To UBound(result)
            If (result(i) > -1) Then
                rowsJoined = rowsJoined & "A" & result(i) & IIf(i < UBound(result), ",", "")
            End If
        Next i

        .Range(rowsJoined).EntireRow.Hidden = False
    End With
End Sub
于 2013-08-07T11:30:41.213 に答える