[[20031008100728]] 『日付ごとの売上集計』(masabou5) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『日付ごとの売上集計』(masabou5)

シート1                  シート2

   日 付   売上金額            日 付   品名   売上金額
  03/9/1               03/9/1       a         100
  03/9/3                            03/9/1       b          50
  03/9/5                            03/9/3       c         250
  03/9/10                           03/9/5       a         150
                                    03/9/5       d         100
                                    03/9/10      d         200

上の表のように、シート2には日付毎、品名毎の売上金額の明細があります。

そこで、売上のあった日付だけをを取り出して、その日の売上金額をシート1に合計で出したいのですが、いい方法がありましたら教えて下さい。


 VBAになりまっけどよろしおまっか?
 Sheet1,2のA1から右へそれぞれ項目を書き込んでおくんなはれ。
 標準モジュールに下のコードをコピぺして、シート2にデータを書き込んで下さい。
 なおシート1は「日付」「売上金額」だけにしとって下さい。

 準備がでけたらマクロを実行してみておくんなはれ。
 これ、関数じゃ骨折れますさかいな、試してみて良かったらどうぞ。
    (おいぼれ 弥太郎)
 '------------------
 Option Explicit
 '--------------------
 Sub Uriage()
    Dim ws1 As Object, ws2 As Object
    Dim RowNo As Long, i As Long, totl As Long, n As Long
    Dim hiduke As String
    Dim get_totl As Long

    Application.ScreenUpdating = False
    Set ws1 = Worksheets("sheet1")
    Set ws2 = Worksheets("sheet2")
    ws1.Range("a2:b3000").ClearContents

    RowNo = ws2.Range("a1").End(xlDown).Row
    n = 1
    For i = 2 To RowNo
        n = i + 1
        hiduke = ws2.Cells(i, 1)
        totl = totl + ws2.Cells(i, 3)

        Do While hiduke = ws2.Cells(n, 1)
            totl = totl + ws2.Cells(n, 3)
            n = n + 1
        Loop

        ws1.Cells(get_row, 2) = totl
        ws1.Cells(get_row, 1) = hiduke
        get_totl = get_totl + totl
        totl = 0
        i = n - 1
    Next
    ws1.Cells(get_row, 2) = get_totl
    ws1.Cells(get_row, 1) = "合計"
    Application.ScreenUpdating = True

 End Sub
 '------------------- 
 Function get_row() As Integer
    Dim i As Integer
    i = 1
    Do While Worksheets("sheet1").Cells(i, 1) <> ""
        i = i + 1
    Loop
    get_row = i
 End Function


 あ、衝突。。ピボットテーブルをSheet1に作成・・・じゃだめなのでしょうか?(kuro)

 kuroさん、こんちわ。
 そのビボットテーブルとやらも、披露して差し上げたらどないでんねん?
 私も、後学のため知りとうおますわ、えぇ。尤も理解でけしまへんのやろけど...。
   (おいぼれ 弥太郎)

 弥太郎さん ども♪です。
 ピボットテーブルとは、、、なんていえばいいのやら(汗; 
 自動集計してくれる機能とでも言えばいいのかしら。でわ、作成手順をば。

 Sheet2のデータ上(どのセルでもいい)をアクティブセルにする>
 メニュー>データ>ピボットテーブルとピボットテーブルグラフレポート>
 「次へ」をクリック>「次へ」をクリック>既存のワークシート>
 Sheet1の表を挿入したい場所(左上端セル)をクリック>「完了」をクリック

 現れたピボットテーブルのツールバーにある項目名のうち、
 「日付」を「ここに行のフィールドをドラッグします」とあるスペースにドラッグ&ドロップ、
 「売上金額」を「ここにデータアイテムをドラッグします」とあるスペースにドラッグ&ドロップします。

 上部に余計と思われる項目名表示が出てしまいますが、これは削除できませんので見せたくなければ
 行ごと「表示しない」指定にすることで対応できます。(kuro)

 ひょへ〜っ!! kuroさん、ピポットテーブルとか言うん初めて試してみたんやけど
 大した働きしまんねんなぁ。いやいや、感心する事しきりですわ、えぇ。

 ところで、Sheet2にデータを追加していった場合は関数みたいに即座に反応してくれ
 しまへんやろ?
 再度集計したい時には現在のテーブルを一旦削除せなあきまへんのん?
 それやったら、テーブルの消し方を教えて〜な。アシスタントの無能冴子嬢が度々
 現れて、いちゃもんつけてきよりまんねん。わし、あの娘キライ!
     ピポットテーブル師匠殿 (おいぼれ弥太郎)

 データの追加については、あらかじめ下方の空欄まで範囲指定してテーブルを作っておけば、
 ピボットテーブル上で右クリックメニューにある「データの更新」で追加更新できます。
 この場合「空欄」も表示されてしまうので「日付」項目右側の▼で現れる一覧の「空欄」
 (およびその他いらない日付)のチェックをはずせば表示されなくなります。
 もし日付順序が変ってしまったなら、日付欄のどこかをアクティブセルにして昇順ソートをかければ直ります。

 テーブルの消し方ですが、、テーブル全部のセルを選択して「削除」するしかないのかな・・?(汗;(kuro)

 弥太郎さんの有り難いVBAにイチャモンを付ける(笑)無理矢理関数式です。

 <Sheet1>
 日付 の前に1列挿入して
 	A	   B	  C	   D
 2行目		03/9/1	
 3行目		03/9/3	
 4行目		03/9/5	
 5行目		03/9/10	

 A2 =IF(MAX(Sheet2!A$2:A$1000)<MAX(A$1:A1)+1,"",MAX(A$1:A1)+1)
 B2 =IF($A2="","",VLOOKUP($A2,Sheet2!$A$2:$E$1000,5,0))
 C2 =IF($A2="","",SUMIF(Sheet2!$B$2:$D$1000,B2,Sheet2!$D$2:$D$1000))

  で 下にコピー

 <Sheet2>
 日付 の前に1列挿入して
 	A	   B	  C	   D	E
 2行目		03/9/1	  a	  100
 3行目		03/9/1	  b	  50
 4行目		03/9/3	  c	  250
 5行目		03/9/5	  a	  150
 6行目		03/9/5	  d	  100
 7行目		03/9/10	  d	  200

 A2 =IF(OR(E2>=TODAY()+1,E2=""),"",MAX(A$1:A1)+1)
 E2 =IF(OR(B2="",D2="",B2=B3),"",IF(OR(B2<=B3,B3=""),B2,""))

 で 下にコピー です。

 しかりとは試していませんので駄目でしたら済みません。

 ピボットテーブルが簡単で機能を使いこなしていますね。
 実はオートフィルタ、ピボットテーブル の使い方を私は今一理解して無いのです。
 どうも未だ、あの ▼ に馴染めないのですね。今度質問して詳しい方に教えて頂きます。    (jun53)

 ウエッ?! kuroさん、削除でけまへんのんかいなあっ!
 えらいこっちゃ、このファイルにゃマクロがたっぷり詰まっとるし、シートにも大事な
 データでビッシリ埋まってまんのに...。kuroさんの甘い言葉に乗ってもてニッチもサ
 ッチもいかんようになってもたがな...。どないしょう(大汗;;
 っちゅうのはウソ。
 こんな事も有ろうと思うて、新しことする時はいつも新しBookで試していますさかい
 ご心配なく。(^^)
 ご教授、おおきに。

 junさん、こんちわ
 >今度質問して詳しい方に教えて頂きます
 ひょっとして、これ、この私の事?
 かなわんなぁ、早い事手ぇまわしてからに...。
   I like ityamon table(おいぼれ 弥太郎)

 <Sheet2>の式 若干修正しました。 シンプル 伊豆 ベスト
 A2 =IF(E2="","",MAX(A$1:A1)+1)
 E2 =IF(OR(B2="",D2="",B2=B3),"",IF(OR(B2<B3,B3=""),B2,"")) 
 yatarou inoti no  (jun53)   

 なかなか面白いことなっているようなので、ぼくも入れて下さい。


masabou5です。大勢の皆さんから回答をいただき、ありがとうございました。

ただ、VBAもピボットテーブルを理解していませんので、jun53さんの関数で作ってみます。何せ式を見てもすぐ理解できませんので、これをもとに自分なりに理解しようと思います。

大勢の皆さん、ありがとうございました。完成しましたら改めてご連絡いたします。(masabou5)


 masabou5さんは旨く完成すると良いですね。

 ピボットテーブルの多様な便利機能は漠然と乍ら知ってましたが、新たに これはどうなんだろう という疑問も出てきました。
 もう少し使いこなして整理して、改めて質問する時があるかもしれませんが、
 その時は宜しくお願い致します。    (jun53)

jun53さん、いろいろやってみたのですが、jun53さんの式の意味が理解できませんでした。

申し訳ありませんが、細かいことは別にして、式の解説をお願いできませんでしょうか?

ほんとに理解できないのです。(masabou5)


 この式を作っては見たけど本当にうまい事計算してるのか心配なのです。皆さんどうなんでしょう?

 <Sheet2>から説明した方がいいですね 修正した方です。
 E2 =IF(OR(B2="",D2="",B2=B3),"",IF(OR(B2<B3,B3=""),B2,""))
 1つ目のIFは
  (B2=""→日付が "") 又は(D2=""→金額が "") 又は(B2=B3 →日付B2とB3が同じ)なら ""
 本来なら B2=B3 だけで目的は達せられますが表の見栄え上 B2="",D2="" も加えました。
 2つ目のIFは1番ポイントのところで
 (B2<B3→日付が一行下より小さければ) 又は(B3=""→ 一行下の日付が ""なら) B2→その行の日付を
 (B3="",B2)は最終入力が終わった時点で次の日付が "" ならその日の日付の意味です。

 A2 =IF(E2="","",MAX(A$1:A1)+1)
 (E2="",""→2行目の日付が "" なら "")
 (MAX(A$1:A1)+1) → ここもポイントで、その行の日付が入っていたら1行目から数えて1番大きい数字に1つ足しなさいという意味。
 A$1 は1行目から数えて、の意味ですから1行目に数字が入ってはいけません。
 2行目から始めるのは1行目が「ゼロ」で無ければいけないからです。
 3行目から始めたい時は A$2:A2 となります。

 <Sheet1>の式
 A2 =IF(MAX(Sheet2!A$2:A$1000)<MAX(A$1:A1)+1,"",MAX(A$1:A1)+1)
 MAX(Sheet2!A$2:A$1000)<MAX(A$1:A1)+1 → Sheet2 A列の最大数字を見付けてここの最大数字と比較します。
 Sheet2 A列の最大数字より大きい数字は表示されないはずです。

 B2 =IF($A2="","",VLOOKUP($A2,Sheet2!$A$2:$E$1000,5,0))
 A列で抽出した数字を検索値にして Sheet2 から条件にあった値を求めています(日付になります)

 C2 =IF($A2="","",SUMIF(Sheet2!$B$2:$D$1000,B2,Sheet2!$D$2:$D$1000))
 B列で抽出した日付を条件にして(B2) Sheet2 の範囲から条件にあった日付全部の金額の合計を求めます。

 比較的容易な表の作成方法は
 とりあえず私の提示した通りの「行」「列」に 「式」「日付」「記号」「金額」等を埋め込んで下さい。行も10行程度でいいでしょう。
 それが済んで無事に日付、金額等が表示されるのを確認してから、
 表の形成(列挿入や行の式を必要範囲までコピー等)をした方が良いかもしれません。
 ただし、列挿入は式修正が伴う事もありますが理解して頂ければ出来ると思います。
 範囲外の(A列の左に列挿入は)式が勝手に(自動で)修正されてるはずです。

 説明、長いだけでへたでごめんなさい。一度ここをコピーしてからゆっくり確認して下さい。  (jun53)

jun53様、いろいろとご丁寧な説明していただき、ありがとうございました。

まだ、解析が出来ていませんので、もう少し時間を下さい。とりあえず御礼まで。(masabou5)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.