Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4390 / 13644 ツリー ←次へ | 前へ→

【56510】複数の条件でそれぞれ集計を出したいのですが・・・ なみ 08/6/19(木) 17:34 質問[未読]
【56512】Re:複数の条件でそれぞれ集計を出したいの... ハチ 08/6/19(木) 17:58 発言[未読]
【56532】Re:複数の条件でそれぞれ集計を出したいの... なみ 08/6/20(金) 9:12 お礼[未読]
【56523】Re:複数の条件でそれぞれ集計を出したいの... kanabun 08/6/19(木) 22:23 発言[未読]
【56524】Re:複数の条件でそれぞれ集計を出したいの... kanabun 08/6/19(木) 22:27 発言[未読]
【56525】Re:複数の条件でそれぞれ集計を出したいの... kanabun 08/6/19(木) 22:30 発言[未読]
【56529】Re:複数の条件でそれぞれ集計を出したいの... kanabun 08/6/19(木) 23:47 発言[未読]
【56533】Re:複数の条件でそれぞれ集計を出したいの... なみ 08/6/20(金) 9:14 お礼[未読]
【56536】Re:複数の条件でそれぞれ集計を出したいの... なみ 08/6/20(金) 9:48 質問[未読]
【56537】Re:複数の条件でそれぞれ集計を出したいの... ひげくま 08/6/20(金) 9:58 発言[未読]
【56540】Re:複数の条件でそれぞれ集計を出したいの... なみ 08/6/20(金) 10:10 お礼[未読]
【56544】Re:複数の条件でそれぞれ集計を出したいの... なみ 08/6/20(金) 11:02 質問[未読]
【56546】Re:複数の条件でそれぞれ集計を出したいの... kanabun 08/6/20(金) 11:30 発言[未読]
【56625】Re:複数の条件でそれぞれ集計を出したいの... なみ 08/6/25(水) 13:02 お礼[未読]
【56936】Re:複数の条件でそれぞれ集計を出したいの... 菜実 08/7/11(金) 14:07 質問[未読]
【56937】Re:複数の条件でそれぞれ集計を出したいの... kanabun 08/7/11(金) 19:52 発言[未読]
【56952】Re:複数の条件でそれぞれ集計を出したいの... 菜実 08/7/14(月) 13:40 お礼[未読]

【56510】複数の条件でそれぞれ集計を出したいので...
質問  なみ  - 08/6/19(木) 17:34 -

引用なし
パスワード
   こんにちは、はじめまして。
VBA初心者でどうしたらいいのかわからないので投稿します。

下のような表があります。
やりたいこととしては、業者コード別に集計をしたいのです。
ただし、区分は、AとBのみの合計で、月ごとに業者別に集計したいのです。
(うまくかけなくてすみません。)

いろいろ調べて似ているかなというマクロを参考にしてみました。
が、何をどう足せばいいのかわからないので教えていただけませんか?
よろしくお願いします。

Sub 納入業者毎に集計()
  Dim dic As Object
  Dim ws As Worksheet
  Dim i As Long, j As Long, k As Long
  Dim sKey As Variant
  Dim s, v, v1, Ans()
  
  Set dic = CreateObject("Scripting.Dictionary")
  Set ws = ThisWorkbook.Worksheets("Sheet1")
  With ws
    With .Range("F3", .Range("F65536").End(xlUp))
     s = .Value        '納入業者
     v1 = .Offset(, 4).Value '発注額
     End With
    For i = 1 To UBound(s)
      sKey = s(i, 1)
      If dic.Exists(sKey) Then
        j = dic(sKey)
        Ans(1, j) = Ans(1, j) + v1(i, 1)
      Else
        k = k + 1
        dic(sKey) = k
        ReDim Preserve Ans(2, 1 To k)
        Ans(0, k) = sKey
        Ans(1, k) = v1(i, 1)
      End If
    Next
    .Range("N3").Resize(k, 3).Value = _
     Application.Transpose(Ans)
  End With
  Set dic = Nothing
  Set ws = Nothing
  
