- ベストアンサー
エクセル2000:VLOOKUPについて質問
VLOOKUPについて質問です。 使う行の中にブランク(なにも入っていない)セルがあるのですが、VLOOKUPを使って返されてきたブランクのセルが0(ZERO)で表示されてしまいます。 元のワークシートが、ブランクとZEROが混在している(使い分ける)仕様になっているため、ブランクはブランクのまま表示させたいのですが、対策はあるでしょうか。 よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。#7です。 >それではあまりにもおんぶにだっこで申し訳ないので、 ・・・ >VBAについて書かれているビギナー向きサイトがありましたら、 >そちらを教えていただけないでしょうか そうですか。控えめな方ですね^^; それでは、VBA関連の参考サイトをご紹介しておきます。 MOUG.Net http://www.moug.net/ VBA入門用として評判の高い書籍を書いていらっしゃる、 大村あ○しさんの主催するサイトです。 なにを隠そう、わたしも初心者のころ、 この方のテキストでVBAを学びました。 マイクロソフト ヘルプとサポート http://support.microsoft.com/default.aspx?LN=JA 原因不明のエラーに直面したとき、 やはり頼りにするのは開発元です。 FAQからバグ(仕様?!)に関する情報まで、 非常に詳細な情報が得られます。 丹念にさがすと、意外に?初心者にもわかりやすい書き方で 図解入りで解説したページもあります。 ほかにも、検索エンジンで探すと山のように引っかかります。 VBA便利帳 http://www2s.biglobe.ne.jp/~iryo/ Excelファンクラブ http://www.fuji.ne.jp/~excelyou/
その他の回答 (7)
- happypoint
- ベストアンサー率36% (521/1422)
こんにちは。 #3です。 数式をスマートにしたい、ということですが、 ワークシート関数の組み合わせで条件が複数となる場合、 式が長くなるのは、いたしかたありません。 もちろん、理想論を振りかざせば式が短いに越したことはないのですが。 ところでbari_sakuさんはVBAはお使いになれますか? どうしても深刻な理由で式を短くしたいということであれば、VBAを使って そのブックのみで使用できる「ユーザー関数」というものを作ることができます。 ユーザー関数を組み込むと、たとえば、 =MYLOOKUP(A1,B4:D100,1,FALSE) というひとつの条件式だけで、 ブランクのとき エラーのとき それ以外のとき で異なる処理を返す、独自のLOOKUP関数を作成することが可能です。 もしご希望でしたら補足してください。 補足があれば、作成してみます。
補足
こんにちは。 No.6の方のお礼欄にも書きましたが、VBAという言葉はじつは初耳です(^^;) 「作成してみます」だなんて・・・本当にありがとうございます!!(感涙) では早速お願いします・・・と本当は平身低頭したいところなのですが、それではあまりにもおんぶにだっこで申し訳ないので、もしhappypointさんご推薦の、VBAについて書かれているビギナー向きサイトがありましたら、そちらを教えていただけないでしょうか。 使いこなせればとても便利そうなので、これを機会に少しかじってみようかと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
関数のネストも2段までと自分で決めています。 関数の値によって、左右したい時、2度同じ式が現われる(入力する)のも好みではないです。 VBAなら Sub test01() d = 10 For i = 1 To d If Cells(i, "A") = "" Then Else Cells(i, "b") = WorksheetFunction.VLookup(Cells(i, "A"), Range("c1:d5") _ , 2, False) End If Next i End Sub dは最下行の行数を指定します。
お礼
こんにちは。 No.7の方も言及されていますが、これがVBAというものなのですね。 始めて見ましたが、昔COBOLのプログラミングをやっていたせいか(年がバレる・・・)何となく何をいわんとしているかはわかるような気がします。 詳細なご回答、ありがとうございました。
- dejiji-
- ベストアンサー率38% (327/858)
#02ですが、補足から 関数使用でネストを繰り返していると、もしその後修正があった場合に非常に複雑な式を解読するのが困難になると思うのですが。 私だったら、作業セルを一つ追加して先ほどの式を =IF(ISERROR(B4),"",B4) と変更し、作業セルを非表示にすればワークシートの形式は崩さずに出来ると思うのですが。 もしかして、関数でブランクにする以外に通常のブランクセルも存在しているとか、無いですよね。
補足
幸いにして「通常のブランクセル」はありません。 ネストを繰り返す件につきましても、私としても式を複雑にするのは本意ではないのですが、じ、実はですね。 VLOOKUPの式を入れる列が、連続して100行超あるのです。 (ちなみに行は1300です) 一列ならdejiji-さんの方法に即飛びつけるのですが、100列設定することを考えますと…何かよいお知恵はありますでしょうか。
- free-goo
- ベストアンサー率18% (28/155)
#3方に補足しているように、もう1つ条件を入れてはダメですか?? =IF(ISERROR(VLOOKUP(A1,B4:D100,1,FALSE)),"",if(VLOOKUP(A1,B4:D100,1,FALSE)="","",VLOOKUP(A1,B4:D100,1,FALSE))) bari_sakuさんが 作られた数式の間に もう1つ追加しただけです。最初のVLOOKで、該当ない場合は、空白表示 次に 該当するものがあったが、結果が空白の場合、0(zero)を表示するところ、IFの追加で、0(zero)であれば、表示しないってしたんですが、こんなんじゃないですか???? 間違っていたら ごめんなさい・・・・・・・
補足
半泣き状態だった私も、ない知恵を振り絞ってひとつ考えてみました。これでも大丈夫でしょうか? =IF(OR(ISERROR(VLOOKUP(A23,B4:DL306,19,FALSE)),ISBLANK(VLOOKUP(A23,B4:DL306,19,FALSE))),"",VLOOKUP(A23,B4:DL306,19,FALSE)) 後で手直しする可能性を考えて、なるべくスマートな式にしたいのですが、ここまで長くなるとスマートもヘッタクレもないような……
- happypoint
- ベストアンサー率36% (521/1422)
こんにちは。 ISBLANK関数でブランクかどうかを判別し、 IF関数でブランクか否か判断させます。 以下の数式は、 VLOOKUPの結果が「ブランク」の場合のみ、 ""(長さ0の文字列)を返します。 セルの番地は適当に変更して使用してください。 =IF(ISBLANK(VLOOKUP(C1,A1:B3,2,FALSE)),"",VLOOKUP(C1,A1:B3,2,FALSE))
補足
こんにちは。 実は、表示にあたってさらに「エラーの場合はなにも表示しない」という条件があったりします。 よって現在は =IF(ISERROR(VLOOKUP(A1,B4:D100,1,FALSE)),"",VLOOKUP(A1,B4:D100,1,FALSE)) ……という式になっているのですが、さらにISBLANK関数を付け加えるとなると…… おそらく、OR関数とISERROR関数とIF関数を使って、「エラー又はブランクの場合は""を表示し、そうでない場合はVLOOKUPで該当するセルの内容を表示させる」という式を作ればいいと思うのですが、私の知識ではその案を出した所までが限界です。 どうか引き続き、お知恵を貸していただけないでしょうか。
- dejiji-
- ベストアンサー率38% (327/858)
式で別セルを参照するとブランクがゼロになって返ってきます。これをブランクにするにはもう一つ参照セルを作れば解決するのですが。 A、B列にVLOOKUP関数の範囲があるとすると、C列に=IF(B1<>"",B1,"")と入れ、この列を返すようにすれば0とブランクが区別できます。
=VLOOKUP(の中に返す答えをIF(…,"",IF(…,0 のように検出される答えの中の0とブランクを両方IF文の入れ子にすれば可能かと、やってみてないので自信なしです
お礼
こんにちは。回答第一号、恐れ入ります。 関数はまだまだ使うようになったばかりで、改めてエクセルの深遠さを感じています。 今日も別の仕事の合間に、ない知恵をしぼって、頭の中で一生懸命式を組み立ててました。 もう少し粘ってみようと思います。ありがとうございました。
お礼
こんにちは。お礼が遅くなりまして…。 あくまで希望的憶測なのですが、参考書の類があれば何とかなりそうな気がしますので、まずは自力でやってみようと思います。 壁にぶち当たった時は、遠慮なくまたこちらに質問させて頂きますのでご安心(?)下さい。 何度も回答して頂きまして、ありがとうございました。