
何から考えていいのか分かりません・・。
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の関数のヘルプを見ても、よくわからず、困ってしまいました。
関数は多少使ったことがありますが、
マクロは使ったことがありません。
ご指導いただける方がいらっしゃいましたらどうぞ宜しくお願い致します。
No.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
ありがとうございました!!!
感動しました。
ご指導頂いた通り、作業させていただき、マクロを実行したら「感動!!」。
欲しかった一覧表が出来あがってました。
マクロを全く自分でくんだことがないので、作っていただいたマクロを一つ一つ拝見しながら、
勉強させていただきたいと思います。
本当にありがとうございました。
No.5
- 回答日時:
#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)手操作のフィルタ操作(データ-フィルタ-オートフィルタまたはフィルタオプション)を使っていること。
がある問題なので解決したわけです。
No.4
- 回答日時:
●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
No.3
- 回答日時:
関数、ではなく「オートフィルタ」を使うのはいかがでしょうか?
エクセル上の「データ」→「フィルタ」→「オートフィルタ」があります。
1行目の欄にカーソルがあるのを確認し、これをクリックすると、
各列毎の右側に黒三角▼が表示されます。
それをクリックして抽出するのはどうでしょうか?
例えば サービス1の所で「オプション」を選び「0と等しくない」という条件を
入れると、サービス1に「0」以外の数字が入っているものだけが抽出されます。
それで閲覧だけならできますよ。
そこから、更に別の表を作成する場合は別のシートにコピーする必要がありますが。
この回答への補足
ありがとうございます。
ご指導頂いた通り、確かに「オートフィルタ」を利用すると、
各サービスの欲しい結果だけ表示させることができるのですが、
>それで閲覧だけならできますよ。
>そこから、更に別の表を作成する場合は別のシートにコピーする必要がありますが。
まさにそこで悩んでいるんです。(T_T)
サービス1、サービス2・・・と仮定した項目が16個もあり、
しかも毎月発生する作業なので、できるだけ短時間で作業できるようにしたいと思っている次第です。
No.1
- 回答日時:
マクロを使わないとして、こんな手法ではいかがでしょうか。
1)データ範囲を選択します。(例=B2:E100)
2)0を"完全に同一なセル"を指定して空白に一括置換します。
3)データ範囲を選択し、[編集]-[ジャンプ]-[セル選択] から、空白セルを指定します。
4)[編集]-[削除] から、右方向にシフトを指定して実行します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- その他(開発・運用・管理) マイクロソフトから通知メールが着ました。 これ本物ですか?? 3 2022/07/01 19:43
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- スーパー・コンビニ コンビニエンスストアって便利なの? 9 2022/04/29 18:28
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのクエリで、replace関数...
-
Microsoft 365 Basic サブスク...
-
ACCESS VBA でのエラー解決の根...
-
access2021 VBA メソッドまたは...
-
Accessのスプレッドシートエク...
-
access2021 強制終了してしまう
-
Access VBA [リモートサーバー...
-
列が255以上のCSVファイルをAcc...
-
Accessのレポートについて
-
アクセス レポートを開いたとき...
-
Accessでレポートを印刷する時...
-
Access Error3061 パラメータが...
-
Microsoft365にAccessってあり...
-
アクセス 意図せずサブプロシー...
-
Accessのクエリの結果を、既存...
-
実行時エラー3131 FROM 句の構...
-
Access VBA を利用して、フォル...
-
Accessのリンクテーブルのパス...
-
VBA。リストボックスの値を別の...
-
MS.Access でサブフォーム付の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Microsoft 365 Basic サブスク...
-
Accessのクエリで、replace関数...
-
access2021 強制終了してしまう
-
ACCESS VBA でのエラー解決の根...
-
Access VBA [リモートサーバー...
-
Accessのスプレッドシートエク...
-
Accessのレポートについて
-
access2021 VBA メソッドまたは...
-
Access Error3061 パラメータが...
-
access2019 チェックボックスと...
-
Accessのクエリの結果を、既存...
-
accessでlaccdbファイルが削除...
-
Access VBA を利用して、フォル...
-
accessデータを指定したExcel、...
-
Accessのリンクテーブルのパス...
-
列が255以上のCSVファイルをAcc...
-
Accessのクエリの印刷設定
-
Accessでレポートを印刷する時...
-
Accessフォームの配色テーマを...
-
Accessデータベースに含まれる...
おすすめ情報