ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュの複数の条件に合致したデータの抽出方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
マクロの知識が不十分な為、関数を駆使して商品の出荷インボイス、パッキングリスト
梱包指示書まで、自動作成する仕組みを作りましたが、パレット毎に表示するラベル
(そのパレットに積載されている商品のリスト一覧)作りで、止まっています。

【教えてもらいたいこと】
商品を出荷する際の梱包指示書より、特定のパレットに積載される
段ボール箱に収納された商品のリストを自動作成させる為の関数もしくはその複合式。

【エクセル2007で作成されたDB形式データの構成】
梱包指示書には箱の種類(LL、L、M、S)、箱の通し番号(1から始まり、最大300箱目まで)
パレット番号(1から始まり、最大60パレットまで)、商品番号、数量、重量、などの情報がDB形式で
準備されている。

【条件】
1.マクロは使用しない。
2.フィルター機能は使用しない。(フィルターを操作して、コピペする動作を省きたい為)
3.DB形式データの配列順に、空白行が無いようにデータを抽出する。
4.抽出条件を別に用意されたセルに手入力する。
  抽出条件の数は最大で2。
  例えば、行:1行目に条件のタイトル、2行目にその抽出条件
        列:A列に抽出条件1、B列に抽出条件2

以上の条件でパレット毎に添付するラベルを自動作成させることの出来る
関数、それらの複合式を教えて頂ければ幸いです。

コメント(40)

トントンさん
はじめまして

grayfoxさんがご指摘のSUMPRODUCT関数で解決してたら読み飛ばして下さい。


あくまで「複数条件に合致するデータをリストアップ(明細表示)したい」と言うことだとした場合…方針としては

(1)指示書に指定した複数条件に合致するDBシート上のデータに連番をふる

(2)INDEX関数及びMATCH関数で指示書にデータをリスト表示させる

と言った感じでは如何でしょうか?


(1)の方法としては

(a)DBシートの最終列(便宜上Z列とする)に各列の値を「&"="&」などで結合して表示する

(b)次の列(AA列)に
=IF(ISERROR(AND(FIND(指示書条件1,Z列),FIND(指示書条件2,Z列))),"",MAX($AA$1:$AA1))
と入力する。


(2)の方法としては

(a)指示書シートの明細欄に連番をふっておく

(b)連番をキーとして
=INDEX(DBシート全体,MATCH(連番,DBシートAA列,0),必要な列番号)
と入力する。

と言った感じかな…と…


トントンさんの主旨を読み違えてたら…すみませんm(u_u)m
サンプルファイルアップしてくれりゃ、作ってやらんことも無い。
grayfoxさま、くま さま

ご丁寧なアドバイス心強い限りです。
昨日から明日にかけて出張があり、教えて頂いた内容を実行し、
そのご回答は木曜日以降となってしましますが
引き続き、面倒を見て頂ければ幸いです。
くま さま

ご紹介頂いた関数でトライしておりますが、下記疑問点にアドバイス頂ければ幸いです。

>=IF(ISERROR(AND(FIND(指示書条件1,Z列),FIND(指示書条件2,Z列))),"",MAX($AA$1:$AA1))
>と入力する。

MAXの式を使う狙いは何ですか?
また、AA列にMAX($AA$1:$AA1)と入力すると循環となってしまいますが・・・
これはMAX(FIND(指示書条件1,Z列),FIND(指示書条件2,Z列))ですか?
トントンさま

説明不足を補います。

DBシートのAA列に

MAX($AA$1:$AA1)

を指定するためには一行目が項目行になってる必要があります。

例えば「連番 箱種類 箱通番号…」などのようにです。

つまり先に記述した数式は、正確には「セルAA2に入力し、DBシートの最下行までドラッグコピーする」ことを前提としています。

また、MAX関数を指定する代わりにセルAA2に

=IF(ISERROR(省略),$AA1,$AA1+1)

と入力してドラッグコピーしても連番はふれますが…余計な表示は減らした方が良いかと思い私の好みで書いた次第です。

なお、DBシートに項目行がない場合は…セルAA1の数式だけ変えるか、IF関数とROW関数で一行目のみ返り値を変えるような数式にする方法があるかと思います。

ただし、私の経験上出来るだけDBシートには項目行を設けることをお勧めします。(特に一行目に設けるのがベストかと思います。)


