エクセルの使い方で質問です。


(シート1)
りんご 10
みかん 5
りんご 20
みかん 7

というシートがありまして、それを別のシートへ

(シート2)
りんご 30
みかん 12

という風に集計して出力する方法はありますでしょうか?

シート1の果物の種類は固定ではなく他の果物も追加されるかもしれません。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/06/07 13:29:38
  • 終了:2011/06/07 15:52:05

ベストアンサー

id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692011/06/07 15:04:28

Excelで何か処理をしようと思ったら考えられる方法は3つ


①Excelの機能を使う

これはtakntさんの回答にあるピボットテーブルを使う方法なので省略。


②数式を使う

かなりトリッキーな方法だけどやってできないことはない。

例えば質問のデータがSheet1のA1セルから入っていたとすると

Sheet2のA1セルの数式を

=INDEX(Sheet1!A:A,SMALL(IF(COUNTIF(OFFSET(Sheet1!A$1,0,0,ROW(Sheet1!$A$1:$A$99)),Sheet1!$A$1:$A$99)=1,ROW(Sheet1!$A$1:$A$99),100),ROW()))

と入れて、Shift+Ctrl+Enterを押して{}で囲み配列数式にする。

Sheet2のB1セルの数式を

=SUMIF(Sheet1!A:A,A1,Sheet1!B:B)

と入れて、A1とB1を十分に下にコピーする。

数式中の99というのは99行まで対応ということです。あんまり大きくすると配列数式なので重くなります。


③VBAを使う

使ったことがあればこれが一番簡単だったりする。

以下のコードを標準モジュールにコピペして実行。

Sub Macro()
    Dim i As Long
    Dim myDic As Object
    Dim lastRow As Long
    Dim myKey As Variant
    Dim myItem As Variant
    
    Set myDic = CreateObject("Scripting.Dictionary")
        
    With Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        
        For i = 1 To lastRow
            If myDic.exists(.Cells(i, "A").Value) Then
                myDic.Item(.Cells(i, "A").Value) = myDic.Item(.Cells(i, "A").Value) + .Cells(i, "B").Value
            Else
                myDic.Add .Cells(i, "A").Value, .Cells(i, "B").Value
            End If
        Next i
    End With

    With Worksheets("Sheet2")
        .Cells.Clear
        myKey = myDic.keys
        myItem = myDic.items
        For i = 0 To UBound(myKey)
            .Cells(i + 1, "A").Value = myKey(i)
            .Cells(i + 1, "B").Value = myItem(i)
        Next i
    End With
    
    Set myDic = Nothing
End Sub

※上記シート名はSheet1、Sheet2としています。

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13538ベストアンサー獲得回数11982011/06/07 13:33:58

http://www11.plala.or.jp/koma_Excel/pivot_menu.html

ピボットテーブルを用いてやればいいですよ。

id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692011/06/07 15:04:28ここでベストアンサー

Excelで何か処理をしようと思ったら考えられる方法は3つ


①Excelの機能を使う

これはtakntさんの回答にあるピボットテーブルを使う方法なので省略。


②数式を使う

かなりトリッキーな方法だけどやってできないことはない。

例えば質問のデータがSheet1のA1セルから入っていたとすると

Sheet2のA1セルの数式を

=INDEX(Sheet1!A:A,SMALL(IF(COUNTIF(OFFSET(Sheet1!A$1,0,0,ROW(Sheet1!$A$1:$A$99)),Sheet1!$A$1:$A$99)=1,ROW(Sheet1!$A$1:$A$99),100),ROW()))

と入れて、Shift+Ctrl+Enterを押して{}で囲み配列数式にする。

Sheet2のB1セルの数式を

=SUMIF(Sheet1!A:A,A1,Sheet1!B:B)

と入れて、A1とB1を十分に下にコピーする。

数式中の99というのは99行まで対応ということです。あんまり大きくすると配列数式なので重くなります。


③VBAを使う

使ったことがあればこれが一番簡単だったりする。

以下のコードを標準モジュールにコピペして実行。

Sub Macro()
    Dim i As Long
    Dim myDic As Object
    Dim lastRow As Long
    Dim myKey As Variant
    Dim myItem As Variant
    
    Set myDic = CreateObject("Scripting.Dictionary")
        
    With Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        
        For i = 1 To lastRow
            If myDic.exists(.Cells(i, "A").Value) Then
                myDic.Item(.Cells(i, "A").Value) = myDic.Item(.Cells(i, "A").Value) + .Cells(i, "B").Value
            Else
                myDic.Add .Cells(i, "A").Value, .Cells(i, "B").Value
            End If
        Next i
    End With

    With Worksheets("Sheet2")
        .Cells.Clear
        myKey = myDic.keys
        myItem = myDic.items
        For i = 0 To UBound(myKey)
            .Cells(i + 1, "A").Value = myKey(i)
            .Cells(i + 1, "B").Value = myItem(i)
        Next i
    End With
    
    Set myDic = Nothing
End Sub

※上記シート名はSheet1、Sheet2としています。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません