戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
クラスモジュールの使い方

    [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
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195785] Re[4]: クラスモジュールの使い方-

    保留中です・・・ / 記事引用/メール受信=OFF■

    □投稿者/ FlyingPan -(2023/06/19(23:57))
    □U R L/

      半平太さま

      早速にまた、ご丁寧に本当に有難うございます。

      >コードを書く場所がクラスのモジュールと思えばいいのでは?
      の意味が分かりました。確かにピボットテーブルで実現できる範囲なのであれば、
      敢えてクラスを使う必要はないことも改めて認識しました。

      恥ずかしながら、自分で何をしたいと思ってクラスを活用しようとしたのか、
      少し混乱してきてしまいました。
      一旦、頭の整理をしてから、改めてご相談させて頂きたいと思います。

      まずは、クイックにアドバイス頂いたことに、心より御礼申し上げます。
      引き続き何卒よろしくお願い致します。



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G