[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『集計するフィールドを一度に多数選択したい』(ひつじ)
こんにちは。お世話になります。
現在、データ→集計 ツールを使用してデータを集計しています。 集計するフィールドが70近くありまして、 「集計の設定」画面でひとつひとつチェックを入れていますが、 この作業にかなり時間を取られています。 複数のフィールドを選択して、一度にチェックを入れられるような ワザはありますでしょうか?
ご存知の方、教えてください!
一般機能では無いと思います。 マクロでやるなら出きるのかな・・・?
Sub Test() Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2, 3) End Sub
上記の Array(2, 3) を変数で利用できるのなら、 集計したいフィールドの先頭行にマークでもしておけば出来そうだけど・・。 σ(^_^;)には、ちと判りません・・・。_/ ̄|○ il||li
追加:こんな感じで出来れば良いんですけど、MyAryが文字だからダメです。 Sub Test() MyLastCol = Range("IV1").End(xlToLeft).Column For i = 1 To MyLastCol If Cells(1, i).Interior.ColorIndex = 3 Then MyAry = MyAry & "," & i End If Next i MyAry = Replace(MyAry, ",", "", 1, 1) Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(MyAry) End Sub
どなたか判りませんか・・・。よろしくお願いします。 (川野鮎太郎)
ArrayはVariant型の配列を返す、 そしてTotalListは1から始まる整数の配列とある、 すなわち、 Sub Test() Dim MyAry() As Integer Dim MyLastCol As Long Dim intWk As Integer Dim i As Integer MyLastCol = Range("IV1").End(xlToLeft).Column intWk = -1 For i = 1 To MyLastCol If Cells(1, i).Interior.ColorIndex = 3 Then intWk = intWk + 1 ReDim Preserve MyAry(0 To intWk) MyAry(intWk) = i End If Next i If intWk > -1 Then Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=MyAry End If End Sub ですかね…Subtotalについてはサッパリですが…。 追記: 川野鮎太郎さんの書き方を尊重すると、 Sub Test1() MyLastCol = Range("IV1").End(xlToLeft).Column For i = 1 To MyLastCol If Cells(1, i).Interior.ColorIndex = 3 Then MyAry = MyAry & "," & i End If Next i MyAry = Split(Mid(MyAry, 2), ",") Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=MyAry End Sub でも良さげ。VBって型に対してかなりアバウト。 (ご近所PG)
おはようございます。 上記2つのコードを確認しました。上手くいきました^^v いつもながらご指導ありがとうございます。 私のコードの改良版を見て、なるほど!Split 関数かと納得でした。 おしいところまでは行ってたってことですね。(^_^A; 質問する前に配列変数で、MyAry()などと試してはみたのですが、 いまひとつ配列変数をマスターしてなくて、 MyAry()が(2,3)と言う配列に入らず、 (2)と(3)と個別に入ってしまってました(^_^A; 今回のひつじさんのご質問に対して、またもや私自身が勉強させていただきました。 ありがとうございました。m(._.)m ペコッ (川野鮎太郎)
川野鮎太郎さま、ご近所PGさま、ありがとうございます。 レスが遅くなり申し訳ありません。 一般機能では無理なのですね。 マクロの達人のお2人からご意見いただけるとは…恐縮してます 汗
で、でですね。 お2人にこんなことをお聞きするのはあまりに何なのですが、 教えていただいたマクロを実行するのはどのようにしたらよいのでしょうか? VBEを開いて、標準モジュールに貼り付け…でいいのでしょうか。 そのあとはどうしたらいいでしょうか?よろしければ教えてください。 不勉強で申し訳ありません。汗汗
(ひつじ)
川野鮎太郎さん作のマクロは、例として1行目のセルの背景色が赤のものを目印として動くように作られています。 具体的には >If Cells(1, i).Interior.ColorIndex = 3 Then ここですね。3が赤って意味になります。 なので、対象となる列の1行目のセルを赤く塗りつぶした上で実行してみてください。 (ご近所PG)
すでにご近所PGさんが説明されてますので、それでお解りなら以下は無視していただいて結構です。 仮に以下のようなデータがあるとして、集計したい列の1行目B,C,Eだけでしたら、 B1,C1,E1 セルを赤で塗りつぶして、集計したい範囲(A1からE19を選択)して、 標準モジュールに貼り付けた上のマクロを実行すれば集計できると思います。
A B C D E 1 年月 数量1 数量2 数量3 数量4 2 04年5月 100 150 200 250 3 04年5月 100 150 200 250 4 04年5月 100 150 200 250 5 04年5月 100 150 200 250 6 04年6月 100 150 200 250 7 04年6月 100 150 200 250 8 04年6月 100 150 200 250 9 04年7月 100 150 200 250 10 04年7月 100 150 200 250 11 04年7月 100 150 200 250 12 04年7月 100 150 200 250 13 04年7月 100 150 200 250 14 04年8月 100 150 200 250 15 04年8月 100 150 200 250 16 04年8月 100 150 200 250 17 04年9月 100 150 200 250 18 04年9月 100 150 200 250 19 04年9月 100 150 200 250
列が違ったり、行が違ったり、赤ではなく青に変えたいなどでしたら、 コードを少し修正すれば良いと思います。 上のコードは2種類あるので、試すのはどちらか片方ずつにしてください。 マクロ実行後は元に戻せませんので、バックアップをとってから実行してください
(川野鮎太郎)
おふたかたとも、ご回答ありがとうございます。
川野さんのマクロを、教えていただいたとおり実行してみました。 おおお…素晴らしい…。 感激の出来栄えです。ありがとうございます。
図々しくももう一つ質問してもいいでしょうか? 例えば、集計する表の ・グループの基準がB列以降である場合 や、 ・集計するフィールドの表頭が2行目以降である場合 などは、コードのどこを修正すればよいか お教えいただけませんでしょうか?
何度も申し訳ありません。 (ひつじ)
>・グループの基準がB列以降である場合 Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=MyAry ~~~~~~~~~~グループがA列の場合ですから、C列なら3です。
>・集計するフィールドの表頭が2行目以降である場合 MyLastCol = Range("IV1").End(xlToLeft).Column ~~~~~1行目ですから、2行目ならIV2です。
(川野鮎太郎)
んー、集計対象範囲を選択した状態で実行するという条件の元なら Sub Test1() With Selection For i = 1 To .Columns.Count If .Cells(1, i).Interior.ColorIndex = 3 Then MyAry = MyAry & "," & i End If Next i MyAry = Split(Mid(MyAry, 2), ",") If UBound(MyAry) = -1 Then MsgBox "色つけてね" Else .Subtotal GroupBy:=1, Function:=xlSum, TotalList:=MyAry End If End With End Sub としてみるとそのままいけるかな… 追記:いけなかった。やり直し中… 追記2:やっぱりいけた…赤く塗りつぶしてなかった… 追記3:色つけてねメッセージ追加… (ご近所PG)
なるほど、Selectionでくくれば、.Columns.Countでそのままループできるんですね。_〆\(..;) メモメモ
GroupBy:=1 ←だけは、選択範囲の何番目の列かで変える必要ありですね。 (川野鮎太郎)
>GroupBy:=1 ←だけは、選択範囲の何番目の列かで変える必要ありですね。 あるいは仕様追加で黄色の列を…とか改良するのもありかもしれません。 (ご近所PG)どれ、リロードしてみるか…25遅かったorz
そうですね。それも良いかもしれません。^^ >25番遅かった・・・
またもや逃した_/ ̄|○ il||li http://skyblue123.hp.infoseek.co.jp/Excel/888889.gif
(川野鮎太郎)
川野さん、ご近所PGさん、ありがとうございます。
申し訳ないことに、今日は他の業務で手が放せません。 明日検証させていただきたいと思っています。 勝手を申しあげます。…申し訳ありません。
お付き合いいただきありがとうございました。 またよろしくお願いいたします!
(ひつじ)
おはようございます。
> 川野鮎太郎さま ていねいに教えていただきありがとうございました。 現在、B12〜EB356までの表を集計しています。 12行目は表頭、集計の基準はB列です。 なので、コードを
Sub Test1() MyLastCol = Range("IV12").End(xlToLeft).Column For i = 1 To MyLastCol If Cells(1, i).Interior.ColorIndex = 3 Then MyAry = MyAry & "," & i End If Next i MyAry = Split(Mid(MyAry, 2), ",") Selection.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=MyAry End Sub
と直して実行してみたところ、 「実行時エラー'13' 型が一致しません」 というメッセージが出てしまいました。 どこがいけなかったのでしょうか…。よろしければ教えてください。
> ご近所PGさま 教えていただいたコード完璧でした! 「色つけてね」のメッセージも見たかったので、 あえて色をつけずに実行もしてみましたw ありがとうございます!
(ひつじ)
<雑談> 今更ですが(川野鮎太郎)さんの25番前、あたいが頂きました♪ フッフッフッ ( ̄ー+ ̄) うろうろはしていましたが、もちろん連打なんかもせず ラッキーでした。 嬉しいので書いちゃいました。(ひつじ)さんおじゃましした。 (プリン)
私のコードは行列が変わったときに修正が多いので、ご近所さんのものを今後利用してください(^_^A; Sub Test1() Const MyR As Long = 12 '表題の行 MyLastCol = Range("IV" & MyR ).End(xlToLeft).Column For i = 1 To MyLastCol If Cells(MyR, i).Interior.ColorIndex = 3 Then MyAry = MyAry & "," & i - 1 End If Next i MyAry = Split(Mid(MyAry, 2), ",") Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=MyAry End Sub
<雑談> なにゅ!今回はプリンさんだったのか・・・。(ノ_・。) ちなみに25番遅かったのは、ご近所さんですよ^^ 私は1番違い_/ ̄|○ il||li (川野鮎太郎)
<雑談 too> [[20050114123522]]にも書きましたが 私は、888878と888890でした・・・ 残念!! (caro) 2005/01/14 15:50
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.