• ベストアンサー

助けてください。VLOOKUPやOFFSETでは解決できません(><)

助けてください。。 仕事でレシピを作成しているのですが、 メニュー名や材料、手順をデータとして入力をしていて、その中から必要に応じて3つぐらいのメニューを選んで別シートにレシピを作成をしています。 今までは、コピー、貼り付けをして対応してましたが、仕事量が増え、負担になってきているので、なんとか数式で簡単にデータを引っぱってこれないかなあと思っています。 データの入力は↓のようにしてあります。    A         B       C 1 メニュー名     材料      手順 2 ぶりしゃぶ     ぶり(薄切り) (1)ぶりは 3 ぶりしゃぶ     ほうれん草   (2)次に 4 ぶりしゃぶ     酒       (3)ほうれ 5 ぶりしゃぶ     ポン酢     (4)最後に 6 きのこのホットパイ きのこ     (1)パイシ 7 きのこのホットパイ パイシート   (2)きのこ 8 きのこのホットパイ ホワイトソース (3)鍋に、  9 きのこのホットパイ 白ワイン    (4)オーブン 10 きのこのホットパイ 玉ねぎ     (5)皿に  . . . . 別シートには↓のように、A1セルにメニュー名を入力するとA4、B4以下に自動で入力されるようにしたいです。 材料は、4つとは限らず、2個の事も10個のこともあります。手順も同様です。また、材料の個数=手順の行程数とは限りません。材料は2個なのに、手順は4行程ということもあります。   A         B 1 ぶりしゃぶ 2 3 4 ぶり(薄切り) (1)ぶりは 3 ほうれん草   (2)次に 4 酒       (3)ほうれ 5 ポン酢     (4)最後に VLOOKUPやOFFSETを使用して作ってみたのですが、うまくいきませんでした。HITする文字列が複数ある場合は、どのようにすればいいのでしょうか。。 是非ご教授頂ければと思っております。 よろしくお願い致します☆

質問者が選んだベストアンサー

  • ベストアンサー
  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.4

No.2です。 データシート → 料理データ最新 レシピシート → 料理教室用白紙、ですか? で、レシピシートの B12セルにメニュー名を入力したら 16行目以下に材料・手順が表示されればいいんですよね。 手順は C列からK列まであるってこと? データシートは 2行目からデータがあるとして、 ▽ 料理データ最新シートの O2セルに =IF(AND(料理教室用白紙!$B$12<>"",A2=料理教室用白紙!$B$12),ROW(),"") と入れ、予想される最終データ行までフィルコピー ◆ なお、データの途中にあとから行を挿入して追加する場合は、忘れずにその行にも作業列の式をコピーしてください。 ▽ 料理教室用白紙シートの B16セルに =IF(COUNT(料理データ最新!$O:$O)<ROW(A1),"",INDEX(料理データ最新!B:B,SMALL(料理データ最新!$O:$O,ROW(A1)))) と入れて、右へ K16セルまでフィルコピー B16:K16 の式を下に 10行分ぐらいフィルコピー ◆ 上の式をそのままコピー&ペーストしてください。 こちらのテストデータではうまくいっているので、エラーが出るのは式の入力ミスとしか考えられません。 ◆ それでもうまくいかないようでしたら、入力した式をコピーして提示してください。 ***** それと最初の質問の >材料は2個なのに、手順は4行程ということもあります。 を見落としていました。 データシートの B列は空白だけれど C列以降にはデータがある、こともあるってことですよね。 手順のほうも全部が全部 K列まですべて入力するわけじゃないですよね。 G列まで手順が入力されていて、H列以降は空白のこともあるとか。 データシートが空白になっているところは、レシピシートでは 0が表示されるので、0を非表示にしたければ、 レシピシートの 16行目以下に数式を入れたセルをすべて選択して、 メニューの書式~セル~表示形式タブ 分類から 「ユーザー定義」を選び、右の種類ボックスに # とだけ入れてください。 これで 0は非表示になります。 または、数式の最後に &"" をつけても 0は表示されないと思います。 =IF(COUNT(料理データ最新!$O:$O)<ROW(A1),"",INDEX(料理データ最新!B:B,SMALL(料理データ最新!$O:$O,ROW(A1))))&"" 以上、試してみてください!

haruna867
質問者

お礼

shiotan99様、お礼が遅くなってごめんなさい。 レシピ、ついに完成することができました!! 本当にありがとうございます!! とっても楽で、仕事もはかどります☆ 実は、、、仕事でこのような事(エクセル数式やマクロを使った業務改善)を要求される事がとても多く、自分に力がないので困る事も多きあります。(><) また、質問する事があると思いますので、その時はまたご教授いただけると嬉しいです☆ 今回は本当にありがとうございました!!!

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 本来、フィルターオプションで手動でも十分に可能なのですが、繰り返し使うことになると、マクロのほうが便利です。 コントロール・ツールのボタンやフォームツールのボタンに取り付けると便利かもしれませんね。 また、コンボボックスで、メニュー名を選べるようにすれば、もっと便利になります。 ※シート名は、必要に応じて書き換えてください。 抽出先もしくはボタンをつける場合は、Sheet2側になります。データがあるほうが、Sheet1になっています。 '標準モジュール Sub PickUpMacro() 'フィルターオプションを使ったマクロ   Dim myDatabase As Range   Dim myCriteria As Range   Dim myExtract As Range   Dim InputArea As Range   'データ範囲   Set myDatabase = Worksheets("Sheet1").Range("A1", _           Worksheets("Sheet1").Range("A1").End(xlDown).Offset(, 2))   '出力先   Set myExtract = Worksheets("Sheet2").Range("A4:B4")   '入力先   Set InputArea = Worksheets("Sheet2").Range("A1")     '検索条件(そこにデータがなければ動かす必要はありません。)   Set myCriteria = Worksheets("Sheet2").Range("D1:D2")   On Error Resume Next   With ThisWorkbook    .Names("Criteria").Delete    .Names("Database").Delete    .Names("Extract").Delete   End With   On Error GoTo 0     Application.ScreenUpdating = False     myExtract.CurrentRegion.ClearContents   myCriteria.ClearContents     If InputArea.Value = "" Then MsgBox "検索値をいれてください。": Exit Sub     If WorksheetFunction.CountA(myCriteria) < 2 Then    myCriteria.Cells(1, 1).Value = myDatabase.Cells(1, 1).Value    myCriteria.Cells(2, 1).Value = InputArea.Value   End If     myExtract.Value = myDatabase.Range("B1:C1").Value     myDatabase.AdvancedFilter _     Action:=xlFilterCopy, _     CriteriaRange:=myCriteria, _     CopyToRange:=myExtract, _     Unique:=False   myCriteria.ClearContents   Application.ScreenUpdating = True   Set myDatabase = Nothing: Set myCriteria = Nothing   Set myExtract = Nothing: Set InputArea = Nothing End Sub なお、コントロールツールのコマンドボタンに取り付けるときは、以下のようにしてください。 'シートモジュール Private Sub CommandButton1_Click()  Call PickUpMacro End Sub

  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.2

こんにちは~ データシートが Sheet1 レシピシートが Sheet2 だとします。 ■ 作業列を使わない方法 ■ Sheet2 の A4セルに =IF(COUNTIF(Sheet1!$A$1:$A$100,$A$1)<ROW(A1),"",INDEX(Sheet1!B$1:B$100,100-LARGE(INDEX((Sheet1!$A$1:$A$100=$A$1)*100-ROW($A$1:$A$100),0),ROW(A1)))) と入れ( ↑をそのままコピー&ペーストしてください )、 B4セルにフィルコピー A4:B4 を必要なだけ下にフィルコピーしてください。 ◆ データシートの最終行が 100行目と仮定しています。 それ以上ある場合は、数式の 100を修正してください。 ■ 作業列を使う方法 ■ 作業列はどの列でもかまいません。 ここでは仮に Sheet1 の F列を作業列にします。 Sheet1 の F2セルに =IF(AND(Sheet2!$A$1<>"",A2=Sheet2!$A$1),ROW(),"") と入れ、データ最終行までフィルコピー 今後もデータが増えつづけるなら多めにコピーしておいてください。 Sheet2 の A4セルに =IF(COUNT(Sheet1!$F:$F)<ROW(A1),"",INDEX(Sheet1!B:B,SMALL(Sheet1!$F:$F,ROW(A1)))) と入れて、右の B4セルにフィルコピー A4:B4 を必要なだけ下にフィルコピーしてください。 ◆ 作業列が F列以外なら $F:$F( 2ヶ所 )をその列記号にしてください。 ◆ 作業列が目障りなら非表示にしてください。 ◆ データが多い場合は、作業列を使う方法をおすすめします。

haruna867
質問者

お礼

