アプリ版:「スタンプのみでお礼する」機能のリリースについて

何から考えていいのか分かりません・・。
Excel200で下記のような表があります。

ID  顧客名 サービス1 サービス2 サービス3・・・・
─────────────────────────
**** AAA     0     0     0
**** BBB     0     0    11
**** CCC     1    16     0
**** DDD     0     0     3
 ・  ・      ・     ・     ・
 ・  ・      ・     ・     ・
 ・  ・      ・     ・     ・

この表からデータが0でないものをピックアップし、
次のような一覧を作成したいのです


顧客名 サービス名 件数
─────────────
BBB サービス3 11
CCC サービス1  1
CCC サービス2 16
DDD サービス3  3

こういったことは可能なのでしょうか?
過去のものも見てみたのですが、うまく合致するものを探せず、
Excelの関数のヘルプを見ても、よくわからず、困ってしまいました。

関数は多少使ったことがありますが、
マクロは使ったことがありません。
ご指導いただける方がいらっしゃいましたらどうぞ宜しくお願い致します。

A 回答 (6件)

関数でもできそうですが、マクロのほうがはるかに簡単にできます。




Sheet1が下のようになっており、

    A   B    C     D     E   ・・・
1  ID  顧客名 サービス1 サービス2 サービス3 ・・・
2 **** AAA   0     0     0
3 **** BBB   0     0    11
4 **** CCC   1    16     0
5 **** DDD   0     0     3   ・・・

これをSheet2に次のように集計してみます。(2行目から集計)

    A   B    C
1 顧客名 サービス名 件数
2 BBB サービス3 11
3 CCC サービス1  1
4 CCC サービス2 16
5 DDD サービス3  3


ツール→マクロ→Visual Basic Editor でVBE画面に移り、 表示→プロジェクトエクスプローラでプロジェクトエクスプローラを表示します。
プロジェクトエクスプローラのSheet1をダブルクリック。出てきたコードウインドウに下記マクロをコピーして貼り付けます。

シートに戻り、ツール→マクロ→マクロでこのマクロ(ichiran)を指定して実行します。

ここからコピーします

Sub ichiran()
  Dim rw As Long '調べる行
  Dim col As Integer '調べる列
  Dim outRw As Long '書き出す行

  outRw = 2
  With Worksheets("Sheet2")
    .Cells.Clear
    .Range("A1:C1") = Array("ID", "サービス名", "件数")
    For rw = 2 To Range("B65536").End(xlUp).Row
      For col = 3 To Range("IV" & rw).End(xlToLeft).Column
        If Cells(rw, col).Value > 0 Then
          .Cells(outRw, 1) = Cells(rw, 2)
          .Cells(outRw, 2) = Cells(1, col)
          .Cells(outRw, 3) = Cells(rw, col).Value
          outRw = outRw + 1
        End If
      Next
    Next
  End With
End Sub
    • good
    • 0
この回答へのお礼

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

ご指導頂いた通り、作業させていただき、マクロを実行したら「感動!!」。
欲しかった一覧表が出来あがってました。

マクロを全く自分でくんだことがないので、作っていただいたマクロを一つ一つ拝見しながら、
勉強させていただきたいと思います。

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

お礼日時:2003/01/09 16:33

#4のものです。


1つのデータ列だけ持ったデータに直し方を紹介します。
テストデータとしてA1:E6に
1AAA000
2BBB0011
3CCC1160
4DDD003
5EEE3100
6FFF0230
を用意してください。
G1:I18までの範囲に展開します。
下記関数式で3が出てくるのは
このテスト例ではデータ列をC、D、E列の3で作っているからです。MODは割ったあまり、INTは商、ROW
は自分の行数字です。INDEXは行、列数字を指定してそのセルの値を取ってくる関数です。詳しくは調べてください。$は絶対番地です、落とさないように。
(1)G1に入れる式--->
=INDEX($A$1:$E$6,INT((ROW()-1)/3)+1,1)
(2)H1に入れる式--->
=INDEX($A$1:$E$6,INT((ROW()-1)/3)+1,2)
(3)I1に入れる式--->
INDEX($A$1:$E$6,INT((ROW()-1)/3)+1,MOD(ROW()-1,3)+3)
(4)G2:G18までG1を複写してください。
H2:H18までH1を複写してください。
I2:I18までI1を複写してください。
「18」は6行Xデータ列3=18からきます。
結果は
1AAA0
1AAA0
1AAA0
2BBB0
2BBB0
2BBB11
3CCC1
3CCC16
3CCC0
4DDD0
4DDD0
4DDD3
以下略。のようになります。
これでC列0をフィルタでかけて省きましょう。
●本件は#4で関数式で出来ないと言ったことと矛盾しませんのでよろしく。
(1)規則性があった(利用した)こと。データセルは各行3列あるのでこれを幸い使ったもの。
(2)手操作のフィルタ操作(データ-フィルタ-オートフィルタまたはフィルタオプション)を使っていること。
がある問題なので解決したわけです。
    • good
    • 0