説明下手で申し訳ありませんが…さらにご不明な点がありましたらまたお応え致しますので、投稿して下さい。
>>6
伝えづらい、伝わりにくい、察しにくいこととか色々あるだろうから
悪いことは言わん。サンプルちょうだい。
その方が話が早い。
ボランティアだが気分が変わらんうちに。
gravfox さま

サンプルを添付します。
一枚目の画像が出力したいフォーマット、
二枚目の画像がそのデータです。

一枚目画像ではPallet 欄に 「4」と入力すると、産品番号、BoxType(箱種)と箱番号(開始Noと終了No)
数量、それらをバーコード化した情報が自動作成されるような関数もしくは複合式を教えて頂きたい次第です。
(バーコード化は出来ているので、今回の質問の対象外)
(最終的には全てのラベルを自動印刷化するのが狙い)

二枚目の画像がその元データとなります。
梱包箱種がPの場合はPalletに1箱積載なので、このラベルは不要。
箱種がP以外の場合に一つのPalletに複数の箱が混載されるので、その内容を表示する為、ラベル作成、印刷が必要なる訳です。

因みに箱数の最大は300箱、Pallet数の最大は60枚です。
各製品毎に箱に収納される数量は個々に定められた一定の数量です。
箱種Lは9箱、Mは18箱 一つのパレットに積載可能です。

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

いろいろアドバイス有難う御座います。
正直、理解が出来ていないので、画像サンプルに当てはめて見た具体例で
説明頂けると助かります。

勝手を言って申し訳ありません。
トントンさま

確認ですが…出力フォーマットに指定する条件は「パレット番号」のみですか?

トピ条件では「最大2つまで条件指定」とあった気がしますが…


因みにパレット番号に合致する明細を羅列するだけなら簡単で…データシートの「数量」列の次列(G列と仮定)に


G1:
「パレット連番」(任意の項目名)

G2:
=IF($B2=出力フォーマットのパレット番号指定セルの地番,MAX($G$1:$G1),"")

G3:
=IF($B3=出力フォーマットのパレット番号指定セルの地番,MAX($G$1:$G2),"")


と入れると、出力フォーマットに指定したパレット番号に合致するデータに連番がふられます。


次に出力フォーマットの例えば「産品番号」のNo.1のセルがB3だとして…

B3:
=INDEX(データシートの$A:$G,MATCH($B2,データシートの$G:$G,0),5)

と入力すれば出力フォーマットのNo.をキーとして、データシートのG列上で合致する連番の行の製品番号が表示されると思います。(最後の「5」はデータシート上の列番号ですので、表示したい列の番号を指定して下さい。)


ただし、No.に合致する行がデータシートG列上にない場合はエラーとなるので…

B3:
=IF(ISERROR(上記のINDEX式)),"",上記のINDEX式)

としておくと良いと思います。


取り急ぎ上記で如何でしょうか?
お?サンプル来たね。
今出先だから、家ついたらじっくり見てみます。
くま さま

お忙しい中、ご丁寧なアドバイスありがとうございます。

お問い合わせの出力フォーマットに指定する条件は、下記2つです。
1.パレット番号
2.箱種Pを積載したパレット以外

そして、記載された通り式を入力しましたが、下記結果となりました。

1.データシートG列の計算(MAX($G$1:$Gn))結果 (n:n行目を意味する)
  パレット番号が合致した行のみ0の表示
  連番は振られていません。
  MAX関数で連番が振られるようにするには
  MAX(省略)+1とすればよろしいですか?

2.出力フォーマットシートB3の表示結果  #N/A
  確認:下記MATCH関数の$B2はデータシートの$B2ですね。
  >=INDEX(データシートの$A:$G,MATCH($B2,データシートの$G:$G,0),5)
  
  →データシートのセルG2以降の行に上記MAX(省略)+1を入力すると
    連番が表示され
    出力フォーマットシートB列3行目以降に産品番号が表示された。
    但し、同じ産品番号が表示されてしまう。

3.未解決の問題
  出力フォーマットのセルB4以後(B5, B6・・・)にB3と同じ産品番号が
  表示されないようにしたい。
  即ち、出力フォーマットでは各産品番号は重複させず、数量は合計を表示したい。
  
  この関数・複合式についてアドバイス頂ければ幸いです。 
grayfox さま

13)の未解決の問題には はじめからご指摘されている
sumproduct関数がよさそうですね。