早速のご回答ありがとうございます! 作業列を追加する方法で、試してみたのですが、うまくいきませんでした(><) 作業列の方は、A1に対応するものに番号がふられてうまくいっているようなのですが、 レシピシートの方に表示されません。 INDEXの所で、使用する引数を選択してくださいのBOXが出て??でしたし、IF関数の偽の部分が#NUM!赤字になってしまいました。私の訂正の仕方が多分おかしかったのだと思います。。 すみませんが、↓のようにしたいので、もう一度ご教授いただけますでしょうか? よろしくお願い致します☆ シート名は、料理データ最新と料理教室用白紙で、 作業列はO、 メニュー名入力箇所はB12、 抽出箇所はB16~K16までで、 下に10行ぐらいフィルコピー。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

データの持ち方を工夫した方が良いでしょうね。  ぶりしゃぶ材料  ぶり(薄切り)  ほうれん草  酒  ぶりしゃぶ手順  (1)ぶりは   (2)次に  (3)ほうれ のようにして、A1に名称を入れた時に  A4 では =VLOOKUP($A$1&"材料",データ範囲,2,0)  A5 では =VLOOKUP($A$1&"材料",データ範囲,3,0)  B4 では =VLOOKUP($A$1&"手順",データ範囲,2,0)  B5 では =VLOOKUP($A$1&"手順",データ範囲,3,0) あとは、IFやISERROR 又は ISNA等併用して、データが無い場合は空白表示にさせます。 データ構造がそのままなら、VBAでやっちゃうとか。 試すなら新規シートで。 1)レシピのシート名 を「レシピ」、データのシート名 を「データ」とします。 2)データシートはA1から始まるタイトルありの表で、A列のデータでソートされているとします。 3)レシピシートのシート名タブを右クリックし、コードの表示で出てきたVBE画面に下記のコードを貼り付けます。 4)レシピシートのA1を入力すると切り替わります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range, cnt As Long  If Target.Cells(1, 1).Address <> "$A$1" Then Exit Sub  Worksheets("レシピ").Range("A4").CurrentRegion.ClearContents  cnt = 4   With Worksheets("データ")    For Each r In .Range(.Range("A1"), .Range("A65536").End(xlUp))     If r.Text = Target.Cells(1, 1).Text Then       Worksheets("レシピ").Range("A" & cnt).Value = r.Offset(0, 1).Text       Worksheets("レシピ").Range("B" & cnt).Value = r.Offset(0, 2).Text       cnt = cnt + 1     End If    Next r   End With End Sub