●VBA(マクロ)でないと無理でしょう。


あるいは手操作で一歩一歩やるとか。それにしてもノンゼロの列数分を行数分に増やすのはどうするか難しそう。いっそのこと0も含めて、セル分だけ行を増やし、0分を
フィルタにかけるとかどうでしょう。
●もとの表(元表)に比べ目的の表(目的表)は例えばCCCだけ見ると行数が増えています。
こういう風に場合に応じた数だけの行挿入をしなくてはならない問題は、関数では難しいと思います。
また3列がすべて0のとき、自分自身の行を削除するのも関数で出来ません(不可能といいたいが、工夫した回答が出るかもしれないので控えめに。)
●関数はまたセルのデータを見て判断する(そして演算に使う)は自由に出来ますが、あるセル(例えばA1セル)に関数式を書いて、他のセル(例えばA1とは別のC1セル)にデータをセットできません。データをセットしたいセルに式を書かないといけません。ピックアップ後の「目的表」の例えば第3行目にデータを入れるとします。関数式をいれないと、「元表」からデータを持ってこれませんので式をいれようしますが、その時「元表」の何行目・何列目をもってくるのかが関数式で書けない(正確には複写できるようにかけない)のです。
人間が、目的表に
(A列)(B列)(C列)
=B4 =E1 =E4
=B5 =C1 =C5
=B5 =D1 =D5
=B6 =E1 =E6
・・・
と人間が目で見て勘定して案配していれていけば完成しますがそれは目指すものではない。
この列文字部分と行数字部分を目的表のデータ部の第1行目(各列で別になってもでも良いが)に作ることができれば、第2行以下は複写すれば良いのですが、そういう式を作ることが出来ません。
●VBAでやるとすると、
ID+顧客名+1つのセルデータの形に、データ部の全セルについて行い、セル部データが、0のものを捨てれば良いから処理は簡単です。下記のように骨子は15行ぐらいです。Sheet2に出来あがります。
Sub test01()
d = Range("a1").CurrentRegion.Rows.Count
r = Range("a1").CurrentRegion.Columns.Count
k = 1
For i = 1 To d
For j = 3 To r
If Cells(i, j) <> 0 Then
Worksheets("sheet2").Cells(k, 1) = Cells(i, 1)
Worksheets("sheet2").Cells(k, 2) = Cells(i, 2)
Worksheets("sheet2").Cells(k, 3) = Cells(i, j)
k = k + 1
End If
Next j
Next i
End Sub
    • good
    • 0

関数、ではなく「オートフィルタ」を使うのはいかがでしょうか?


エクセル上の「データ」→「フィルタ」→「オートフィルタ」があります。
1行目の欄にカーソルがあるのを確認し、これをクリックすると、
各列毎の右側に黒三角▼が表示されます。
それをクリックして抽出するのはどうでしょうか?

例えば サービス1の所で「オプション」を選び「0と等しくない」という条件を
    入れると、サービス1に「0」以外の数字が入っているものだけが抽出されます。

それで閲覧だけならできますよ。
そこから、更に別の表を作成する場合は別のシートにコピーする必要がありますが。

この回答への補足

ありがとうございます。

ご指導頂いた通り、確かに「オートフィルタ」を利用すると、
各サービスの欲しい結果だけ表示させることができるのですが、

>それで閲覧だけならできますよ。
>そこから、更に別の表を作成する場合は別のシートにコピーする必要がありますが。

まさにそこで悩んでいるんです。(T_T)
サービス1、サービス2・・・と仮定した項目が16個もあり、
しかも毎月発生する作業なので、できるだけ短時間で作業できるようにしたいと思っている次第です。

補足日時:2003/01/09 13:39
    • good
    • 0

ごめんなさい。


結果の内容を勘違いしていました。
    • good
    • 0

マクロを使わないとして、こんな手法ではいかがでしょうか。


1)データ範囲を選択します。(例=B2:E100)
2)0を"完全に同一なセル"を指定して空白に一括置換します。
3)データ範囲を選択し、[編集]-[ジャンプ]-[セル選択] から、空白セルを指定します。
4)[編集]-[削除] から、右方向にシフトを指定して実行します。
    • good
    • 0

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

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