質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

vba ある値を別シート参照(列指定)して一致したセルの右隣の値を引っ張る方法について 

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 11K+

kaori1994

score 28

お世話になっております。
kaoriと申します。

今回は主に題名の事をしたいのですが、少々ややこしいのでやりたい事を使うものを使用して説明させていただきます。

【使用するシート】
説明シート[犬種(英語)列と犬種(日本語)列]

【使用する値】
dogBreed(英語で犬の犬種が書かれています)

【内容】
Function pet()
Call localize(dogBreed)  '引数はランダムでtiwawaとかpaguとかになるとしてください。
msgbox localize  'チワワと日本語が取得できている
End Function

Function localize(Byref dogBreed As String)
Dim sh1 As Worksheet
Set sh1 = Sheets("説明シート")
Dim wanko As String
                             ※説明は犬種(英語)列 2は犬種(日本語)列となっております。
If wanko = VLokup(dogBreed, sh1, 説明, 2, False)  Then

    localize = wanko(日本語化)

Else
    localize = dogBreed(英語のまま)
End If

End Function

と、説明シートを参照してもし犬種(英語)列にtiwawaがあるならその右隣のセル 犬種(日本語)列のチワワを取得して戻り値として渡したいのです。
犬種(英語)列にtiwawaがない場合戻り値は tiwawaのままでよいという事になります。

以上、日本語で書くとかえってややこしいと思い
私が考えて作ってみたコードを使ってやりたい事を説明として書いてみました。

ここがわかりにくいという点があると思いますので、その際は質問して頂けたら幸いです。
よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

和名検索部分だけ抜き出すとこんな感じになると思います。

On Error Resume Next 'エラーが発生しても次行から処理継続

'和名検索
wanko = WorksheetFunction.VLookup(dogBreed, 抽出範囲, 2, False)
If Err = 0 Then
    '正常パターン
    戻り値 = wanko
Else
    '異常パターン
    戻り値 = dogBreed
End If

On Error GoTo 0      'On Errorを解除

細かな指摘とアドバイス

【関数の作成について】
・戻り値を返す関数はFunction、返さない関数はSubで作成するのが一般的です。
今回の場合、Pet関数はSub、localize関数はFunction。

・Functionの宣言はFunction ファンクション名(引数 as 引数の型…) as 戻り値の型
文字列を戻り値としたい場合は、戻り値の型を文字列型(String)で宣言しましょう。
宣言しなくてもVariant型で補われますが、型を意識することが大事です。

【VLookup関連】
・VLookUpの第2引数(検索範囲)にWorkSheetは渡せません。
Range("説明シート!A:B")のように範囲をRangeで指定してあげる必要があります。

・VLookUpで正しく検索するためには、いくつかの注意点があります。
①検索範囲の左端列が検索対象列であること
②検索範囲が左端列で昇順ソートされていること
これを満たしていないと検索範囲に値があるのに見つからない、といった事態が発生しますのでご注意ください。

・説明シートの内容がVLookUpの条件を満たさない場合、VLookup以外での検索を検討する必要があります。(Range.Findなど)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/26 13:59 編集

    jawaさん、お世話になっております。
    本日は実際のコード含め、指摘とアドバイスありがとうございます!
    コードはもちろん、その他情報が凄く勉強になりました。
    どうやら私の中で、まだ関数についてや、RangeやCellsやシート参照等がちゃんと理解できていない事が判明しました。
    また、VLookup使用するにも条件があるという事も初めて知りました。
    なので、VLookUpの条件が満たす場合と満たさない場合の検証と
    VLookUp以外で実装可能かの検証をしていきたいと思います。
    お忙しい中、私の為に貴重なお時間を割いていただきありがとうございました!

    キャンセル

0

「VLookup」で検索できなかった場合は、On Errorでエラーを拾わないといけません。

以下のサイトが参考になると思います。
https://www.moug.net/tech/exvba/0100001.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 17:57

    tomo.inaさん、初めまして。
    On Errorでエラーを拾わないといけないのですね!
    参考サイトURLまでご丁寧にありがとうございます。
    早速チェックさせて頂きます。
    ありがとうございました!

    キャンセル

0

説明シートを参照してもし犬種(英語)列にtiwawaがあるならその右隣のセル 犬種(日本語)列のチワワを取得して戻り値として渡したい

の部分について

これを実現したいのが

If wanko = VLokup(dogBreed, sh1, 説明, 2, False)  Then 
    localize = wanko(日本語化) 
Else 
    localize = dogBreed(英語のまま) 
End If

この部分と思いますが、ちょっとうまくなさそうです

VLookup を使って処理するなら、このような手順になると思います

1)戻り値 localize の初期値(何も見つからなかったら返したい値)には入力値 dogBreed を入れておく
2)VLookup で入力値を検索して日本語列から結果を取り出す
→ 範囲外エラー 4)へ
3)if 日本語の中身があった(文字が入っていた)ら then 戻り値に日本語を代入する
4)戻り値が確定したので処理を終わる

英語名が無かった場合は入力値を返すことになっているので
戻り値を最初に入力値で初期化しておけばよいでしょう

VLookup で日本語が取り出せたのなら英語名も存在することになるので
VLookup は1回だけ実行し、かつ日本語を取り出すだけでよさそうです

以上ご参考まで

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/26 09:24

    takitoさん、お世話になっております。
    なるほど!戻り値には初期値を入れておく必要があるのですね、勉強になります!
    ここでまた質問があるのですが、よろしいでしょうか・・・

    Function localize(Byref dogBreed As String)
    Dim sh1 As Worksheet
    Set sh1 = Sheets("説明シート")
    Dim wanko As String
    localize= dogBreed

    On Error Resume Next
    If wanko = VLokup(dogBreed, sh1, 説明, 2, False) Then

    localize = wanko(日本語化)

    Else
    localize = dogBreed(英語のまま)
    End If
    End Function

    としたのですが、2点問題がございます・・・
    果たしてこれでtakitoさんのおっしゃっている戻り値の初期化ができているのかという点と、これで実行するとsubまたはfunctionが定義されていませんとエラーがはかれます
    申し訳ありませんが、お時間の都合が良い時にご回答いただけたら幸いです。
    以上、よろしくお願い致します。

    キャンセル

  • 2016/05/26 17:33

    1) そのプログラムでは
    localize = dogBreed
    の部分が初期化に該当しています
    この後にどのようなタイミングで localize 関数を抜けても、呼び出し側にちゃんと値が返されます

    2) 「subまたはfunctionが定義されていません」というのは恐らく VLookup の使い方が間違えているためと思います
    書籍やGoogle先生に「vba VLookup」を聞いてみて、正しい使い方を確認してみてください

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • VBAに関する質問
  • vba ある値を別シート参照(列指定)して一致したセルの右隣の値を引っ張る方法について