関連するQ&A

  • VLOOKUP関数 列番号の設定の仕方教えて下さい

    VLOOKUP関数の列番号を 1、2、とかではなく、 計算して列番号を設定することはできますか? シート2 に入っているデータを参照して シート1 に関数をいれて、表示させたいと思っています。 シート2 データは 3行目に、項目(品名、(1)材料名、(2)数量、(2)材料名、(2)数量、...、(10)材料名、(10)数量) A列、 B列、 C列、 D列、 E列、...、 M列、 N列 クッキー、小麦粉、100、卵、1、...、砂糖、20 クラッカー、小麦粉、100、米粉、10、...、りんご、0.2 が入っていて、4行目から100行目くらいまでデータがはいっています。 シート1 の セルA5に品名を入力すると、 シート2の(1)材料名がセルA6に、 (1)数量がセルB6に、 (2)材料名がセルA7に、 (2)数量がセルB7に、 ... (10)材料名がセルA15に、 (10)数量がセルB15に、 入るように作りたいのですが、VLOOKUPの列番号を COLUMNやINDEXなど試してみましたが、エラーばかりで うまくできません...VLOOKUPでは無理なのでしょうか? どなたか詳しい方教えてください。よろしくお願いします・

  • VLOOKUP関数について

    VLOOKUP関数についての疑問なのですが、 ...........A...............B 1..品名コード|.品名..| 2..A123...........|..お茶.| 3..A456...........|...水....| 4..A789...........|..お酒.| というデータがあったとします。 VLOOKUP関数を使用して、 このデータから 品名コードを入力して品名を検索することは できるのですが、品名を入力して品名コードを検索できません。 データのA列とB列の位置を入れ替えれば検索が可能になりますが…。 VLOOKUP関数は検索するキーのデータが一番左側にないと機能しないのでしょうか? どなたかご教授お願いいたします。

  • ExcelのVLOOKUP関数について教えて下さい

    AのシートにA列に番号、B列に会社名を入力、しB以降のシートは月毎別に作成し、番号を入力して会社名を引っ張ってくると言う形のVLOOLUP関数を作りました。 番号はバラバラに入力するので、1の後に50があったりその後に10があったりします。 今までそれで上手く会社名が引っ張ってこれたのですが、先日24行目に5という数字を入れたら、 「#N/A」のエラーが出ました。 エラー内容は「無効な値のエラー」と出ていますが、Aのシートには5のデータは入力されており、20以降の数字を入れると会社名が正しく表示されます。 関数が間違っているのかと思い、別シートと比べましたが同じでした。 ちなみに関数は次の通りです。Aのシートのデータは2行目から番号1→147行目に番号146のデータが入っています。 =IF(A24="","",VLOOKUP(A24,店名!B22:C167,2,FALSE)) 何がおかしいのか全く分からず、途方に暮れております。 アドバイスをお願いします。

  • VLOOKUPにつきまして

    業務で処理していて困っている点がありまして質問があります。 B1に「A1」とコードを入力するとB2に「数字」が表示するよう、 =IF(B1="","",VLOOKUP(B1,$K$3:$S$50,1,FALSE))と計算式をしました(ちなみに「K3」~「S50」にデータを入力しました)。すると「#N/A」と表示してしまいます。何が原因でしょうか? アドバイスをお願いします。

  • エクセル SUMPRODUCT と OFFSET

    いつもお世話になります。 SUMPRODUCT関数で集計したいのですが、OFFSET関数を組合せてA1に関数を入力し、右にひっぱるだけで36ヶ月分を集計したいと思い、下記の計算式を入力したのですが#VALUE!になり困ってます。 A1=SUMPRODUCT((OFFSET(data!$A$1,1,COLUMN(A1)*3-3,99,1)=$G$1)*(OFFSET(data!$B$1,1,COLUMN(A1)*3-3,99,1)=$H$1),(OFFSET(data!$C$1,1,COLUMN(A1)*3-3,99,1))) dataシートには、A列:商品CD、 B列:営業所CD、 C列:売上金額 の3列のデータが、36か月分108列あります。 集計するシートのG1に商品CDを、H1に営業所CDを入力すると、A1~A36に集計結果を返したいのですが、教えてくださいませんか

  • VLOOKUPがうまく行かない

    VLOOKUP関数でSheet1のA2セルに=VLOOKUP(B2,Sheet1!$A$1:$B$22,1)と入力すると、012というコードが変えてこないといけないのですが、Sheet1の1行目の最終行のデータを持ってきてしまいます。昇順に並べ替えもしているのに、何故でしょうか?

  • VLOOKUPについて教えてください。

    皆さんこんにちは。 今、エクセルファイルがA,Bと2つあります。エクセルファイルBには製品No.がB列、製造日時がC 列(B列の詳細データ)に入力されているデーターベースとなっています。ここでエクセルファイルAの A1のセルにエクセルファイルBに記入されている製品No.を入力してエクセルファイルAのB1のセ ルにエクセルファイルBのC列の製造日時を表示したいのですがどうもうまく行きません。どなたか教 えていただけませんか?

  • Excel 2007のVLOOKUP関数について

    Excel 2007のVLOOKUP関数について教えてください。 A列に(大根、人参、キャベツ)の3項目をプルダウンメニューで 選べるように設定します。 A列にある項目を選択した時に B列にそれぞれの数字が自動で表示されるように 設定したいと思います。 大根→1 人参→2 キャベツ→3 A列のプルダウンメニューは「データ入力規則」の元に値に 直接項目を入力します。 VLOOKUP関数を使用すると思いますが、 どのような方法で使用すればよいのかわかりません。 教えてください。

  • VLOOKUPで#N/Aになってしまいます

    VLOOKUP関数を使って 商品名をA1に入力すると、コードを検索するようにしています。 VLOOKUP(A1,'商品1'!$A$2:$C$60000,2,0) と入力しているのですが、 商品名によっては、ヒットしたり#N/Aとなったりします。 商品名を間違えて入力していることはないです。 なにか式に足りないものがあるのでしょうか? それともデータが多すぎなのでしょうか? それとも商品名が複雑すぎるのでしょうか? '商品1'のA列に入力されている商品名は ローマ字と数字とハイフンが混ざった商品名です。 並び替えで昇降順にしています。 '商品1'には60000行ほどのデータがあります

  • 美味しいもやしレシピはないでしょうか?

    家に頂いたもやしが大量にあります。 ただ今ダイエット中なので夜のみもやし料理にしようかな・・・と思っているのですが。 何かいいレシピはないでしょうか? いつも もやしとササミをレンジでチンしてポン酢で食べる もやしと茸など適当にスープを作って食べる コンソメ味でやっぱりレンジでチン・・・ このメニューばかりで飽きました。 ヘルシーでボリュームのある何かいいアイデアがありましたらよろしくお願いします!

専門家に質問してみよう