クラスモジュールの使い方 | |
---|---|
[195780] クラスモジュールの使い方- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ FlyingPan -(2023/06/18(23:35)) □U R L/ VBA歴約1年半です。クラスモジュールに挑戦してみようと思うのですが、 以下のようなケースは、題材として適切ではないものでしょうか。 【ローデータ】 担当者 商品 決済手段 販売先 数量 金額 山田 りんご 現金 伊藤産業 10 500 山田 りんご 現金 加藤商事 20 1000 山田 りんご カード 伊藤産業 30 1800 山田 りんご カード 佐藤物産 40 2400 山田 りんご カード 加藤産業 50 3000 山田 みかん 現金 伊藤産業 10 350 山田 みかん 現金 工藤実業 20 700 田中 … : 【やりたい事】 以下のようなクロス集計 担当者:山田 商品 りんご みかん 計 決済手段 現金 クレカ 現金 数量 金額 数量 金額 数量 金額 数量 金額 販売先 30 1500 120 7200 30 1050 180 9750 伊藤産業 10 500 30 1800 10 350 50 2650 加藤商事 20 1000 50 3000 70 4000 工藤実業 20 700 20 700 佐藤物産 40 2400 40 2400 【補足・確認したいこと】 ・ピボットテーブルなどを使えば、敢えてクラスを使う必要はないことは理解。 (クラスモジュールを使うことが目的) ・ローデータは、架空のもので、実際のデータ構成は全く異なります。 よって、データ並び順等に違和感があったとしても、無視して下さい。 ・実際のデータは、10万件以上のレコードがあり、複数項目間の四則演算で 新たなデータを生成することも想定しています。 ・ネット情報や書籍等でクラスモジュールの例を調べると、 行単位でユニークキー(例:ID)が存在するケースが多い印象で、その意味で、 本件ローデータは、形式が必ずしも一致しておらず、そのような場合でも クラスモジュールを活用できるものなのか、確認したい次第です。 ・素人ゆえ、頓珍漢な質問をしている可能性大ですが、クラスモジュールの 基本的な考え方、ヒントだけでも、ご教示頂けますと大変助かります。 何卒よろしくお願いいたします。 PC環境:Windows10/Excel2016 |
[195781] Re[1]: クラスモジュールの使い方- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/06/19(09:48)) □U R L/ >・ピボットテーブルなどを使えば、敢えてクラスを使う必要はないことは理解。 > (クラスモジュールを使うことが目的) クラスでピボットテーブルを使えばいいと思うので、相反する概念とは思えないです。 ※コードを書く場所がクラスのモジュールと思えばいいのでは? 【Office TANAKA】 ピボットテーブルを作る h ttp://officetanaka.net/excel/vba/tips/tips156.htm ↑空白を詰める まぁ、それはFlyingPanさんの質問の趣旨から外れるんでしょうね。 >・ネット情報や書籍等でクラスモジュールの例を調べると、 > 行単位でユニークキー(例:ID)が存在するケースが多い印象で、その意味で、 > 本件ローデータは、形式が必ずしも一致しておらず、そのような場合でも > クラスモジュールを活用できるものなのか、確認したい次第です。 ユニークキーが必須とは思えないですが、仮に必須としても、自前で生成すればいいので、 IDがなくても、支障が出ることはないでしょう。 色々調査されているようですが、 クラスを活用したクロス集計をやっているサイトがあるなら、そのURLを示して頂ければ、 それをたたき台に議論できると思うのですが、ありますか? |
[195782] Re[2]: クラスモジュールの使い方- ■記事引用/メール受信=OFF■ □投稿者/ FlyingPan -(2023/06/19(16:33)) □U R L/ 半平太さま 早速にコメント有難うございます! >クラスでピボットテーブルを使えばよい、、、 その方が結果的にはシンプルにできるということなのでしょうか。 その様な発想がなかったというのが正直なところです。 (なので、ご指摘の方式を否定するものでは全くありません) 但し、実質初めてクラスを自作しようとしている中で、 ウェブ情報等を頼りに試行錯誤で進めるしか術がないところ、 現時点で調べた限り、クラスモジュールで複数要素を計算したり、 その結果を配列に格納する(ようなイメージでしょうか?)ような事例を見つけられておらず、 自分でやり切れるか自信が持てておりません。。 換言すると、クラスモジュールの使い方のイメージとして、 クラスで整理した要素は標準モジュールで吸い上げて必要な加工をするもの、 その様な事例の方が、比較的ネットでも見つけやすい印象でした。 以上のような状況ですが、どちらの方式でアプローチすべきか、 アドバイス頂くことは可能でしょうか。不躾なお願いで大変申し訳ございません。 |
[195784] Re[3]: クラスモジュールの使い方- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/06/19(22:23)) □U R L/ >>クラスでピボットテーブルを使えばよい、、、 >その方が結果的にはシンプルにできるということなのでしょうか。 >その様な発想がなかったというのが正直なところです。 >(なので、ご指摘の方式を否定するものでは全くありません) そうなんですか。 まぁ、実際に何をやりたいか分かりませんので、取り敢えずクラスからピボットを作動させてみます。 (※もし、ピボットテーブルの処理だけで終われるならクラスを作る必要すらないです。念の為) 「作業」と言う名のシートを挿入して置いて下さい(そこに結果を出します) '---標準モジュール--- Sub test() Dim firstClass As meaninglessClass Set firstClass = New meaninglessClass firstClass.TotalByPivot ActiveSheet, "山田" 'データシート(例ではアクティブシート)、担当名(省略可) End Sub '---meaninglessClassモジュール--- Sub TotalByPivot(srcSheet As Worksheet, Optional 担当者 = Empty) Dim DBadr, Vers As Integer, wsWork As Worksheet DBadr = srcSheet.Range("A1").CurrentRegion.Address(True, True, xlR1C1, True) Vers = Application.VLookup(Val(Application.Version), [{12,3;14,4;15,5;16,6}], 2) Set wsWork = Sheets("作業") wsWork.Cells.Clear '事前クリア 'ピボットテーブルを作成する ThisWorkbook.PivotCaches.Create(xlDatabase, DBadr, Vers).CreatePivotTable wsWork.Range("A3") With wsWork.PivotTables(1) With .PivotFields("担当者") .Orientation = xlPageField .Position = 1 End With .PivotFields("販売先").Orientation = xlRowField .PivotFields("商品").Orientation = xlColumnField .PivotFields("決済手段").Orientation = xlColumnField .AddDataField wsWork.PivotTables(1).PivotFields("数量"), "数量計", xlSum .AddDataField wsWork.PivotTables(1).PivotFields("金額"), "金額計", xlSum End With '担当者を絞る If Not (IsEmpty(担当者)) Then wsWork.Range("B1") = 担当者 End If wsWork.Range("A3").CurrentRegion.NumberFormat = "#,#" wsWork.Activate End Sub <作業 シート 結果図> 行 ____A____ ____B____ ___C___ ______D______ ______E______ ___F___ ___G___ ___H___ ___I___ 省略→ 1 担当者 山田 2 3 列ラベル 4 みかん みかん 数量計 みかん 金額計 りんご 5 現金 カード 現金 6 行ラベル 数量計 金額計 数量計 金額計 数量計 金額計 7 伊藤産業 10 350 10 350 30 1,800 10 500 8 加藤商事 50 3,000 20 1,000 9 工藤実業 20 700 20 700 10 佐藤物産 40 2,400 11 総計 30 1,050 30 1,050 120 7,200 30 1,500 12 <サンプルデータ> 行 ___A___ ___B___ ____C____ ____D____ __E__ __F__ 1 担当者 商品 決済手段 販売先 数量 金額 2 山田 りんご 現金 伊藤産業 10 500 3 山田 りんご 現金 加藤商事 20 1,000 4 山田 りんご カード 伊藤産業 30 1,800 5 山田 りんご カード 佐藤物産 40 2,400 6 山田 りんご カード 加藤商事 50 3,000 7 山田 みかん 現金 伊藤産業 10 350 8 山田 みかん 現金 工藤実業 20 700 9 田中 りんご 現金 伊藤産業 10 500 10 田中 りんご 現金 加藤商事 20 1,000 |
[195785] Re[4]: クラスモジュールの使い方- ■ / 記事引用/メール受信=OFF■ □投稿者/ FlyingPan -(2023/06/19(23:57)) □U R L/ 半平太さま 早速にまた、ご丁寧に本当に有難うございます。 >コードを書く場所がクラスのモジュールと思えばいいのでは? の意味が分かりました。確かにピボットテーブルで実現できる範囲なのであれば、 敢えてクラスを使う必要はないことも改めて認識しました。 恥ずかしながら、自分で何をしたいと思ってクラスを活用しようとしたのか、 少し混乱してきてしまいました。 一旦、頭の整理をしてから、改めてご相談させて頂きたいと思います。 まずは、クイックにアドバイス頂いたことに、心より御礼申し上げます。 引き続き何卒よろしくお願い致します。 |
このトピックに書きこむ |
---|