例文を使って繰り返し業務を時短

【マクロ・VBA】配列を使用して、データをチェックする

エクセル、マクロ、VBAで配列を使って別シートのデータがあるか調べる方法 VBA

配列とは

配列とは、同一のデータ型の複数の値を一つの変数にまとめて格納するためのオブジェクトです。例えば、5つの整数を格納したい場合、それぞれの整数を個別に変数に格納するのではなく、整数型の配列に格納することができます。

以下は、VBAの配列の例です。5つの整数を配列に格納し、合計を計算するコードです。

Dim arr(4) As Integer ' 5つの整数を格納する配列を宣言
arr(0) = 1
arr(1) = 3
arr(2) = 5
arr(3) = 7
arr(4) = 9

Dim total As Integer ' 合計を格納する変数を宣言
total = 0

For i = 0 To 4 ' 配列の要素を順番に取り出し、合計を計算
    total = total + arr(i)
Next i

MsgBox "合計は" & total & "です。"

この例では、5つの整数を配列 arr に格納し、For ループで順番に取り出して合計を計算しています。配列の要素は0から始まることに注意してください。配列の要素数は配列を宣言するときに指定します。この例では、5つの整数を格納するため、Dim arr(4) As Integer としています。

特定列の数値データを配列に入れて、その配列内に別シートの列のデータが含まれているか確認する方法

Sub 配列とシートの列の検索()
    Dim arrData() As Variant 'データを入れる配列
    Dim i As Long 'ループ用変数
    Dim cell As Range 'セル用変数
    
    'データを取得するシートと範囲を指定する
    With Worksheets("Sheet1")
        arrData = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
    End With
    
    '検索するシートと範囲を指定する
    With Worksheets("Sheet2")
        'データがあるセルを検索するループ
        For i = 1 To UBound(arrData)
            Set cell = .Columns("A").Find(arrData(i, 1), LookIn:=xlValues)
            If Not cell Is Nothing Then
                '見つかったらメッセージを表示
                MsgBox "データ " & arrData(i, 1) & " が見つかりました。"
            End If
        Next i
    End With
    
End Sub

解説

このコードは、Sheet1のA2から始まる列を配列に格納し、Sheet2のA列を検索して、Sheet1のデータがSheet2に含まれているかどうかを確認します。見つかった場合は、メッセージを表示します。この例では、arrDataは一次元配列で、Sheet1のA列にある数値データを格納しています。Sheet2のA列を検索するために、Findメソッドを使用しています。見つかった場合は、MsgBox関数を使用してメッセージを表示します。

特定列のテキストデータを配列に入れて、その配列内に別シートの列のデータが含まれているか確認する方法

Dim checkRange As Range
Dim cell As Range
Dim i As Long
Set checkRange = Worksheets("Sheet2").Range("A1:A10")
For Each cell In checkRange
    For i = 1 To UBound(sourceArray)
        If cell.Value = sourceArray(i) Then
            MsgBox "一致する値がありました。"
            Exit For
        End If
    Next i
Next cell

解説

  • 比較するための配列を作成する。
    • まず、比較するための配列を宣言し、必要な要素数を指定します。例えば、以下のように宣言します。(*例では、100個の要素を持つ文字列型の配列を作成しています。)
Dim targetArray() As String
ReDim targetArray(1 To 100)
  • 表内の特定列のテキストデータを配列に格納する。
    • 次に、表内の特定列のテキストデータを配列に格納します。例えば、以下のように実行します。(*Sheet1のA1からA100までのセルに格納されたテキストデータを配列に格納しています。)
Dim sourceRange As Range
Dim sourceArray() As String
Set sourceRange = Worksheets("Sheet1").Range("A1:A100")
sourceArray = Application.Transpose(sourceRange.Value)
  • 別シートの列のデータが含まれているか確認する。
    • Sheet2のA1からA10までのセルに格納されたテキストデータと、配列に格納されたテキストデータを比較し、一致する値があった場合にメッセージボックスを表示しています。
