Excel VBA質問箱 IV

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

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


1846 / 13645 ツリー ←次へ | 前へ→

【71528】月毎で項目別に合計したい ドカ 12/3/15(木) 13:08 質問[未読]
【71529】Re:月毎で項目別に合計したい UO3 12/3/15(木) 14:06 発言[未読]
【71536】Re:月毎で項目別に合計したい ドカ 12/3/15(木) 17:19 質問[未読]
【71538】Re:月毎で項目別に合計したい UO3 12/3/15(木) 19:37 発言[未読]
【71539】Re:月毎で項目別に合計したい UO3 12/3/15(木) 19:58 発言[未読]
【71540】Re:月毎で項目別に合計したい ドカ 12/3/15(木) 20:06 お礼[未読]
【71547】Re:月毎で項目別に合計したい UO3 12/3/16(金) 10:08 発言[未読]
【71551】Re:月毎で項目別に合計したい ドカ 12/3/16(金) 13:50 お礼[未読]
【71534】Re:月毎で項目別に合計したい UO3 12/3/15(木) 14:21 発言[未読]
【71535】Re:月毎で項目別に合計したい UO3 12/3/15(木) 14:26 発言[未読]

【71528】月毎で項目別に合計したい
質問  ドカ  - 12/3/15(木) 13:08 -

引用なし
パスワード
   このようなデータがあります。

   A    B    C
1  1月   本    10
2  2月   ペン   20
3  4月  ノート  5
4  2月  本    30
5  1月   本   50


それを、月ごとの項目毎の合計としたいのですが、
お分かりの方、マクロで教えてください。

    1月  2月  3月  4月
本   60   30   0  0  
ノート 0    0   0  5
ペン  0   20   0  0 

【71529】Re:月毎で項目別に合計したい
発言  UO3  - 12/3/15(木) 14:06 -

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

こんにちは。
以下のコードが、はたしてドガさんんが望んでおられるようなコードかどうか
はなはだ自信はありませんが・・・
ところで、アップされたサンプルデータ、一方が、全角で4月、他方が半角で4月。
このままでは、これはマッチしませんよ。

Sub Sample()
  Dim dKey As String
  Dim c As Range
  Dim dic As Object
  Dim v As Variant
  Dim i As Long
  Dim j As Long
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("Sheet1")  '元シート
    For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
      dKey = c.Value & vbTab & c.Offset(, 1).Value
      dic(dKey) = dic(dKey) + c.Offset(, 2).Value
    Next
  End With
  
  With Sheets("Sheet2")  '転記シート
    v = .Range("A1").CurrentRegion.Value
    For i = 2 To UBound(v, 1)
      For j = 2 To UBound(v, 2)
        dKey = v(1, j) & vbTab & v(i, 1)
        v(i, j) = dic(dKey)
      Next
    Next
    .Range("A1").CurrentRegion.Value = v
    .Select
  End With
  
  Set dic = Nothing
  MsgBox "転記が終了しました"
  
End Sub

【71534】Re:月毎で項目別に合計したい
発言  UO3  - 12/3/15(木) 14:21 -

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

もし、ドガさんがシート関数のMATCHをよくご存知なら、効率は非常に悪くなりますが
以下のコードのほうが、ドガさんにとっては、いいのかもしれません。

Sub Sample2()
  Dim i As Long
  Dim x As Variant
  Dim y As Variant
  
  With Sheets("Sheet2")    '転記シート
    .Range("A1").CurrentRegion.Offset(1, 1).ClearContents  'ちょっと乱暴ですが
    i = 1
    Do While Sheets("Sheet1").Range("A" & i).Value <> ""
      x = Application.Match(Sheets("Sheet1").Range("A" & i).Value, .Rows(1), 0)
      If IsNumeric(x) Then
        y = Application.Match(Sheets("Sheet1").Range("B" & i).Value, .Columns(1), 0)
        If IsNumeric(y) Then
          .Cells(y, x).Value = .Cells(x, y).Value + Sheets("Sheet1").Range("C" & i).Value
        End If
      End If
      i = i + 1
    Loop
  End With
  
  MsgBox "転記が終了しました"
  
End Sub

【71535】Re:月毎で項目別に合計したい
発言  UO3  - 12/3/15(木) 14:26 -

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

Sample2を、さらに平易にしますと以下のようになります。

Sub Sample3()
  Dim i As Long
  Dim x As Variant
  Dim y As Variant
  
  Sheets("Sheet2").Range("A1").CurrentRegion.Offset(1, 1).ClearContents  'ちょっと乱暴ですが
  i = 1
  Do While Sheets("Sheet1").Range("A" & i).Value <> ""
    x = Application.Match(Sheets("Sheet1").Range("A" & i).Value, Sheets("Sheet2").Rows(1), 0)
    If IsNumeric(x) Then
      y = Application.Match(Sheets("Sheet1").Range("B" & i).Value, Sheets("Sheet2").Columns(1), 0)
      If IsNumeric(y) Then
        Sheets("Sheet2").Cells(y, x).Value = Sheets("Sheet2").Cells(x, y).Value + Sheets("Sheet1").Range("C" & i).Value
      End If
    End If
    i = i + 1
  Loop
  
  MsgBox "転記が終了しました"
  
