dポイントプレゼントキャンペーン実施中!

こんにちは、Excelの関数で教えてください。

いま注文書を作成しています。A1からE10の
範囲でタイトル行含み10行作成し、A~Eには
それぞれ型番、商品名、単価、数量、合計金額が
入っているとしてください。つまり商品の種類は
9種類です。

ここで、たとえば2行目と6行目のみ注文がある
場合、2行目と6行目だけ数量の欄に入力されます。
すると、印刷時に2行目と6行目だけ印刷されるよう
制限をかけたいのですが、どのような関数を使えば
できるでしょうか?

メンテナンス等を考慮し、できればマクロを使わず
関数だけで実現したいのですが・・・。

よろしくお願いします。

A 回答 (7件)

#1です。

#4、#5、#6の方はかなり工夫をされた回答で大変参考になると思います。また、#6の方の「…VBAで自動化しないと、関数では自動化省力化しないので前途多難なように思います。」とおっしゃるのはもっともだと思います。

関数の中に関数を入れる等の多様化をするほど、誤りがあったときに、誤りを探すのに苦労します。(これは私だけの経験ですが)

#1の回答に対する補足での「フィルタをかけてから印刷するといった2段階の手順を自動でする」といったことをお望みであれば、やはり一つのマクロにしてしまう方が、メンテナンス等を考慮された方法だと思います。(私だけの考えかもしれませんが…。)
    • good
    • 0

A2:B8に下記きデータがあるとする。


注文品名がA列、注文したのはB列に数字のある行で、注文数はその数とする。C列はワーク列です
A列  B列   C列
a0
b231
c1
d1
e342
f2
g23
C2セルに、=COUNTA($B$1:B2)と入れて、下方向に式を複写する。
結果は上記のとおり。注文した品の行で1だけカウントアップしてます。
ここが味噌です。
普通は抜き出し先はSHeet2などですが、説明を簡単にするため、すぐ横に注文品と注文数を抜き出します。
F2セルに=OFFSET($A$1,MATCH(ROW()-1,$C$1:$C$100,0)-1,0)
F3以下に式を複写する。
G3に=OFFSET($A$1,MATCH(ROW()-1,$C$1:$C$100,0)-1,1)と入れて下方向に
式を複写します。F3を横にG3に複写して最後の引数を0->1に変えればよい。
さて上記の理屈がわかったとして、問題はF3:Gxの範囲において、注文数を超える下の行にはエラー表示が出るが
ISERRORなどで判別して、出ないようにしてください。
注文請け書(印刷するシート)は別シートでしょうから、F、G列をSheet2などへ持っていくとき式が見かけ上、変わります。Sheet1!$C$3:$c$100などのように参照しますので、この点注意してください。
もう1つ注文書が多数ある場合、VBAで自動化しないと、関数では自動化省力化しないので前途多難なように思います。
    • good
    • 0

#3訂正です。



質問文を読み直してみると、商品は固定のようですね?
つまり、商品名があると思われるA列をカウントしてしまうとまずいですね。
失礼しました。

私が先ほど記載しました
=OFFSET($A$1,0,0,COUNTA($A:$A),5)
という数式の
$A:$Aという部分、数量があるD列にするべきでした。
=OFFSET($A$1,0,0,COUNTA($D:$D),5)

さらに、一つのブックに何枚もシートがあり、同じ注文書を作成していて、同じように印刷したい場合は
=OFFSET(!$A$1,0,0,COUNTA(!$D:$D),5)
としてください。
    • good
    • 0

こんばんは。


注文書があるシートをSheet1 とさせていただきます。そして、ここでは、印刷シートを、Sheet2 にします。

配列数式を使った例:

別のシートに、
  A    B   C    D    E
1: 型番 品名 単価 数量 合計金額

A2:~

=IF(COUNT(Sheet1!$D$2:$D$10)>=ROW(A1),INDEX(Sheet1!$A$1:$E$10,SMALL(IF(Sheet1!$D$2:$D$10>0,ROW($D$2:$D$10),""),ROW(A1)),COLUMN(A1)),"")

という式を置いたら、配列数式ですから、一旦入力したら、F2を押して、『ShiftとCtrlを押しながらEnterキー』を押します。

後は、フィルハンドルで、式をコピーしてしまいます。

配列数式を使わない方法:
(ここの掲示板では、配列数式を使うと、文句をつける人がいるようですから(^^;)

同じく別シートを使います。

補助列を使って、
例:
G2 ~G10 まで
=IF(Sheet1!D2>0,ROW(),"")
フィルハンドルコピー

H2~H10 まで
=IF(COUNT($G$2:$G$10)>=ROW(A1),SMALL($G$2:$G$10,ROW(A1)),"")

これで、ここで、出てきた行数を、

A2~
=IF($H2<>"",INDEX(Sheet1!$A$1:$E$10,$H2,COLUMN(A1)),"")

これで、集約できます。
    • good
    • 0

エクセル2000で検証してみたので、大丈夫だと思いますが・・。



まず、挿入~名前~定義 と選択。
名前の定義を作成するウインドウが開きます。
名前は「Print_Area」です。

参照範囲には
=OFFSET($A$1,0,0,COUNTA($A:$A),5)
 と入力してOKボタン

これで、注文が2~5行目なら、A1からE5を印刷範囲として印刷し、注文が2~10行になったら、A1からE10を印刷範囲として印刷できるはずです。

注意点が2つあります。
1、「Print_Area」という名前は、この通りこのままでお使いください。もちろん「」は抜いて。
2、参照範囲に使った関数は、たとえば2~6行目に注文があった場合、A1~A6全て埋めて(空欄ではない状態)おかないと、参照が狂います。

上記関数は、A1を含めてA列に値があるセルの数の行数で、E列まで参照(この場合選択という表現の方がわかりやすいかも)します という意味です。
つたない説明ですみません。

参考URLには、私がこの関数を覚えたサイトをご紹介します。

参考URL:http://www2.odn.ne.jp/excel/
    • good
    • 0

荒業ですがC~E選択削除、G~Eを選択削除!



印刷後に戻るボタン2回。

安全策でシートのコピーを作り、同じ作業。

終了後にシートの削除!
    • good
    • 0

A1からE10まで全てをドラッグで範囲指定をします。


[データ]-[フィルタ]-[オートフィルタ]を処理します。
A1からE1までの各タイトルに[▼]が出ます。

D1のセル(つまり数量)の[▼]をクリックし、(空白以外のセル)を選ぶと数値の入った行のみが表示され、このまま印刷すると良いです。

元に戻すには、もう一度、[データ]-[フィルタ]-[オートフィルタ]を処理します。

関数ではありませんが、割と簡単にできると思います。

この回答への補足

ご回答ありがとうございました。すいません、フィルタの処理を
自動で(都度、注文者にフィルタをかけて印刷
させるのではなく)できる方法はありませんか?

補足日時:2005/07/26 18:18
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています