スプレッドシートでVLOOKUPのスクリプト文

このQ&Aのポイント
  • スプレッドシートでVLOOKUPを使用して別シートの単価表を参照し、特定のプルダウンの選択に応じて単価を表示する方法について教えてください。
  • VLOOKUP関数を使用して単価表を参照し、プルダウンの選択に応じた単価を表示する方法を教えてください。また、単価を変更しても式が消える問題の解決方法も教えてください。
  • スプレッドシートでVLOOKUP関数を使用して単価表を参照し、プルダウンの選択に応じて単価を表示する方法についてのスクリプト文の作成方法を教えてください。
回答を見る
  • ベストアンサー

スプレッドシートでVLOOKUPのスクリプト文

スプレッドシートで1つ教えて下さい。 A列のプルダウンで選択すると別シートの単価表を参照し B列からD列に単価が表示されるようにしました。 =VLOOKUP($A2,'単価シート'!$A$2:$D$10,2,False)という式になります。 しかし表示された単価を変更したい時に変更すると式までが消えてしまいます。 プルダウンから変更し直そうとすると式が消えてしまい参照されません。 例えば 単価シート 品番  単価1 単価2 単価3 あ    50 60 70 い    80 90 100  入力シート A    B C D あ  50 60 70 ここで単価を修正入力 A    B C D あ  55 60 70 式を入力しないで、スクリプト文でできないでしょうか。 どのようなコードになるか分かる方おられましたら よろしくお願いします。

  • wansm
  • お礼率57% (119/206)

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.8