しかし、大変複雑ですので、小生の手に負えません。
作成して頂ければ大変助かります。

よろしくお願い致します。
今作成中ですが、課題は2つですね。
1.検索結果が複数あること。それらを漏れなく全て表示すること。
2.検索条件が複数存在する場合の処理方法。

1は、ピボットと配列関数を使用して処理。
2は、Sumproductで処理

といったところでしょうか。
時間はかかるが何とかなりますね。
もっさりファイルになりそうですけどw
トントンさま

ご指摘のとおり、MAX(省略)+1 が正しいですね…すみませんm(_ _)m

携帯からアクセスのため思考実験的な書き込みになっていますこと、ご容赦下さい。


なお、上記の条件下でのアイデアはありますが…とりあえずはgrayfoxさんの結果をお待ちするのが良さそうですね。
昨日寝ちゃった。

時間かかりますこれ。
お待ち下さい。
津ドアラ さま

未だ、解決には至っておりません。

gravfox さんが解決策を考えてくれています。

また、私も くま さんのアイデアを発展させて下記式をG2番地以降に入力し

>10 より引用
データシートのG2番地:
=IF(C2="P","",if(出力フォーマットのパレット番号指定セルの絶対番地=B2,if(OR(G1="パレット連番",G1=""),1,if(E2=E1,G1,G1+1)),""))

G3以降:上記式をコピー

上記式により、箱種がPの場合はデータを抽出しない、そして産品番号が重複しないように
連番をつけることができた。

この連番と出力フォーマットのA列にふられている番号をキーとして
Index関数、iserror関数、Match関数の複合式(>10の考え方と同じなので省略)を
出力フォーマットのB3番地以降に入力して

産品番号までは抽出できましたが、箱番号の開始番号と終了番号、
を抽出すること、そして数量合計を出す複合式が思いつかず・・・
その解決までには至っていません。
現在、引き続き頭をひねっていますが・・・・・

もっと良いアイデア、ヒント等が有ればご教授頂ければ幸いです。
ほいよ
http://www.dotup.org/uploda/www.dotup.org837250.xls.html

ファイルアップしておいた。ここからダウンロードしてくれ。
もしリンク切れてたら言ってくれ。

言いたいことは山ほどあるが、寝るわ。
grayfox さま

徹夜で回答作成頂いたのですか・・・・
お疲れ様でした。 そして、ありがとうございました。

そのご努力の作品を拝見しました。

Small 関数、こだわっていらっしゃいますね !!
この関数は使った経験と見た経験が有りませんが、
今後スマートな出力をする場合に重用したいと思います。
すばらしいですね。  書類を見る人に優しい!!!

ピボットテーブル(平均値)で産品番号抽出、最小で開始箱番号、最大で終了箱番号
とてもすっきりしていますね。  簡潔で判りやすい!!!

sumproduct 関数と条件式の組み合わせ、これも見事ですね。


このファイルのデータシートに記載されたタイトル部を残し、データ部分を消去して、
エクセル2007のテンプレート形式で保存し、次回書類作成より汎用的に使用する場合、
ピボットテーブルでは毎回、更新の必要があると思いますが、
これを自動更新する方法は有るでしょうか?
> トントンさん

徹夜といっても完徹ではないが…
まぁバックアップ取ってから好きにいじって下さいな。

・ピボットの更新
表が更新されれば自動。
もし更新されないなら、ピボットの表を選択したときに出てくる、exclamationみたいなアイコンをクリック。
なお、今より項目増えると、場合によっては関数修正の必要有。
マクロはダメとのことでしたが、ピボットは禁止されてなかったので遠慮なく。

・Excel2007に…云々
知らぬ。分からぬ。聞こえぬ。2007を持っておらぬ。

・テンプレート形式で保存云々
やってみて下さい(私ゃ知らん)

・パレット番号入力部分
そのセルの隣にリストが隠してある。

・製品番号部分
関数を修正する場合は、まずセルの結合を解除する。
配列関数にするには、ctrl+shift+ENTER。
なお配列関数にしないと動作しない。
並び順を変えたければ、元のピボットをいじればいい。
出力用のシート内でフィルターかけて並び替えても良いけど。
メンテ要らずってことにはならんがね。

・それ以外の部分
まぁこのトピック内容から察するに、特に解説はいらんっしょ。
sumproduct関数は応用の幅が広く、重宝するので覚えて損はない。
ちなみに今回の使用方法は、ヘルプには載ってない。

