指定したコードが、別の表にあるかどうかを確認する。

先日は、セル内で二回改行された二段目に記された、管理番号を取り出すことに挑戦した。
infoment.hatenablog.com
取り出したいからには、取り出した後に何かしたい訳で。
前回受けた問い合わせは、さらにこう続く。

別のシートには、当該管理番号ごとに必要書類の提出状況が記されており、
その状況を確認したい。

やってみよう。
f:id:Infoment:20190217102850p:plain
今回はまず、先日職場で行われた勉強会の順序に沿って作ってみる。

シート:案件管理台帳
f:id:Infoment:20190217103216p:plain

シート:書類提出情況管理
f:id:Infoment:20190217103407p:plain

勉強会では、以下の手順を採ることになった。

  1. 管理番号を取得する。
  2. 書類提出状況管理シートに移動する。
  3. 書類状況管理リストを検索して、管理番号を見つける。

人間がやる場合の動作を、そのまま辿った方式だ。考えやすいため、非常に有効なロジックの一つだと思う。

探すのだから、Find関数を用いる。検索範囲に対しては、管理案件の増減に自動で追従できるよう、予めテーブルとして書式設定しておく。

なお、管理番号を取得する部分は、前回の「Aチーム」案を採用した。

Sub test()
    Dim val As String
        val = Range("A1").Value
        
    ' Split関数で、改行コードを区切り文字として配列化し、
    ' 二つ目の要素を案件管理番号として取得する。
    Dim ControlNumber As String
        ControlNumber = Left(Split(val, vbLf)(1), 7)

    ' 書類提出状況管理テーブル。
    Dim Tb As ListObject
    Set Tb = Sheets("書類提出状況管理").ListObjects(1)
    
    ' 検索
    Dim FindResult As Range
    Set FindResult = Tb.ListColumns("管理番号").DataBodyRange. _
                     Find(ControlNumber)
        If Not FindResult Is Nothing Then
            MsgBox "書類1:" & FindResult.Offset(, 1) & vbNewLine & _
                   "書類2:" & FindResult.Offset(, 2)
        End If
End Sub

実行してみると、結果を正しく取得出来ている。
f:id:Infoment:20190217105014p:plain

この時のポイントは、やはりこの部分だろうか。

 If Not FindResult Is Nothing Then

検索結果が無い(Nothing)ということが無い(Not)ならば、つまり検索結果があるならばという条件を設けている。これを省くと、

  1. 検索結果が無い
  2. 「無いもの」の一つ右隣の値を要求している(Offets(,1))
  3. これは、無理な要求
  4. Excelに怒られる(エラー発生)

ということになるわけで。


明日に続きます。

参考まで。