これも、生徒さんからの質問です。
セル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だって?
おっしゃることは分かりますが、そこは、会社によって色々と事情があるということで・・・
だい
セル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だって?
おっしゃることは分かりますが、そこは、会社によって色々と事情があるということで・・・
だい























※コメント投稿者のブログIDはブログ作成者のみに通知されます