解決済みの質問

質問No.3157199
困ってます
困ってます
お気に入り投稿に追加する (2人が追加しました)
回答数4
閲覧数14751
Excelでデータ抽出処理をオートフィルタではなく関数でできませんか?
Excelで、発注書を作成しようとしています。
1、Sheet1には<発注先><品名><数量>のデータになっており、
  同じ発注先のデータも含んでいます。
  <発注先> <品名> <数量>
   A社   みかん   10
   A社   もも     5
   B社   ぶどう    3
   C社   みかん    5
   C社   バナナ    5

2、このSheet1のデータを各発注先ごとに発注書を作成するため
  別シートに用意した発注書フォーマットに貼り付けたい。
  (注:発注先は60社ほどあり、オートフィルタで発注先ごと
     にコピペしていくのは、困難です)

 できれば関数でできればいいのですが、何かよい方法はないでしょうか?よろしくお願いします。
   
投稿日時 - 2007-07-11 01:37:17

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

回答No.2
「別シート」において
1.セル B2 に「発注先」名を入力
2.セル A4 に次式を入力して、此れをセル B4 に複写
  =IF(ROW(A1)>COUNTIF(Sheet1!$A$2:$A$1000,$B$2),"",OFFSET(Sheet1!$A$1,MATCH($B$2,Sheet1!$A$2:$A$1000,0)+ROW(A1)-1,COLUMN(A1)))
3.範囲 A4:B4 を下方にズズーッと複写
投稿日時 - 2007-07-11 07:08:08
この回答を支持する
(現在0人が支持しています)
お礼
まだ記載いただいた関数式の意味は理解できていませんが、
そのとおりに作ったら、見事できました。
これで作業がスムーズに行えます。ありがとうございました。
投稿日時 - 2007-07-11 22:02:43
この質問は役に立ちましたか?
5人が「このQ&Aが役に立った」と投票しています

ベストアンサー以外の回答 (3)

回答No.4
#3です。追加して、別方法で1つ上げます。
(3)ユーザー関数法
エクセルで抜き出しを難しくしているのが、2番目、3番目、・・
の見つかったデータのあり場所(行番号)が判る関数が無いのが原因と考えます。それで自作しました。
ーー
例データは#3と同じ。
I1セルに、抜き出すA社を入れる。
I列 J列 K列 L列(参考)
A社
A社みかん102
A社もも53
A社バナナ87
A社スイカ79
0
ーーー
ユーザー関数の作成
VBEの標準モジュールに
Function fnd(a, b, c)
k = 0
cl = a.Column
For i = 1 To 1000
If Cells(i, cl) = b Then
k = k + 1
Select Case k
Case c
' MsgBox i & "-" & k & "-" & c
fnd = i
Exit Function
Case Is > c
fnd = 0
Exit Function
End Select
End If
Next i
End Function
をコピー張り付けする。
使い方は、この関数には、3つ引数があって
=fnd(探す列、探す会社等の内容,何番目に見つかったものを採るか)
これで、指定番目に、見つかった行番号を返して来ます。
ーー
I2に
=IF(fnd($A1,$I$1,ROW()-1)=0,"",INDEX($A$1:$C$100,fnd($A1,$I$1,ROW()-1),COLUMN(I1)-8))
と入れて、J,K列に式を複写。
I2:K2を下方向に式を複写。
ーー
結果
上表のとおり。
L列はfnd関数だけの、返してくる値を参考までに上げた。
ーーー
Sheet2に抜き出す場合は
A2に
=IF(fnd(Sheet1!$A2,$A$1,ROW()-1)=0,"",INDEX(Sheet1!$A$1:$C$100,fnd(Sheet1!$A1,$A$1,ROW()-1),COLUMN()))
C2まで式を複写。
A2:C2を下方向に式を複写。
結果 Sheet2 A1:C5
A社
A社みかん10
A社もも5
A社バナナ8
A社スイカ7
指定社名A社のセルが別のセルにある場合
社名をセットする列が変わる場合、Column()より適当数を引いて、際右列が1になるよう
にしてください。
投稿日時 - 2007-07-11 11:13:34
この回答を支持する
(現在0人が支持しています)
お礼
関数のわかりやすい解説とVBAまで作成いただき本当にありがとうございました。
VBAに関しては、必ず必要になってくると感じますのでこれを機会に
納得できるよう、理解するつもりです。
エクセルって使う人によってはポテンシャルのほんの数%しか使えていないことに気づかされました。
投稿日時 - 2007-07-11 22:07:15
回答No.3
(1)関数で 
#1、#2のご回答
あの式が理解でき、頭に入る方はこれが良い。
(2)関数で
もう少し判りやすいかなという方法。作業列を使います。(自称imogasi方式)Sheet1のA1:E9
社名品名価格社連番
A社みかん10A社1
A社もも5A社2
B社ぶどう3B社1
C社みかん5C社1
C社バナナ5C社2
A社バナナ8A社3
D社栗11D社1
A社スイカ7A社4
ーー
E2の式は 
=A2 & COUNTIF($A2:A$2,A2)
式を下方向に複写。
結果
上記
ーーー
I1に指定会社名を入れる。
I2に
=IF(ROW()-1>COUNTIF($A$2:$A$100,$I$1),"",INDEX($A$2:$C$100,MATCH($I$1&ROW()-1,$E$2:$E$100,0),COLUMN(I2)-8))
と入れて、J、K列に式を複写。
I2:K2を範囲指定し、K2で+ハンドルを出して下へ引っ張る。
ーー
I、j、k列をSheet2に出す場合は、Sheet1のA-Dの参照には「Sheet1!」をつければできる。
投稿日時 - 2007-07-11 10:22:40
この回答を支持する
(現在0人が支持しています)
回答No.1
◆Sheet1
    A       B      C
1  <発注先>  <品名>  <数量>
2   A社    みかん   10
3   A社    もも      5
4   B社    ぶどう    3
5   C社    みかん    5
6   C社    バナナ    5

◆Sheet2
    A       B
1  発注書
2  発注先    C社
3  品名     数量
4  みかん     5
5  バナナ     5

◆Sheet2のB3に、発注先を入力します
A4=IF(ROW(A1)>COUNTIF(Sheet1!$A$1:$A$10,$B$2),"",INDEX(Sheet1!B$1:B$10,SMALL(INDEX(SUBSTITUTE(N(Sheet1!$A$1:$A$10=$B$2),0,10^5)*ROW(Sheet1!$A$1:$A$10),),ROW(A1))))
★右と下にコピー
投稿日時 - 2007-07-11 04:07:59
この回答を支持する
(現在0人が支持しています)
お礼
早速のご回答ありがとうございました。
関数を1つずつ理解しながら、なんとか理解できました。
投稿日時 - 2007-07-11 22:00:14
別のキーワードで再検索する
もっと聞いてみる

関連するQ&A

回答募集中

同じカテゴリの人気Q&Aランキング

この他の関連するQ&Aをキーワードで探す

別のキーワードで再検索する
-PR-

OKWaveのおすすめ情報

特集

このQ&Aの関連キーワード

同じカテゴリの人気Q&Aランキング

総合ランキング
-PR-

ピックアップ

ノウハウ共有サイト

-PR-
-PR-