Dim checkRange As Range
Dim cell As Range
Dim i As Long
Set checkRange = Worksheets("Sheet2").Range("A1:A10")
For Each cell In checkRange
    For i = 1 To UBound(sourceArray)
        If cell.Value = sourceArray(i) Then
            MsgBox "一致する値がありました。"
            Exit For
        End If
    Next i
Next cell

別シートの列をマッチングして新シートに行を転記する

特定の列のデータを配列に入れ、その配列内に別のシートの列のデータが含まれている場合、新しいシートを作成してすべての行を転記する

Sub 列の検索_配列()
Dim arrData() As Variant 'データを格納する配列
Dim lastRow As Long 'データが存在する最終行
Dim searchRange As Range '検索する範囲
Dim searchValue As Variant '検索する値
Dim destSheet As Worksheet '出力先のシート
Dim newRow As Long '出力先の次の空白行

With Sheets("Sheet1") 'データを取得するシートの名前を指定する
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 'データが存在する最終行を取得する
    Set searchRange = .Range("A2:A" & lastRow) '検索する範囲を指定する
    arrData = searchRange.Value 'データを配列に入れる
End With

For i = LBound(arrData, 1) To UBound(arrData, 1)
    searchValue = arrData(i, 1) '検索する値を取得する
    With Sheets("Sheet2") '検索するシートの名前を指定する
        Set foundCell = .Columns("B").Find(searchValue, LookIn:=xlValues, LookAt:=xlWhole) '検索する列と検索方法を指定する
        If Not foundCell Is Nothing Then 'データが存在する場合
            If destSheet Is Nothing Then '新しいシートを作成する
                Set destSheet = Worksheets.Add(After:=Sheets(Sheets.Count))
                destSheet.Name = "Output"
                newRow = 1
            End If
            destSheet.Cells(newRow, 1).Resize(1, UBound(arrData, 2)).Value = arrData(i, 1) 'データを出力する
            newRow = newRow + 1
        End If
    End With
Next i

If Not destSheet Is Nothing Then
    destSheet.Activate
    MsgBox "処理が完了しました。"
End If
End Sub

解説

  • 3行目:Dim lastRow As Long 「lastRow」は、データが存在する最終行を表す変数の名前です。「Long」は、変数の型を表します。
  • 4行目:Dim searchRange As Range 「searchRange」は、検索する範囲を表す変数の名前です。「Range」は、範囲を表す型を表します。
  • 5行目:Dim searchValue As Variant 「searchValue」は、検索する値を表す変数の名前です。「Variant」は、変数の型を表します。
  • 6行目:Dim destSheet As Worksheet 「destSheet」は、出力先のシートを表す変数の名前です。「Worksheet」は、シートを表す型を表します。
  • 7行目:Dim newRow As Long 「newRow」は、出力先の次の空白行を表す変数の名前です。
  • 9行目:With Sheets(“Sheet1”) 「With」は、ブロックを作成するためのキーワードです。「Sheets(“Sheet1”)」は、データを取得するシートの名前を表します。
  • 10行目:lastRow = .Cells(.Rows.Count, “A”).End(xlUp).Row 「lastRow」に、データが存在する最終行を取得するための式です。”.Cells(.Rows.Count, “A”)”は、指定したシートのA列の最終行を取得します。「.End(xlUp)」は、セルの上にある最も近い空白のセルを取得します。「.Row」は、取得したセルの行番号を取得します。
  • 11行目:Set searchRange = .Range(“A2:A” & lastRow) 「searchRange」に、検索する範囲を指定するための式です。「.Range(“A2:A” & lastRow)」は、指定したシートのA列の2行目から最終行までの範囲を取得します。
  • 12行目:arrData = searchRange.Value 「arrData」に、検索するデータを配列に入れるための式です。「searchRange.Value」は、指定した範囲内のすべてを入れる
  • Forループは、配列に格納されたデータを1つずつ取り出し、そのデータを検索するための処理を行います。
    • 配列に格納されたデータを取り出すには、LBound関数とUBound関数を使用します。
      • LBound関数は、配列の最初の要素のインデックスを返し、UBound関数は、配列の最後の要素のインデックスを返します。このループ内で、検索する値を取得し、Sheet2のB列を検索します。
      • 検索方法は、LookInとLookAt引数で指定されます。LookIn引数は、検索する対象を指定し、LookAt引数は、検索する方法を指定します。ここでは、xlValuesをLookInに指定して、セルの値を検索対象としています。LookAtには、xlWholeを指定して、セルの値が完全に一致する場合に一致と判断するように指定されています。
    • 検索でデータが見つかった場合は、出力先のシートにデータを出力します。
      • ここでは、destSheet変数がNothingである場合に、新しいシートを作成しています。新しいシートを作成した場合は、シートの名前を”Output”に設定し、newRow変数を1に設定しています。次に、新しい行にデータを出力し、newRow変数をインクリメントして、次の行に移動します。
  • 最後に、destSheet変数がNothingでない場合、処理が完了したことを示すメッセージを表示し、出力先のシートをアクティブにします。これにより、ユーザーが出力先のシートを簡単に確認できます。

