web-dev-qa-db-ja.com

列全体(列の各値)を配列に入れますか?

だから私はたくさんのことをするためにマクロを作っています。 1つは、sheet2からsheet1のセルの重複を見つけることです。シート1のcolumnAを指定して、sheet2のcolumnBの値をcolumna sheet1の値のいずれかに一致させます。

重複の削除があることはわかっていますが、削除せずにマークを付けたいだけです。

フィルタリングについて何か考えていました。フィルターするときに複数の基準を選択できることを知っているので、20の異なる値を持つ列がある場合、フィルターで5つの値を選択でき、特定の列にそれらの5つの値を持つ行が表示されます。だから私はそのマクロを記録し、コードをチェックアウトしました、そしてそれが文字列配列を使用していることがわかります。検索する各値は文字列配列にあります。列全体を指定してすべての値を文字列配列に追加する方法はありますか?

前もって感謝します

8
user1759942

アイテムを配列にロードするには、3つの方法があります。最初の方法ははるかに高速ですが、すべてを列に格納するだけです。ただし、オートフィルターに渡すことができない多次元配列を作成するため、これには注意する必要があります。

方法1:

Sub LoadArray()
    Dim strArray As Variant
    Dim TotalRows As Long

    TotalRows = Rows(Rows.Count).End(xlUp).Row
    strArray = Range(Cells(1, 1), Cells(TotalRows, 1)).Value

    MsgBox "Loaded " & UBound(strArray) & " items!"
End Sub

方法2:

Sub LoadArray2()
    Dim strArray() As String
    Dim TotalRows As Long
    Dim i As Long

    TotalRows = Rows(Rows.Count).End(xlUp).Row
    ReDim strArray(1 To TotalRows)

    For i = 1 To TotalRows
        strArray(i) = Cells(i, 1).Value
    Next

    MsgBox "Loaded " & UBound(strArray) & " items!"
End Sub

事前に値がわかっていて、それらを変数にリストしたい場合は、Array()を使用してバリアントを割り当てることができます

Sub LoadArray3()
    Dim strArray As Variant

    strArray = Array("Value1", "Value2", "Value3", "Value4")

    MsgBox "Loaded " & UBound(strArray) + 1 & " items!"
End Sub
15
Ripster

他の誰かがこの問題を抱えるかどうかわからないので、私が見つけた答えを投稿すると思いました。 @Ripsterによって投稿された配列のソリューションは気に入っています(そのおかげで、ほぼ機能しました)が、この場合は実際には機能しません。私が扱っているのは、ID列が1つある大きなデータシートです。他のシートをチェックして、そのシートに重複がないかどうかを確認します(ID列を使用)。削除せずにマークを付けて、チェックアウトできるようにします。 5万行を超える可能性のある行では、各行をループするのに長い時間がかかります。

したがって、私ができることは、ID列を他のシートからメインシートにコピーし、条件付き書式オプションを使用して重複をいくつかの色でマークすることです。 (両方の列の行をマークします)次に、列を色でフィルターして、重複をマークするために使用した色のみを表示できます。行番号でチェックしているシートに列をプログラムで追加する場合、メインシートにその列を含めることもできるので、色でフィルターをかけると、シートにどの行があったかを確認できます。

それを行った後、プログラミングをあまり行っていない同僚のために、マクロを記録してこれを自動的に調整することができます

どうもありがとうございました!


編集-追加されたコード

比較する列を選択した後、重複を赤いテキストで塗りつぶしなしでマークするコードは次のとおりです。 - Selection.FormatConditions.AddUniqueValues Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority Selection.FormatConditions(1).DupeUnique = xlDuplicate With Selection.FormatConditions(1).Font .Color = -16383844 .TintAndShade = 0 End With Selection.FormatConditions(1).StopIfTrue = False

そして、両方の列に重複がマークされているので、実際に調べたい列を選択し、フィルタリングするコードをここに配置します。

_`Selection.AutoFilter
ActiveSheet.Range("$C$1:$C$12").AutoFilter Field:=1, Criteria1:=RGB(156, 0 _
    , 6), Operator:=xlFilterFontColor`
_

(私のテストでは、フィルターする列として列cを使用しました。これは、cells()参照またはrange(cells(), cells())並べ替え参照を使用してプログラムで実行できます

皆様の今後のご活躍をお祈り申し上げます。もう一度@ripsterに感謝

1
user1759942