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

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

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

2回答

8073閲覧

エクセルでVLOOKUPとループを同時に利用したい

ssk

総合スコア332

0グッド

0クリップ

投稿2016/12/17 06:57

1つのセル

りんご,バナナ

をVLOOKUPとループを利用して
別セルに以下の形式で出力したいです。

<![CDATA[a:2:{i:0;s:14:"fruits01";i:1;s:14:"fruits02";}]]>

参照するシートはfruitsシート

フルーツ名
りんごfruits01
バナナfruits02
イチゴfruits03
ぶどうfruits04
<![CDATA[a:2:

の「2」はループ回数を表示

以上です。
よろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ynakano

2016/12/17 12:39

その他の値はどんな意味がありどのように決まるのですか?
guest

回答2

0

EXCELタグでの質問ですが、VBAを視野にいれていますでしょうか?

VBAを使わずEXCEL関数だけでとなると、VLOOKUPはわかりますがループ処理は難しいと思います。
(最大10個、といった制限でもあればまだできそうな気もしますが。)

VBAで独自関数を1つ作れば、比較的と簡単に実現できると思います。
以下のようなCDATA文字列を作成するVBAマクロを標準モジュールに記述します。
※Sheet2のA1:B5セルをVLOOKUPで参照するマスタ範囲として作成しています。利用環境に合わせて書き換えてください。

Public Function MakeCDATA(vRng As Range) Dim strRet As String '出力結果文字列 <![CDATA[a:2:{i:0;s:14:"fruits01";i:1;s:14:"fruits02";}]]> Dim shtMaster As Worksheet Dim rngMaster As Range 'VLOOKUPマスタシート Set shtMaster = ActiveWorkbook.Worksheets("Sheet2") 'VLOOKUPマスタ範囲 Set rngMaster = shtMaster.Range("A1:B5") Dim i As Integer Dim strFruits() As String Dim strFruitsVal As String If vRng = "" Then Exit Function '参照セルが空の場合は処理せず終了 '引数のセル内容をカンマで区切る strFruits = Split(vRng, ",") '要素数を出力 <![CDATA[a:2:{ strRet = "<![CDATA[a:" & CStr(UBound(strFruits) + 1) & ":{" '要素の数だけループ処理 For i = 0 To UBound(strFruits) On Error Resume Next 'VLOOKUPで値を取得 strFruitsVal = Application.WorksheetFunction.VLookup(strFruits(i), rngMaster, 2, False) If Err <> 0 Then 'マスタにない値の場合 strFruitsVal = "N/A" Err = 0 End If '要素番号を出力 'i:0;s:14:"fruits01"; 'i:1;s:14:"fruits02"; strRet = strRet & "i:" & CStr(i) & ";s:14:" '値を出力 strRet = strRet & Chr(34) & strFruitsVal & Chr(34) & ";" Next 'タグ閉じ }]]> strRet = strRet & "}]]>" MakeCDATA = strRet End Function

例えばSheet1のA1セルに"りんご,バナナ"と記述されているいる状態で、
B1セルに=MakeCDATA(A1)という式を記述すると、上記で作成した独自関数がCDATA文字列を作成し、
B1セルに値が出力されます。

注意事項

これは上記コードに限らず、VLOOKUPの制約事項になりますが、VLOOKUPでマスタとして利用するデータは、検索キーとなる列(左端列)が昇順でソートされている必要があります。
検索列の昇順でソートされていない場合、VLOOKUPは指定された範囲に値が存在しているのに見つけられなかったり、正しい値を返せなかったりします。

提示いただいたマスタは、

りんご fruits01 バナナ fruits02 イチゴ fruits03 ぶどう fruits04

のように値の列でソートされていますが、検索キーとして利用するのはフルーツ名ですので、

イチゴ fruits03 バナナ fruits02 ぶどう fruits04 りんご fruits01

の順である必要があります。

投稿2016/12/19 05:55

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

数式の配列を用いてVLOOKUP関数の結果を表示するには無理があります。
ここは、素直に、jawaさんのようにVBAでユーザー定義関数を作るのが自然です。
どうしても数式でおこなうのであれば、配列は使用せず、下図のように数式を作り込みます。
イメージ説明

でも、このような長い数式を業務で使用することは絶対にダメです。
長い数式は、趣味の中で行いましょう。

投稿2018/12/24 06:17

kai_keitai

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問