指定したコードが、別の表にあるかどうかを確認する。
先日は、セル内で二回改行された二段目に記された、管理番号を取り出すことに挑戦した。
infoment.hatenablog.com
取り出したいからには、取り出した後に何かしたい訳で。
前回受けた問い合わせは、さらにこう続く。
別のシートには、当該管理番号ごとに必要書類の提出状況が記されており、
その状況を確認したい。
やってみよう。
今回はまず、先日職場で行われた勉強会の順序に沿って作ってみる。
シート:案件管理台帳
シート:書類提出情況管理
勉強会では、以下の手順を採ることになった。
- 管理番号を取得する。
- 書類提出状況管理シートに移動する。
- 書類状況管理リストを検索して、管理番号を見つける。
人間がやる場合の動作を、そのまま辿った方式だ。考えやすいため、非常に有効なロジックの一つだと思う。
探すのだから、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
実行してみると、結果を正しく取得出来ている。
この時のポイントは、やはりこの部分だろうか。
If Not FindResult Is Nothing Then
検索結果が無い(Nothing)ということが無い(Not)ならば、つまり検索結果があるならばという条件を設けている。これを省くと、
- 検索結果が無い
- 「無いもの」の一つ右隣の値を要求している(Offets(,1))
- これは、無理な要求
- Excelに怒られる(エラー発生)
ということになるわけで。
明日に続きます。
参考まで。