[[20190322123409]] 『連想配列でCOUNTIFSみたいな集計を高速でしたいで』(アト) ページの最後に飛ぶ

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

 

『連想配列でCOUNTIFSみたいな集計を高速でしたいです。』(アト)

シートが二つ、データと集計結果があります。
データシートにはA列に会社名、B列に商品名、C列〜AH列まではカレンダーで日にちが入っていてその下に評価が入っています。

A列の各社ごとにB列の商品を何種類かもっており、数はまちまちです。
A列の会社数は1500くらいあります。
C列の評価はA〜Gまでです。
A列  B列  C列  D列 〜  AH列

        1日  2日  3日  4日  〜  31日
A社  商品1 A   B  A   D      G
    商品5 F   D  G   C      F
    商品2 B   C  F   A      A
    商品7 A   C  A   D      F

B社  商品3 A   B  A   D      G
    商品6 F   D  G   C      F
    商品2 B   C  F   A      A
    商品1 A   C  A   D      F

C社  商品4 A   B  A   D      G
    商品8 F   D  G   C      F
    商品9 B   C  F   A      A
    商品7 A   C  A   D      F

上記のような表から集計シートに会社名毎にC列の評価の数を下記にように集計したいのです。

A列   B列   C列  D列

     評価   1日  2日  3日  4日  〜  31日
A社   A〜F  10   8   5   9      6
     AとB  6    5   3   7      4
     A    4    4   2   5      3 

     評価   1日  2日  3日  4日  〜  31日
B社   A〜F  12   7   5   9      6
     AとB  6    6   3   7      4
     A    4    2   2   5      3
 
     評価   1日  2日  3日  4日  〜  31日
C社   A〜F  10   5   5   9      6
     AとB  6    4   3   7      4
     A    4    1   2   5      3 

宜しくお願い致します。

< 使用 Excel:Excel2010、使用 OS:unknown >


 集計結果の数値が理解できないけど、多分

 Sub test()
     Dim a, i As Long, ii As Long, n As Long
     a = Sheets("sheet1").Cells(1).CurrentRegion.Value
     ReDim b(1 To UBound(a, 1) * 3, 1 To UBound(a, 2))
     n = 1: a(1, 2) = "評価"
     For ii = 1 To UBound(a, 2)
         b(n, ii) = a(1, ii)
     Next
     For i = 2 To UBound(a, 1)
         If a(i, 1) <> "" Then
             n = n + IIf(n = 1, 1, 4)
             b(n, 1) = a(i, 1): b(n, 2) = "A〜F"
             b(n + 1, 2) = "AとB": b(n + 2, 2) = "A"
         End If
         If n > 0 Then
             For ii = 3 To UBound(a, 2)
                 If a(i, ii) Like "[A-F]" Then b(n, ii) = b(n, ii) + 1
                 If a(i, ii) Like "[AB]" Then b(n + 1, ii) = b(n + 1, ii) + 1
                 If a(i, ii) = "A" Then b(n + 2, ii) = b(n + 2, ii) + 1
             Next
         End If
     Next
     Sheets.Add.Cells(1).Resize(n + 3, UBound(b, 2)).Value = b
 End Sub