sumproduct関数や配列関数について「動きがもっさり」「ファイルが重く…」云々言う人がいるが、
当該ファイルは30k弱ですが何か?

・産品番号部分(トントンさんには解説不要かと思いますが)
要は、縦列に製品番号リスト(重複無し、空欄無し)
横にパレット番号(重複無し)をとり
データが存在する(例、製品Aがパレット4にある)場合、
「縦横一致する部分に、そのパレット番号を表示する」というリストが欲しかった。
平均を使ったのは、まぁn*x個/x個=nを、パレット番号を表示するのに使用したということ。(4が100個あろうが200個あろうが、平均は4でしょ。)

・smallとrowで「複数番目(小さい順に何番目)のデータを〜」って指定をしている。
rowの引数指定方法は、サンプルの通り。


・最後に3つ

・これはACCESSでやったら楽よ。
・サンプルは画像ではなく、Excelファイルを下さい。
・会社名への突っ込みは無しっすかw

何かあったら言って下さい
今日の東京はいい天気。
では
grayfoxさま

この度はいろいろなことを勉強させて頂き、視界が開けました。

・ACCESSが楽   そのようですね。
 しかし、敷居が高くて現時点、開発レベルのスキル不足で
 現在の業務に使うものを作るのを半分諦めています。

・サンプルをExcelファイルで送る件
このコミュニティーではエクセルファイルが添付出来ないと思っていましたが、
grayfoxさんがご利用になった方法が有るのだ、と新たな発見でした。
それにしても画像ファイルからエクセルに再入力のお手間をかけさせてしまい
申し訳ありませんでした。

・会社名が変わっていたのには気がつきましたが、その意味するところ、
 おそらくジョーク? の意味がわからず 反応出来ませんでした(^_^;)

本日の上海も清々しい天気です。

また、よろしくお願いします。
くま さま

エクセルでのデータ抽出方法がわからず、悶々とした時期をおくって下りましたたが、
お陰様でその方法を習得することが出来ました。

ありがとうございました。

また、何かありましたらよろしくお願い致します。
これ、箱番号がポイントで、箱番号が決まれば、後はVLOOKUPで簡単に参照できますね。

F19=OFFSET(データ!$A$1,MATCH($H$1,データ!$B$2:$B$30,),)
F20=IF(COUNTIF(データ!$A$2:$A$30,H19+1),IF(VLOOKUP(H19+1,データ!$A$2:$B$30,2,)=$H$1,H19+1,""),"")

H19=IF(F19="","",F19+COUNTIF(INDIRECT("データ!E"&F19+1&":E"&MATCH($H$1+0.1,データ!$B$2:$B$30,1)+1),B19)-1)

B19=IF(F19="","",VLOOKUP(F19,データ!$A$2:$E$30,5,))

E19=IF(F19="","",VLOOKUP(F19,データ!$A$2:$E$30,3))

以下フィル
他は、grayfoxさんのと同じ

お礼はgrayfoxさんへ
F19もエラー処理しておきましょう。

F19=IF(COUNT(MATCH($H$1,データ!$B$2:$B$30,)),OFFSET(データ!$A$1,MATCH($H$1,データ!$B$2:$B$30,),),"")
たつや さま

箱番号をキーとする着眼点でこんなにもシンプルになるのですね。
奥が深い作品、結果を見てすばらしいと感じました。

お手数ですが、下記点、解説頂ければ幸いです。
奥が深すぎて理解度が追いついていません。

1.H19のIndirect関数で範囲を指定出来るのですか?
  その部分のみ取り出した下記式
  =INDIRECT("データ!E"&F19+1&":E"&MATCH($H$1+0.1,データ!$B$2:$B$30,1)+1)
  は#VALUE! となってしまうのですが・・・

2.H19でMatch関数の検索値に0.1を加算する理由
この加算が無くても解は同じのようですが・・・
トントンさま


問題が解決したようで良かったですね。

今回のようなケースの場合、私は先の連番ふりを多用してました。

(1)条件1に合致するものに連番ふり
(2)(1)の連番順に別セルにデータを表示
(3)(2)の表に対して条件2に合致するものに連番ふり
(4)(3)の連番順に別セルにデータを表示
(5)以下同じ

こんな感じで…


でも今回はピボットを使ったスマートなブックを提示していただいたみたいで…私も今後の参考にさせていただきますね。
>1.H19のIndirect関数で範囲を指定出来るのですか?