リストの文字があるかどうかチェック

このコードは、ExcelのVBAマクロで、基_アクティブシートのリストに含まれる文字列が相手_アクティブシートのリストにあるかどうかをチェックし、基_アクティブシートの対応するセルの背景色を変更します。

*Activesheetの一列目の文字列と右隣りのsheetの一列目の文字列のチェック

*一列目のセルをカラー表示

Sub リストの文字があるかどうかチェック()

With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With

'基_アクティブシート
Dim wb1 As Workbook
    Set wb1 = ThisWorkbook
Dim ws1 As Worksheet


    Set ws1 = wb1.ActiveSheet
Dim LastRow1 As Long
    LastRow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
Dim LastCol1 As Long
    LastCol1 = ws1.Cells(1, Columns.Count).End(xlToLeft).Column

'相手_アクティブシートの右のシート
Dim wb2 As Workbook
    Set wb2 = ThisWorkbook
Dim ws2 As Worksheet
    Set ws2 = wb2.ActiveSheet.Next
Dim LastRow2 As Long
    LastRow2 = ws2.Cells(Rows.Count, 2).End(xlUp).Row
Dim LastCol2 As Long
    LastCol2 = ws2.Cells(2, Columns.Count).End(xlToLeft).Column
    
    
'処理(マッチング)
Dim SeachList() As String
Dim i As Long

'処理①相手シートのキーとアイテム取得
    j = 1

    '配列の要素数を指定
    ReDim Preserve SeachList(LastRow2)

    'リストの文字列を配列に格納
    For i = 2 To LastRow2
        ReDim Preserve SeachList(j)
        SeachList(j) = ws2.Cells(i, 1)
        j = j + 1
    Next i

'処理②基_アクティブシートに転記
   For i = 2 To LastRow1

        For j = 1 To UBound(SeachList)

            'リストの文字列が含まれている場合、セルの背景色を塗る
            If InStr(ws1.Cells(i, 1), SeachList(j)) > 0 Then
                ws1.Cells(i, 1).Interior.Color = 65535
            Else
                'リストの文字列が含まれていない場合、for抜ける
                If j = UBound(SeachList) Then
                    Exit For
                End If
            End If
        
        Next j
    Next i
    
'キーアイテム削除
Set myDic = Nothing
Set wb2 = Nothing
Set ws2 = Nothing

With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With

MsgBox "完了"
End Sub

解説

  • 2つのアクティブシートのリストの文字列を取得し、配列に格納します。
  • 基_アクティブシートの各セルについて、相手_アクティブシートのリストに含まれる文字列があるかどうかをチェックします。
  • リストに含まれる文字列がある場合、基_アクティブシートの対応するセルの背景色を変更します。

*処理の途中でExcelの画面更新や自動計算、アラート表示をオフにするなど、処理速度を向上させるための設定がされています。

*最後に、処理が完了したことを示すメッセージボックスが表示されます。

コメント

タイトルとURLをコピーしました