(seiya ) 2019/03/22(金) 14:59

 だらだらと書いていたら力業になっちゃたよぉ(^^;
Option Explicit
Sub てすと()
Dim MyA As Variant
Dim v As Variant
Dim vv As Variant
Dim x As Variant
Dim i As Long
Dim j As Long
Dim ii As Long
Dim k As Long
k = 1
Sheets("Sheet3").Cells.Clear
With Sheets("Sheet1")
    MyA = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Value
    For i = LBound(MyA, 1) To UBound(MyA, 1)
        If Not IsEmpty(MyA(i, 1)) Then
            ReDim y(1 To 4, 1 To 33)
            v = .Range("A" & i).CurrentRegion.Value
            y(2, 1) = MyA(i, 1)
            y(1, 2) = "評価"
            y(2, 2) = "A〜F"
            y(3, 2) = "AとB"
            y(4, 2) = "A"
            If i = 2 Then
                vv = .Range("A" & i).CurrentRegion.Value
                For j = LBound(v, 2) + 2 To UBound(vv, 2)
                    y(1, j) = j - 2 & "日"
                    For ii = LBound(v, 1) + 1 To UBound(v, 1)
                        If (StrConv(v(ii, j), vbNarrow) Like "[A-F]") Then y(2, j) = y(2, j) + 1
                        If (StrConv(v(ii, j), vbNarrow) = "A") + (StrConv(v(ii, j), vbNarrow) = "B") Then y(3, j) = y(3, j) + 1
                        If (StrConv(v(ii, j), vbNarrow) = "A") Then y(4, j) = y(4, j) + 1
                    Next
                Next
            Else
                For j = LBound(v, 2) + 2 To UBound(vv, 2)
                    y(1, j) = j - 2 & "日"
                    If j <= UBound(v, 2) Then
                        For ii = LBound(v, 1) To UBound(v, 1)
                            If (StrConv(v(ii, j), vbNarrow) Like "[A-F]") Then y(2, j) = y(2, j) + 1
                            If (StrConv(v(ii, j), vbNarrow) = "A") + (StrConv(v(ii, j), vbNarrow) = "B") Then y(3, j) = y(3, j) + 1
                            If (StrConv(v(ii, j), vbNarrow) = "A") Then y(4, j) = y(4, j) + 1
                        Next
                    End If
                Next
            End If
            With Sheets("Sheet3")
                .Range("A" & k).Resize(UBound(y, 1), UBound(y, 2)).Value = y
                k = k + UBound(y, 1) + 2
            End With
        End If
    Next
End With
Erase MyA, y, v, vv
End Sub

 すみません。m(__)m
間違えました。Gまでだったんですね(^^;

 度々、すみません。
ディクショナリーは使ってませんでした(^^;
入れ物も都度、初期化しないと駄目でした。もう、、ボロボロです。( ̄▽ ̄;)
(SoulMan) 2019/03/22(金) 15:23

 SoulManさん、こんにちわ。

 提示された集計結果が理解できないので、ごく単純に加算しただけですが、ひょっとしてもっと深いかも...
(seiya ) 2019/03/22(金) 16:09

 seiya さん こんにちは!

 タイトルに 連想配列 ってあったから、、学校の中からディクショナーをコピペして

 書き出したら、、使ってないという(^^;、、、なんともはや、、手癖とは恐ろしい(笑)

 >提示された集計結果が理解できないので、ごく単純に加算しただけですが、ひょっとしてもっと深いかも...

 ですね。あまりにも解が違い過ぎますね。。。。

 どんな結末が待っているのでしょう????楽しみですね・・・
(SoulMan) 2019/03/22(金) 16:16

返信ありがとうございます。

説明不足で申し訳ありません。

集計結果シートに各社毎、日付毎に商品名は関係なく評価の数を数えたかったんです。
A社の1日はA〜F評価がいくつあるか、AとB評価はいくつあるかっていう質問内容でした。

色々試行錯誤しても時間がかかってしまい質問させて頂きました。
(アト) 2019/03/22(金) 18:21


参考に
Sub Test()
    Dim myArea As Range, c As Range, i As Long
    Dim v(1 To 3, 1 To 31) As Long, LastRow As Long

    Worksheets("集計結果").Cells.ClearContents
    With Worksheets("データ").Range("B:B").SpecialCells(xlCellTypeConstants)
        LastRow = 2
        For Each myArea In .Areas
            For i = 1 To 31
                For Each c In myArea.Offset(, i)
                    If c.Value Like "[A-F]" Then v(1, i) = v(1, i) + 1
                    If c.Value Like "[A-B]" Then v(2, i) = v(2, i) + 1
                    If c.Value = "A" Then v(3, i) = v(3, i) + 1
                Next
            Next
            With Worksheets("集計結果")
                .Cells(LastRow, "B").Value = "評価"
                .Cells(LastRow, "C").Value = "1日"
                .Cells(LastRow, "C").AutoFill Destination:= _
                    .Cells(LastRow, "C").Resize(, 31), Type:=xlFillDefault
                .Cells(LastRow + 1, "A").Value = myArea.Item(1).Offset(, -1).Value
                .Cells(LastRow + 1, "B").Resize(3).Value = _
                    Application.Transpose(Array("A〜F", "AとB", "A"))
                .Cells(LastRow + 1, "C").Resize(3, 31).Value = v
                LastRow = .Cells(Rows.Count, "C").End(xlUp).Row + 2
            End With
            Erase v
        Next
    End With
End Sub

(ピンク) 2019/03/23(土) 17:06


コメント返信:

[ 一覧(最新更新順) ]


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