この場合は範囲を指定しています。
INDIRECT関数は、中身をそのまま上位の関数に渡す働きがあります。
セルを変化させたい場合に使います。

部分を取り出して解明するのはとても有効です。
エラーになったらさらに小さい部分を取り出しましょう。

>2.H19でMatch関数の検索値に0.1を加算する理由

この0.1が最大のポイントです。
以下の2つを比較してみてください。
MATCH($H$1,データ!$B$2:$B$30,)+1
MATCH($H$1+0.1,データ!$B$2:$B$30,1)+1
たつや さま

>1.Indirect関数では中身をそのまま上位の関数に渡す働きがあること、
今迄、一つのセルの内容と勝手に解釈していました。
これは便利ですね!!

エラーとなった件、おそらく保存したファイルのパスが異なるからだと思います。


>2.H19でMatch関数の検索値に0.1を加算する理由
例示された2つで異なる結果となるのは理解できるのですが、
質問の意味は
>MATCH($H$1+0.1,データ!$B$2:$B$30,1)+1 と 検索値に0.1を加算しない
>MATCH($H$1,データ!$B$2:$B$30,1)+1    は同じ結果となるのではないですか?
Match関数の場合、検索値は既にその値を含んでいる「以上」ではないですか?
未満であれば0.1を加算する意味がわかるのですが・・・
気になって今頃確認してみました。

>MATCH($H$1+0.1,データ!$B$2:$B$30,1)+1
>MATCH($H$1,データ!$B$2:$B$30,1)+1

同じですね。0.1を足す意味が無いです。
携帯からの回答で、思いこみでやっていたので、
間違えてしまいました。
もちろん、数式の作成はパソコンですが、試行錯誤
で作成しているのがバレバレですね。

結局、EXCELを全然理解していない初心者です。
> たつや.comさん

試行錯誤せずに作る人なんていないよ…
いいじゃん別に。
むしろこれまでの書き込みを思考実験的に書いてたことの方が驚愕。
どんな初心者だよw
MATCH関数も100%理解できていないど素人ですw
というか、MATCH関数にこんな使い方があったのかと、
自分が一番勉強になっている…

EXCELは奥が深いです。
ということで、お詫びに、さらに試行錯誤(思考錯誤かも?)して、

H19=IF(F19="","",F19+COUNTIF(INDIRECT("データ!E"&F19+1&":E"&MATCH($H$1,データ!$B$2:$B$30,1)+1),B19)-1)

の代わりに、

H19=IF(F19="","",F19+COUNTIF(OFFSET(データ!$E$1,F19,,MATCH($H$1,データ!$B$2:$B$30,1)+1),B19)-1)

少し短くなりました。
たつやさま

Match関数の件、100%は理解していないかもしれませんが、
私は物事は80%程度出来れば上々を思っています。
そして、残りの20%は皆様に助けて頂きながら、
また、もし私で役に立つことであれば、私も時々回答者として
自分の研鑽の為に、このコミュニティーに参加したいと思い、
ちょくちょくこのコミュニティーをみています。

たつやさまの精力的な貢献、凄い能力かと関心しています。
簡潔、明瞭に説く技術と努力、そして忍耐に。

しかし、たつやさまにご指摘された内容、何度かここにアップした内容で確認しましたが、
+0.1が有っても無くても同じ結果でした。 箱番号は正の整数なので。

本日、教えて頂いた改訂バージョンの数式、じっくり味わって見たいと思います。
この数式は、今まで自分が使ったことのない組み合わせで、今後の私の仕事に
多大な貢献をすることは確実です。 
ありがとうございました。
また間違えてしまったようです。(確認不足です)

H19=IF(F19="","",F19+COUNTIF(INDIRECT("データ!E"&F19+1&":E"&MATCH($H$1,データ!$B$2:$B$30,1)+1),B19)-1)

の代わりに

H19=IF(F19="","",F19+COUNTIF(OFFSET(データ!$E$1,F19,,MATCH($H$1,データ!$B$2:$B$30,1)-F19+1),B19)-1)

です。3文字少なくなっただけですね。
文字数に拘れば、さらに5文字削減

H19=IF(F19="","",F19+COUNTIF(OFFSET(データ!E$1,F19,,MATCH(H$1,データ!B$2:B$30,1)-F19+1),B19)-1)

ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。