End Sub

表は、下のとおりです。

【データ】
    A    B    C    D    E    F    G    H    I    J    K
1    発注日    担当    品名    数量    コード    業者    No.    納期    発注額    区分    検収日
2    4/8    A    りんご    100    1000    AAA    1    4/9    21,600    A    4/8
3    4/8    B    バナナ    20    1000    AAA    2    4/9    3,000    U    4/8
4    4/9    A    りんご    105    2000    BBB    3    4/10    150,800    B    4/22
5    4/10    A    りんご    10    2000    BBB    4    4/11    9,072    A    4/10
6    4/10    A    バナナ    50    1000    AAA    5    4/11    31,842    A    4/10
7    4/10    B    バナナ    60    3000    CCC    6    4/11    -1,490        4/10
8    4/16    A    りんご    71    4000    DDD    7    4/17    275,000    B    5/9
9    4/21    A    りんご    63    4000    DDD    8    4/22    17,700    A    4/21
10    4/21    B    バナナ    64    1000    AAA    9    4/22    94,962    A    4/21
11    4/30    C    バナナ    77    4000    DDD    10    5/1    312,669    A    5/7
12    4/30    C    りんご    45    1000    AAA    11    5/1    200,925    A    5/15

【希望の結果】
    M    N    O    P    Q    R    S
1    コード    4月計    5月計    6月計    7月計    8月計    9月計
2    1000    148,404    200,925                
3    2000    159872                    
4    3000    17700                    
5    4000        587669

【56512】Re:複数の条件でそれぞれ集計を出したい...
発言  ハチ  - 08/6/19(木) 17:58 -

引用なし
パスワード
   ▼なみ さん:

>やりたいこととしては、業者コード別に集計をしたいのです。
>ただし、区分は、AとBのみの合計で、月ごとに業者別に集計したいのです。
>(うまくかけなくてすみません。)

マクロではありませんが、ピボットテーブルでできそうな内容だと思います。
マクロでやるには、結構面倒な処理のように感じます。

【56523】Re:複数の条件でそれぞれ集計を出したい...
発言  kanabun  - 08/6/19(木) 22:23 -

引用なし
パスワード
   ▼なみ さん:

> 調べて似ているかなというマクロを参考にしてみました。
> Sub 納入業者毎に集計()
確かに、どこかで見たコードですね(^^

>やりたいこととしては、業者コード別に集計をしたいのです。
>ただし、区分は、AとBのみの合計で、月ごとに業者別に集計したいのです。
>
業者コード はE列、区分はJ列だとして、
「月ごと」というのはどの列のことですか?
集計 というのは どの列を集計するのですか?

以下のように列を仮定してみました。列が違っていたら、修正してください。

Sub Try1()
 Dim r As Range
 Dim Code, Price, Cat, Mon
 Dim i As Long, m As Long, n As Long, nn As Long, k As Long
 
 Set r = Range("A1").CurrentRegion
 With Application
  Set r = .Intersect(r, r.Offset(1)) '1行目をカット
  Code = .Transpose(r.Columns("E")) 'コード (文字列)
  Price = .Transpose(r.Columns("I")) '発注額 I列
  Cat = .Transpose(r.Columns("J"))  '区分
  Mon = .Transpose(r.Columns("H"))  '納期  H列
 End With
 nn = UBound(Code)
 ReDim Ans(nn, 6)
 Ans(0, 1) = "コード"        '0行目に 列見出し
 For i = 4 To 9
  Ans(0, i - 3) = i & "月計"    '4月なら 1列目
 Next
 With CreateObject("Scripting.Dictionary")
  For i = 1 To nn
    Select Case Cat(i)
     Case "A", "B"
      If .Exists(Code(i)) Then
       n = .Item(Code(i))
       Ans(n, 0) = Code(i)
      Else
       k = k + 1
       .Item(Code(i)) = k
       n = k
      End If
      m = Month(Mon(i)) - 3   '4月なら 1列目
      Ans(n, m) = Ans(n, m) + Price(i)
    End Select
  Next
 End With
 
 With Range("M1").Resize(k + 1, 7)
   .NumberFormat = "#,##0"
   .ClearContents
   .Value = Ans
 End With
End Sub

【56524】Re:複数の条件でそれぞれ集計を出したい...
発言  kanabun  - 08/6/19(木) 22:27 -

引用なし
パスワード
   早速、不具合発見。
貼り付け先の第1列の表示形式は 文字列 のほうがいいですね

> With Range("M1").Resize(k + 1, 7)
>   .NumberFormat = "#,##0"
   .Columns(1).NumberFormat = "@"
>   .ClearContents
>   .Value = Ans
> End With

【56525】Re:複数の条件でそれぞれ集計を出したい...
発言  kanabun  - 08/6/19(木) 22:30 -

引用なし
パスワード
   もうひとつ、

>  Ans(0, 1) = "コード"        '0行目に 列見出し
  ↓
  Ans(0, 0) = "コード"        '0行、0列目に

【56529】Re:複数の条件でそれぞれ集計を出したい...
発言  kanabun  - 08/6/19(木) 23:47 -

引用なし
パスワード
   なんどもすみません。また不具合を見つけました

> With CreateObject("Scripting.Dictionary")
>  For i = 1 To nn
以下の部分、次のように修正して試してください
 With CreateObject("Scripting.Dictionary")
   For i = 1 To nn
    If .Exists(Code(i)) Then
     n = .Item(Code(i))
    Else
     k = k + 1
     .Item(Code(i)) = k
     Ans(k, 0) = Code(i)
     n = k
    End If
    Select Case Cat(i)
     Case "A", "B"
      m = Month(Mon(i)) - 3   '4月なら 1列目
      Ans(n, m) = Ans(n, m) + Price(i)
    End Select
  Next
 End With

【56532】Re:複数の条件でそれぞれ集計を出したい...
お礼  なみ  - 08/6/20(金) 9:12 -

引用なし
パスワード
   ▼ハチ さん:
>▼なみ さん:
>
>>やりたいこととしては、業者コード別に集計をしたいのです。
>>ただし、区分は、AとBのみの合計で、月ごとに業者別に集計したいのです。
>>(うまくかけなくてすみません。)
>
>マクロではありませんが、ピボットテーブルでできそうな内容だと思います。
>マクロでやるには、結構面倒な処理のように感じます。

おはようございます。
ピボットテーブル使おうと思ったのですが、
いろいろ事情がありまして、マクロにしようとおもいました。
すみません。

【56533】Re:複数の条件でそれぞれ集計を出したい...
お礼  なみ  - 08/6/20(金) 9:14 -

引用なし
パスワード
   ▼kanabun さん:
ありがとうございます。助かりました。
また分からないことあったときは質問させてください。
書いていただいたものを読んで少しずつでも理解できるように努力していきます。

【56536】Re:複数の条件でそれぞれ集計を出したい...
質問  なみ  - 08/6/20(金) 9:48 -

引用なし
パスワード
   ▼kanabun さん:

すみません;;また助けてください。
この表の上に行を12行増やしたら

Code = .Transpose(r.Columns("E")) 'コード (文字列)

で止まってしまいました
行増やす場合は、どこを変更したらいいのでしょうか?

【56537】Re:複数の条件でそれぞれ集計を出したい...
発言  ひげくま  - 08/6/20(金) 9:58 -

引用なし
パスワード
   こんにちは。
横から失礼します。

せっかくkanabunさんが作ってくれたマクロを理解していますか?

マクロを理解していない状態で、シートに変更を加えたらマクロが動かなくなったから、どこを変更すれば良いのかを聞くのではなく、
理解できていないコードについて、HELPやネットで調べてみて、それでも解らなかったら聞いて、まずは作ってもらったマクロのすべてを理解しましょう。

そうじゃないと、変更を加えて思い通りに動かなくなるたびに、質問することになりますよ。

【56540】Re:複数の条件でそれぞれ集計を出したい...
お礼  なみ  - 08/6/20(金) 10:10 -

引用なし
パスワード
   ▼ひげくま さん:
>こんにちは。
>横から失礼します。
>
>せっかくkanabunさんが作ってくれたマクロを理解していますか?
>
>マクロを理解していない状態で、シートに変更を加えたらマクロが動かなくなったから、どこを変更すれば良いのかを聞くのではなく、
>理解できていないコードについて、HELPやネットで調べてみて、それでも解らなかったら聞いて、まずは作ってもらったマクロのすべてを理解しましょう。
>
>そうじゃないと、変更を加えて思い通りに動かなくなるたびに、質問することになりますよ。

すみません。
ちょっとてんぱってました。
上から一つ一つ調べてみて、
Set r = Range("A1").CurrentRegion

Set r = Range("A13").CurrentRegion
に変更したら動きました。

申し訳ありません。

【56544】Re:複数の条件でそれぞれ集計を出したい...
質問  なみ  - 08/6/20(金) 11:02 -

引用なし
パスワード
   ▼kanabun さん:
>なんどもすみません。また不具合を見つけました
>
>> With CreateObject("Scripting.Dictionary")
>>  For i = 1 To nn
>以下の部分、次のように修正して試してください
> With CreateObject("Scripting.Dictionary")
>   For i = 1 To nn
>    If .Exists(Code(i)) Then
>     n = .Item(Code(i))
>    Else
>     k = k + 1
>     .Item(Code(i)) = k
>     Ans(k, 0) = Code(i)
>     n = k
>    End If
>    Select Case Cat(i)
>     Case "A", "B"
>      m = Month(Mon(i)) - 3   '4月なら 1列目
>      Ans(n, m) = Ans(n, m) + Price(i)
>    End Select
>  Next
> End With

すみません。
Ans(n, m) = Ans(n, m) + Price(i)
ここの意味を教えていただけないでしょうか?

【56546】Re:複数の条件でそれぞれ集計を出したい...
発言  kanabun  - 08/6/20(金) 11:30 -

引用なし
パスワード
   ▼なみ さん:
>すみません。
>Ans(n, m) = Ans(n, m) + Price(i)
>ここの意味を教えていただけないでしょうか?

Ans というのは 集計表の配列で、
この2次元配列のサイズは (元データ数+1) 分の行数と (6か月+1)列
あります。0行目には 列見出しが入ります。
0列目には コードが入っていきます。

n\m [0]  [1] [2] [3] [4] [5] [6] 
[0] Code  4月 5月 6月 7月 8月 9月
[1]
[2]
[3]
[4]
:
:
[元データのレコード数]

Ans(n,m) というのは n行目、m列目の要素ということです。

たとえば、
コードが「1000」のとき すでにこのコードがAns配列の0列目に
在るかどうか? は
> If .Exists(Code(i)) Then
で判断できます。あれば、それが何行目にあるか?は
> n = .Item(Code(i))
で判断できます。
このデータの金額を、「何列目」に 加算すればよいかは 今回は単純に
m = 月数-3
で計算しています。
(つまり、下半期の集計表の時は ここの列を計算する式を修正する必要が
 あります)

【56625】Re:複数の条件でそれぞれ集計を出したい...
お礼  なみ  - 08/6/25(水) 13:02 -

引用なし
パスワード
   ▼kanabun さん:

お返事遅くなり申し訳ありません。
丁寧な説明ありがとうございました。
なんとなくで申し訳ないのですが、少し理解できたかと思います。
本当にありがとうございました。

【56936】Re:複数の条件でそれぞれ集計を出したい...
質問  菜実  - 08/7/11(金) 14:07 -

引用なし
パスワード
   こんにちは、なみです。
先日は色々ありがとうございました。
上半期のシートが出来上がり、下半期を作成している途中なのですけど
下記のヒントをいただいていましたが、どのように修正すればいいか分からず
再度書き込みさせていただいています。
「何列目」に 加算すればよいか と言うことを教えていただき、
単純に m = 月数-9 としてみましたがどうも違うようで、涙目です。
下期はどのように変更したらOKなのか、再度教えていただけないでしょうか?

【56937】Re:複数の条件でそれぞれ集計を出したい...
発言  kanabun  - 08/7/11(金) 19:52 -

引用なし
パスワード
   ▼菜実 さん:

>上半期のシートが出来上がり、下半期を作成している途中なのですけど
>下記のヒントをいただいていましたが、どのように修正すればいいか分からず

>「何列目」に 加算すればよいか と言うことを教えていただき、
>単純に m = 月数-9 としてみましたがどうも違うようで、涙目です。

先ほど、いちど付け焼刃の案をアップしましたが、不具合をみつけたので、
一度削除して、もうす少しはマシなのを再掲します。
一番最初に、上半期か 下半期かInputBoxで問い合わせがありますので、
ここで集計する最初の月を数字で入れてください(通常、4 か 10;
ただし、1〜12 の有効な月数ならどれでもかまいません。指定の月から
6か月分を集計します)
◆印が主な変更か所です

Sub Try5() '月の列番号も dic に記憶
 Dim r As Range
 Dim Code, Price, Cat, Mon
 Dim i As Long, m As Long, n As Long, numRecords As Long, k As Long
 Dim dic As Object
 Dim mCol As Long     '◆表示列番号
 Dim BeginMonth As Integer '◆上半期なら 4 下半期なら 10 とする
 
'◆最初の月数をインプット
 BeginMonth = Val(InputBox("何月から半期分の集計?", , 10))
 Select Case BeginMonth
  Case 1 To 12
  Case Else: Exit Sub
 End Select
 
 Set r = Range("A1").CurrentRegion
 With Application
  Set r = .Intersect(r, r.Offset(1)) '1行目をカット
  Code = .Transpose(r.Columns("E")) 'コード (文字列)
  Price = .Transpose(r.Columns("I")) '発注額
  Cat = .Transpose(r.Columns("J"))  '区分
  Mon = .Transpose(r.Columns("H"))  '納期
 End With
 numRecords = UBound(Code)
 ReDim Ans(numRecords, 6)
 Ans(0, 0) = "コード"        '0行目に 列見出し
 
 Set dic = CreateObject("Scripting.Dictionary")
 '列見出し 月名の代入
 For i = BeginMonth To BeginMonth + 5    '◆半期分
   m = i: If m > 12 Then m = m - 12    '◆
   mCol = i - BeginMonth + 1        '◆
   dic(MonthName(m)) = mCol        '◆ (下)10月が1列目
   Ans(0, mCol) = MonthName(m) & "計"   '◆
 Next
 
 'コード別に集計
 For i = 1 To numRecords
   If dic.Exists(Code(i)) Then '既存のコードのときは
     n = dic(Code(i))     '表の行番号をdicから得る
   Else
     k = k + 1        '新規コード なら コードと(行番号)を登録
     dic(Code(i)) = k
     Ans(k, 0) = Code(i)
     n = k
   End If
   Select Case Cat(i)  '区分が「A」または「B」のときだけ集計
    Case "A", "B"
      m = Month(Mon(i))
      If dic.Exists(MonthName(m)) Then  '◆
        mCol = dic(MonthName(m))
        Ans(n, mCol) = Ans(n, mCol) + Price(i)
      End If
   End Select
 Next
 
 With Range("M1").Resize(k + 1, 7)
   .ClearContents
   .NumberFormat = "#,##0"
   .Columns(1).NumberFormat = "@"
   .Value = Ans
 End With
End Sub

【56952】Re:複数の条件でそれぞれ集計を出したい...
お礼  菜実  - 08/7/14(月) 13:40 -

引用なし
パスワード
   ▼kanabun さん:

こんにちは。
やはり、単純に-9ではだめだったんですね。

早速、試してみたら、正常に動きました。
本当にありがとうございました。

4390 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free