A10はどうなのかも見てもらえますか。 もしA10とA2がうまくいくということでしたら if(myColumn==1 && myRow>=2 && myRow<=10){ を if(myColumn==1 && myRow>1 && myRow<11){ に変更してみてください。 A10も駄目な場合 原因がスクリプトなのかトリガーなのかをを見極めるために、スクリプトを手動で実行してみてください。 スクリプトエディタを開いておき シートに戻って B3を適当な数値に変更したのちA3を選択して スクリプトエディタで実行をしてみてください。 B3が変更されていたらスクリプトに問題はなく、トリガーに問題があると思われます。ただ、A2だと実行できるということなので…完全にトリガーが働いていないとも思えません。 トリガーの設定の画像を添付しておきます。 手動でもうまくいかない場合 if(myColumn==1 ){ //A列全ての行で実行されます。 や if(myColumn==1 && myRow>1){ //A2以降の行で実行されます。 に変更して実行してみてください。 あと 以前気になって聞くのを忘れたのですが > A1だけの処理はできるようになりました これのA1は書き間違いですよね。

その他の回答 (7)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.7

あと、こちらも変更してみたらいいかもしれません。 (こちらではどちらでも同じ結果でしたが念のために) strformula ="=VLOOKUP($A" + myRow + ",'単価シート'!$A$2:$D$10," + i + ",False)"; のところを strformula ='=VLOOKUP($A' + myRow + ',\'単価シート\'!$A$2:$D$10,' + i + ',False)'; に変更してみてください。

wansm
質問者

お礼

回答ありがとうございます。 何度もChromeで試していますが 表示されません。 もう一度最初から作り直そうかと思っています。 何に原因があるのでしょうか? 心当たりがあれば教えて頂けないでしょうか。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.6

> A2からA10というコードを実行していますが > A3以降セットされません。 A2がセットされたという事はトリガーもスクリプトも問題はないと思います。 セットされないときに「保存しています」の状態で止まっていることはないでしょうか。メニューのヘルプの横のところです。 Internet Explorer 11で利用した場合、そこで止まったままになって変更されないことがあります。 ChromeやEdgeはそのような事はなかったので環境のせいでおかしくなるのだと思っています。 ためしに、起動して最初にA3以降の変更を実行してみてください。

wansm
質問者

お礼

回答ありがとうございます。 何度も申し訳ありません。 試してみたいと思います。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.5

A2からA10までの例です。 myRow>=2 && myRow<=10 の2と10を適切な行番号に変更してください。 2行目以降全てなら&& myRow<=10は不要です。 function WriteVlookup() { var sheet = SpreadsheetApp.getActive().getSheetByName('入力シート'); var myCell = sheet.getActiveCell(); var myRow=myCell.getRow(); var myColumn=myCell.getColumn(); if(myColumn==1 && myRow>=2 && myRow<=10){ for(var i = 2; i <= 4; i++) { strformula ="=VLOOKUP($A" + myRow + ",'単価シート'!$A$2:$D$10," + i + ",False)"; sheet.getRange(myRow, i).setFormula(strformula); } } };

wansm
質問者

お礼

kkkkkmさん、大変丁寧な回答ありがとうございました。 おかげ様でA1だけの処理はできるようになりました。 久々感動です。凄いですねトリガーっていうのは。 A2を変更したら再びVLOOKUPでデータを参照してきます。 A2からA10というコードを実行していますが A3以降セットされません。 なにか手順があるのでしょうか? 申し訳ありません、今一度教えて頂けないでしょうか。 宜しくお願いします。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.4

トリガーについては以下のサイトを参考にして設定してください。 https://vba-gas.info/gas-trigger イベントの種類は「変更時」です。 また、一部訂正してください。 &ではなく正式には&&ということなので if(myCell.getColumn()==1 & myCell.getRow()==2){ ↓ if(myCell.getColumn()==1 && myCell.getRow()==2){

wansm
質問者

お礼

回答ありがとうございます。 トリガーは確認します。 あとは行が何行もあるので 入力した行の単価をコントロールになります。 また何かヒントを頂けたら幸いです。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

回答No2のシート名が違ってました。 getSheetByName('シート1'); ↓ getSheetByName('入力シート');

wansm
質問者

お礼

回答ありがとうございます。 今一度お聞きしたいのですが、 WriteVlookupをコーディングしたあと 実行するのですが、思い通りに実行しません。 ただコーディングするだけでは、ダメなのでしょうか? スクリプトのトリガーで変更時にスクリプトを実行と ありましたが、どのようにするとよいのか もう少し教えて頂けないでしょうか。 宜しくお願いします。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

スクリプトのトリガーで変更時に下記のスクリプトを実行するようにしてください。A2の値が変更されるたびに入力シートのB2,C2,D2にVlookup関数を書き込みます。B2,C2,D2の単価を変更した後にA2を変更すると元の単価にもどります。 function WriteVlookup() { var sheet = SpreadsheetApp.getActive().getSheetByName('シート1'); var myCell = sheet.getActiveCell(); if(myCell.getColumn()==1 & myCell.getRow()==2){ for(var i = 2; i <= 4; i++) { strformula ="=VLOOKUP($A2,'単価シート'!$A$2:$D$10," + i + ",False)" sheet.getRange(2, i).setFormula(strformula); } } };

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.1

単価を修正する時は単価シートの方を修正します。

関連するQ&A

  • スプレッドシートでの式の保護の仕方

    スプレッドシートで1つ教えて下さい。 A列のプルダウンで選択すると別シートの単価表を参照し B列からD列に単価が表示されるようにしました。 =VLOOKUP($A2,'単価シート'!$A$2:$D$10,2,False)という式になります。 しかし表示された単価を変更したい時に変更すると式までが消えてしまいます。 プルダウンから変更し直そうとすると式が消えてしまい 参照されません。 式は消えず、単価だけの訂正入力は可能でしょうか。 分かる方おられましたら、よろしくお願いします。

  • スプレッドシートのVLOOKUPについて

    スプレッドシートで1つ教えて下さい。 A列のプルダウンで選択すると別シートの品番単価表を参照し B列からD列に単価が表示されるようにしました。 同様にE列プルダウンで選択すると別シートの部品単価表を参照し F列からH列に単価が表示されるようにしました。 単価の値を変更後、再度プルダウンから値を選択すると 再度参照するように前回いろいろと教えて頂き下記のようなコードを書きました。 function WriteVlookup() { var sheet = SpreadsheetApp.getActive().getSheetByName('入力シート'); var myCell = sheet.getActiveCell(); var myRow=myCell.getRow(); var myColumn=myCell.getColumn(); if(myColumn==1 && myRow>=2 ){ for(var i = 2; i <= 4; i++) { strformula ='=VLOOKUP($A' + myRow + ',\'単価シート\'!$A$2:$D$4,' + i + ',False)'; sheet.getRange(myRow, i).setFormula(strformula); strformula2 ='=VLOOKUP($G' + myRow + ',\'単価シート\'!$A$6:$D$8,' + i + ',False)'; sheet.getRange(myRow, i + 6).setFormula(strformula2); } } }; しかしE列に値がなくてもセットしてしまい #N/Aが表示されてしまいます。 例えば 単価シート(2から4行目は品番単価、6から8行目は部品単価) 品番  単価1 単価2 単価3 あ   50 60 70 い   80 90 100  う 110 120 130 QQ 10 20 30 WW 40 50 60 EE 70 80 90 入力シート A   B C D E F G H あ  50 60 70 #N/A #N/A #N/A い 80 90 100 QQ 40 50 60 上記の式をどのように修正すれば#N/Aが 表示されなくなりますか? 分かる方おられましたら 教えて頂けないでしょうか。 宜しくお願いします。

  • VLOOKUPに関して教えてください

    EXCEL97です VLOOKUP関数で =VLOOKUP($B$1,SHEET!$A$2:$Q$30,2,0)という式を入力して次の列にコピーすると =VLOOKUP($B$1,SHEET!$A$2:$Q$30,2,0)とコピーしてしまいますよね 次の行には=VLOOKUP($B$1,SHEET!$A$2:$Q$30,3,0)にしたい時があるのでいつも 手入力で2→3に変更するかVLOOKUP式を入れなおしているのですが 手入力せずに2→3をコピーできる方法ってありますか? VLOOKUP式を使うことが多く毎回めんどくさくて・・・ どなたか教えてくださいませんか?

  • エクセルのVLOOKUPの複数参照について

    エクセルのVLOOKUPの複数参照について シート2(kokunai)に A列 B列 1000 シャープ 1010 ソニー 3050 パナソニック とあります。 シート3(yunyuu)に A列 B列 2000 IBM 2001 HP とあります。 シート1のC列に打ち込んだ数字を元にD列にメーカー名を表示したいのです。 D列に IF(C1="","",IF(ISERROR(VLOOKUP(C1,kokunai,1,0))="FALSE",VLOOKUP(C1,kokunai,2,0),VLOOKUP(C1,yunyuu,2,0))) と数式を打ちましたが、エラーが帰って来ます。 どうすれば良いでしょうか?

  • スクリプトの#N/A対策

    前回は大変丁寧な回答ありがとうございました。 申し訳ありません、今一度スプレットシートで 1つ教えて頂けないでしょうか。 前回同様の内容に入力列を1つ追加したいのです。 入力シートと単価シートがあります。 入力シートはA列から品番,単価1,単価2,単価3,部品,単価1,単価2,単価3となります。 単価シートはA列から品番,単価1,単価2,単価3で3行、1行空けて6行からは 部品,単価1,単価2,単価3で3行になります。 品番  単価1 単価2 単価3 あ   50 60 70 い   80 90 100  う   110 120 130 QQ   10 20 30 WW   40 50 60 EE   70 80 90 この様になります。 入力シートのA列で品番,E列で部品を入力すると単価シートを参照し B列からD列に品番単価,F列からH列に部品単価が表示されるようにしました。 そこで現状のコードだとE列に値が無くても部品単価1,2,3に#N/Aが セットされてしまいます。 下記のコードをA列,E列がセットされていない時は何もしないようにしたいのです。 function WriteVlookup() { var sheet = SpreadsheetApp.getActive().getSheetByName('入力シート'); var myCell = sheet.getActiveCell(); var myRow=myCell.getRow(); var myColumn=myCell.getColumn(); if(myColumn==1 && myRow>=2 ){ for(var i = 2; i <= 4; i++) { strformula ='=VLOOKUP($A' + myRow + ',\'単価シート\'!$A$2:$D$4,' + i + ',False)'; sheet.getRange(myRow, i).setFormula(strformula); strformula2 ='=VLOOKUP($E' + myRow + ',\'単価シート\'!$A$6:$D$8,' + i + ',False)'; sheet.getRange(myRow, i + 4).setFormula(strformula2); } } }; 例えば入力シートであと A列に入力すると E列まだ空白なのでF列からは#N/Aと表示されてしまいます。 A   B C D E F G H あ  50 60 70 #N/A #N/A #N/A い 80 90 100 QQ 40 50 60 上記のコードをどのように修正すれば#N/Aが 表示されなくなりますか? 宜しくお願いします。

  • VLOOKUPで質問

    VLOOKUP(D7,Sheet1!A$2:B$27,2,FALSE)という式を使用しています。 仮にB$27のB列を見に行くのではなくD列を見に行く式ってあるのですか? B列とC列は固定で他の値が入ってしまっています。 式があるならば教えてください。

  • VLOOKUP

    こんばんは、お世話になります。 早速ですが、 本来VLOOKUP関数を使う場合(第一引数、第二引数、第三引数)となっています、そこで何ですが A B C D E F G    1 ■入力表    2 商品No 商品名  単価  生産者 最低発注単位 納品予定 3 1 以下自粛その先にある物。 4 4 5 5 6 2 I J K L M N 1 ■マスタ 2商品No   商品名                  単価 3 1  以下自粛のそのさきにあるもの。       12000 4 2  1分で話せ。全裸で。 9800 5 3  いつか成功するから会費を払え。 淫らな心で。 15000 6 4  前向きな怠惰と前向きな惰性 18000 7 まぁこんな感じで表があるのですが。 そこで質問なんですが、この後 =VLOOKUP($B3, $I:$N, 2,0) これだと同じ値が入ってしまいますが(2列目までしか見てないから) =VLOOKUP($B3, $I:$N,6,0) こうすれば6列まで見ることが可能だけど、余談なんですが ビジネスの現場では、このようなVLOOKUP関数の入力と第三引数の修正が50列にわたるケースもあるそうです。 そこで第三引数にも参照を使うのですが長くなりましたがここで質問ですが、 A B C D E F G    1 ■入力表  2 3 4 5 6  2 商品No 商品名  単価  生産者 最低発注単位 納品予定 3 1 以下自粛その先にある物。 4 4 5 5 6 2 Cの1列目に数字を入れるのですが、 =VLOOKUP($B3,$I:$N,C$1.0)と関数を入力することによって Cの一列目を参照するとあるのですが、 Cの一列目には先ほど入れた数字しかないのにそこを参照して なぜ元々も情報を参照することができるのでしょうか? ご教示お願いします。

  • VLOOKUPの複数参照先

    こんばんは。 エクセルのVLOOKUPでの質問があります。 よろしくお願いします。 1つのbookの中にA,B,C,D...とシートがあります。 Aのシートにて、VLOOKUPを使ってデータの参照をしたいのですが、 B,C,D・・の複数のシートを参照先にしたいのですが、 可能なのでしょうか。 検索先の文字列に応じて検索シート先を変えられれば・・と 思っています。 もう一つ、参照先に目的の値がなかった場合、#N/Aが表示されるのですが、これを1などの数字にすることはできないでしょうか。 お願い致します。

  • VLOOKUP関数の範囲をセルで指定したいと思っています。

    VLOOKUP関数の範囲をセルで指定したいと思っています。 B1:参照シート名(VLOOKUP関数で使用する範囲があるシート) C2:範囲の開始位置 E2:範囲の終了位置 B3:G3:列番号(B3の値は、B6:B8の範囲で使用する列番号、 D3の値は、D6:D8の範囲で使用する列番号) これらのセルに入力された情報をもとにB6:G8の範囲にVLOOKUP関数を 反映させたいと思っています。 例えば、 B1に参照シート名「2ケタ」 C2にVLOOKUP関数の範囲の開始位置「A5」 E2にVLOOKUP関数の範囲の終了位置「G7」 B3に範囲の列番号「2」がある場合 B6に「=VLOOKUP(A6,'2ケタ'!A5:G7,2,0)の関数を入力。 B2に参照シート名「3ケタ」 C5にVLOOKUP関数の範囲の開始位置「B5」 E2にVLOOKUP関数の範囲の終了位置「H7」 C3に範囲の列番号「3」がある場合 C6に「=VLOOKUP(A6,'3ケタ'!B5:H7,3,0)の関数を入力。 といった感じです。 現在、B6に「=VLOOKUP($A6,INDIRECT($B$1&"!a5:g7"),INDIRECT("$b$3"),0)」と 関数を入力して、VLOOKUP関数の「範囲の参照シート名」と「列番号」の情報は セルから持ってくることができました。 しかし、「a5:g7」という範囲だけは、INDIRECT関数をうまく入れることができません。 どのように関数を入力したら、上手くいくのか、教えていただけないでしょうか。

  • VLOOKUP関数が数式として認識されません!

    スポーツクラブの学童会員名簿を作成しています。 【目的】 VLOOKUP関数を利用して、シート1「名簿」のA列に会員番号を 手入力すると B列に学年、C列に氏名が各々自動入力されるようにしたい。 【設定】 ・シート1を「名簿」とし、  A列を会員番号、B列を学年、C列とD列を結合して氏名としました。 ・シート2を「参照データ」とし、  A列を会員番号、B列を学年、C列とD列(結合を解除)を氏名と  しました。 ・シート2の1行目はタイトル行とし、実際のデータが入っている  部分はA2:D20です。 ・シート1、シート2の全データは文字列として書式設定しています。 【状況】 学年を検索するための数式をシート1のB2に以下のとおり 入力しました。  =VLOOKUP(A2,参照データ!$A$2:$D$20,2,0) ところが、B2セルには正常な値(学年)が表示されずに 上記の数式がそのまま表示されてしまうのです。 A2に会員番号を入力してもB2の表示は変わりません。 本やウェブで解決方法を調べてみましたが、一向にわからず 困り果てております。 私はエクセル初心者なので一般的にはくだらない質問かも しれませんが、何卒ご教示くださいませ。

専門家に質問してみよう