プロが教えるわが家の防犯対策術!

Excelで、発注書を作成しようとしています。
1、Sheet1には<発注先><品名><数量>のデータになっており、
  同じ発注先のデータも含んでいます。
  <発注先> <品名> <数量>
   A社   みかん   10
   A社   もも     5
   B社   ぶどう    3
   C社   みかん    5
   C社   バナナ    5

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

 できれば関数でできればいいのですが、何かよい方法はないでしょうか?よろしくお願いします。
   

A 回答 (4件)

◆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))))
★右と下にコピー
    • good
    • 1
この回答へのお礼

早速のご回答ありがとうございました。
関数を1つずつ理解しながら、なんとか理解できました。

お礼日時:2007/07/11 22:00

「別シート」において


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 を下方にズズーッと複写
    • good
    • 4
この回答へのお礼

まだ記載いただいた関数式の意味は理解できていませんが、
そのとおりに作ったら、見事できました。
これで作業がスムーズに行えます。ありがとうございました。

お礼日時:2007/07/11 22:02

(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!」をつければできる。
    • good
    • 0

#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になるよう
にしてください。
    • good
    • 0
この回答へのお礼

関数のわかりやすい解説とVBAまで作成いただき本当にありがとうございました。
VBAに関しては、必ず必要になってくると感じますのでこれを機会に
納得できるよう、理解するつもりです。
エクセルって使う人によってはポテンシャルのほんの数%しか使えていないことに気づかされました。

お礼日時:2007/07/11 22:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!