goo blog サービス終了のお知らせ 

パソコンカレッジ スタッフのひとりごと

パソコンスクールのスタッフが、
初心者から上級者まで役立つ情報をお伝えします。

大文字小文字を区別して検索するVlookup関数の改良版

2012-05-23 09:00:23 | ExcelVBA
これも、生徒さんからの質問です。

セルB3に入力された商品CDに対応する商品名を、
セル範囲B8:D14の商品リストから見つけ出してセルC3に表示したいとのこと。



仕事をしていると、よく遭遇する場面ですよね。
こういう場面では、Vlookup関数を使うのが定石です。

しかし、今回は、少しばかり勝手が違うのです。

商品リストをよく見ると、商品CDにはある特徴があるのです。
それは、「大文字と小文字で分けられている」ということです。
つまり、「A001」と「a001」は、別の商品CDなのです。

さて、このような場合でVlookup関数を使うと、事件が起きます。
商品CDに「a002」を指定すると、答えが「ホットケーキ」になってしまうのです。
商品リストを見ると、商品名は、「ホットケーキ(バター付)」ですよね。





なぜ間違った答えが出てしまうのかというと、Vlookup関数は、
「A002」と「a002」を同じデータとみなすからです。
Vlookupは、セル範囲B9:B14の値を、上から順番に検索値(つまりセルB3の値)と一致するかをチェックします。
その際、セルB10の「A002」と検索値が一致していると判断し、答えがセルC10の「ホットケーキ」になってしまうのです。

そんなわけで、大文字と小文字を別の文字として検索する新たな関数「VLookupSpecial」を作ることにしましょう。

Altキーを押しながらF11キーを押して、Visual Basic Editorを起動します。
挿入メニューの「標準モジュール」をクリックします。
コード画面に、以下のようにコーディングします。

Public Function VLookupSpecial(ByVal 検索値 As String, _
                          ByVal 範囲 As Range, _
                          ByVal 列番号 As Integer) _
                          As String
  '大文字と小文字の区別をして検索する
  '見つからなかったら、「見つかりません」という答えにする
  Dim r As Integer
  '選択範囲の行数を取得
  r = 範囲.Rows.Count
  Dim i As Integer
  For i = 1 To r
    '引数「範囲」の1列目を順次チェック
    If 範囲.Cells(i, 1).Value = 検索値 Then
      VLookupSpecial = 範囲.Cells(i, 列番号).Value
      Exit Function
    End If
  Next
  VLookupSpecial = "見つかりません"
End Function

画像も載せておきます。




この関数は、VLookup関数と同じような引数構成にしましたが、第4引数はなしにしました。
処理の内容は、VLookup関数の内部で行われているであろう処理に合わせました。

文法的に押さえておきたいのは、IF構文に登場する
範囲.Cells(i, 1).Value
です。これは、「引数のセル範囲において、その中のi行1列目のセルの値」を指しています。
セル範囲の中でのセルの位置を指定するには、このように書くんですね。

さあ、コードを入力できたら、エクセルに切り替えて、さっそくこのVLookupSpecial関数を使ってみましょう。





どうです?
今度は、ちゃんと答えが出ましたね。

えっ?そもそもこんな風に大文字と小文字を区別して商品CDに設定すること自体が、NGだって?

おっしゃることは分かりますが、そこは、会社によって色々と事情があるということで・・・


だい



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 今週のおすすめ記事 | トップ | 以前のワードアートを使いた... »
最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。

ExcelVBA」カテゴリの最新記事