End Sub

【71536】Re:月毎で項目別に合計したい
質問  ドカ  - 12/3/15(木) 17:19 -

引用なし
パスワード
   ▼UO3 さん いつもありがとうございます。


下記のところでエラーが出て止まってしまいます。
半日考えましたが、ギブアップです。

>  
>  With Sheets("Sheet2")  '転記シート
>    v = .Range("A1").CurrentRegion.Value
>    For i = 2 To UBound(v, 1)      ←ここでエラー
>      For j = 2 To UBound(v, 2)
>        dKey = v(1, j) & vbTab & v(i, 1)
>        v(i, j) = dic(dKey)
>      Next
>    Next

【71538】Re:月毎で項目別に合計したい
発言  UO3  - 12/3/15(木) 19:37 -

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

こんばんは

Sheet2 ですが、想定は、B2から右にに、1月、2月 といった行ラベルがある。
A2から縦に、本 や ノート といった列ラベルがある。
実際のシートはどうでしょうか?

実際のシートもそうなっているとすると、ちっと悩みますが・・・

【71539】Re:月毎で項目別に合計したい
発言  UO3  - 12/3/15(木) 19:58 -

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

あっ、もしかしたら、私の勘違いですね。転記シートには、最初なにもなく、
元シートを集計した結果を書き出すんですね。

では、そのようにしたコードをアップします。
明日になりますが、しばし、お待ちください。

【71540】Re:月毎で項目別に合計したい
お礼  ドカ  - 12/3/15(木) 20:06 -

引用なし
パスワード
   ▼UO3 さん 回答ありがとうございます。
たった今、家に帰ってから、レスを見まして、sheet2に見出し等を書いたら、ちゃんと動きました。

要はピボットテーブルのマクロを作って下さいというお願いだったわけですが、こんなにシンプルなコードで出来てすごいです。

【71547】Re:月毎で項目別に合計したい
発言  UO3  - 12/3/16(金) 10:08 -

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

こんにちは

Sheet2に、列ラベル、行ラベルを記述した形で動作確認OKとのこと、よかったです。
お分かりの通り、このコードは、Sheet1の項目のなかから分析したい項目のみを
Sheet2に書いて、それを集計するというものです。

一方、Sheet1にあるもの全てを集計したいというニーズもあるかもしれません。
様々な方法がありますが、一番手っ取り早いのは、アップしたコードの最初に
Sheet1の項目からSheet2の列ラベル、行ラベルを作り出す部分を追加しておくということでしょうね。

以下をマクロ記録すると、ほとんど、そのまま使えるコードが生成されます。
前トピで申し上げたように、お化粧直し、少なくともSelect/Selection のあたりのお化粧直しを
されたほうがいいと思いますけど、最悪(?)、★注で申し上げるところのみを変更すれば
ちゃんとしたマクロコードとして使うことはできます。

1.Sheet1を選択
2.1行目に行挿入
3.挿入された1行目のA1に、"A"、B1に"B" (文字列は何でもOKです)
4.Sheet2を選択
5.Sheet2のセルを全て選びDeleteキーでクリア
6.Sheet2のA1を選択
7.データーメニューのフィルター->フィルターオプションの設定
 (もし、2007以降ならデータタブのフィルターの詳細設定)
8.リスト範囲(L)に、Sheet1のA列を選択していれる
9.指定範囲(O)にチェックして、抽出範囲(T)に、Sheet2のA1を指定
10.重複するレコードは無視(R)にチェックしてOK。
11.フィルーターオプションを選ぶ(7.と同じ操作)
12.リスト範囲(L)に、Sheet1のB列を選択していれる
13.指定範囲(O)にチェックして、抽出範囲(T)に、Sheet2のB1を指定
14.重複するレコードは無視(R)にチェックしてOK。
15.Sheet2のA列を選択して昇順並び替え
16.Sheet2のB列を選択して昇順並び替え
17.Sheet2のB列の2行目(B2)からB列のデータの最後(B●)まで選択してCtrl/C  ★注
18.Sheet2のA1を選択して、形式を選択して貼付け、行列を入れ替えるにチェックして実行。
19、Sheet2のA1を選択して、セルの挿入、右方向にシフト

これで、Sheet2に列ラベル、行ラベルができあがります。
上記★注 と記述した17.のみ、B●のセルが固定値になっていますので、これを実際の
最終行番号に直す必要があります。B列の最終行番号の値は
Sheets("Sheet2").Range("B1").end(xldown).Row で求めることができますので、
その値を使ってください。

【71551】Re:月毎で項目別に合計したい
お礼  ドカ  - 12/3/16(金) 13:50 -

引用なし
パスワード
   ▼UO3 さん 何度もありがとうございました。

マクロの記録を、ごみが混ざらないように慎重に慎重にやって、もう一方のコードと合わせて実行! go!

あれ?表の見出しは出来たけど、クロス集計の答えがない??

あっ、表の縦項目と横項目が逆だ。
ということでA列に対する操作とB列に対する操作を逆にすることで、みごと成功しました。

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