[[20190704151348]] 『集計をマクロでやりたい』(令和20) ページの最後に飛ぶ

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

 

『集計をマクロでやりたい』(令和20)

[[20190528114100]] 『集計をマクロでやりたい』(令和20)
2019年05月28日(火)
上記のように、以前質問致しまして、下記のようにご回答頂いたものです。
順調に処理を重ねて来ましたが、項目欄(日付・当該番号・品名・・・・・・)
の行とデータとの間に、集計などの行を改めて設けます。
すると、「実行時エラー"13"  型が一致しません」と出てしまいます。
どのように修正したらよいのか、お教え下さいませんか。
なお、以前(隠居じーさん)・ (白茶)のお二人には大変お世話になりありがとうございました。

     A   B         C   D          E        F          G   H   I      J        K   L   M   N         O             P         Q             R         S             T         U            
  1      日付          当該番号   品名     金額品名           番号   品名                 日付      1りんご金額   日付      2ぶどう金額   日付      3バナナ金額   日付      4みかん金額  
  2       3月12日              2  ぶどう         100              1  りんご                4月16日           300   3月12日           100   5月13日           500   5月12日           400 
  3       4月16日              1  りんご         200              2  ぶどう                4月19日           200                                                                         
  4       4月19日              1  りんご         300              3  バナナ                                                                                                              
  5       5月12日              4  みかん         400              4  みかん                                                                                                              
  6       5月13日              3  バナナ         500                                                                                                                                     
回答ではありません。^^;
整理のお手伝いです。
B1〜J6の情報を基にN列〜U列。。(。商品数分(40)増える)
の様な表を作成すればよいのでしょうか。
i〜J(商品マスタ)も作る?作らなくても良い?
とかが解ると多数回答があるかもしれませんね。
上記の図も想像図ですので、違えてましたら修正後
さらなるご説明をされるといいと思います。
私が作りますっていう意味では有りません。^^;;;
気が付いた点だけですみません。m(_ _)m
(隠居じーさん) 2019/05/28(火) 15:39
    Sub test()
        Dim DT As Range, vRead() As Variant, r As Long, vWrite() As Variant
        Dim List As Range, c As Long, d As Date, r2 As Long
        Dim r2HWM As Long, c2HWM As Long
        Set List = [I2:J41]
        c2HWM = List.Rows.Count * 2
        Set DT = Intersect([B:F], [D1].CurrentRegion.EntireRow)
        With Workbooks.Add
            DT.Copy .ActiveSheet.Cells(1, 1)
            With .ActiveSheet.Sort
                .SortFields.Add Key:=Range("C1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .SetRange .Parent.UsedRange
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
                vRead = .Rng.Value
            End With
            .Close False
        End With
        ReDim vWrite(1 To UBound(vRead), 1 To c2HWM)
        For c = 2 To c2HWM Step 2
            vWrite(1, c - 1) = "日付"
            vWrite(1, c) = List(c / 2, 1) & List(c / 2, 2) & "金額"
        Next
        For r = 2 To UBound(vRead)
            If vRead(r, 3) <> c Then
                c = WorksheetFunction.Match(vRead(r, 3), List.Columns(1), 0)
                If r2 > r2HWM Then r2HWM = r2
                r2 = 1
            End If
            If CDate(vRead(r, 1)) <> d Then
                d = CDate(vRead(r, 1))
                r2 = r2 + 1
                vWrite(r2, c * 2 - 1) = d
            End If
            vWrite(r2, c * 2) = vWrite(r2, c * 2) + vRead(r, 5)
        Next
        [N1].Resize(r2HWM, c2HWM) = vWrite
    End Sub

(白茶) 2019/05/28(火) 16:48

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 データが B-E列、結果を N列から。
 結果は、横軸は当該番号、縦軸は日付でどちらも昇順。

 ということで

 Sub test()
     Dim a, i As Long, ii As Long, t As Long, maxRow As Long
     a = Range("b2", Range("b" & Rows.Count).End(xlUp)).Resize(, 6).Value
     With CreateObject("System.Collections.SortedList")
         For i = 1 To UBound(a, 1)
             If Not .Contains(a(i, 2)) Then
                 .Item(a(i, 2)) = Array(a(i, 2) & a(i, 3), _
                 CreateObject("System.Collections.SortedList"))
             End If
             .Item(a(i, 2))(1)(a(i, 1)) = .Item(a(i, 2))(1)(a(i, 1)) + a(i, 4)
         Next
         ReDim a(1 To UBound(a, 1), 1 To .Count * 2)
         For i = 0 To .Count - 1
             t = t + 2
             a(1, t - 1) = "日付": a(1, t) = .GetByIndex(i)(0) & "金額"
             For ii = 0 To .GetByIndex(i)(1).Count - 1
                 a(ii + 2, t - 1) = .GetByIndex(i)(1).GetKey(ii)
                 a(ii + 2, t) = .GetByIndex(i)(1).GetByIndex(ii)
             Next
             maxRow = Application.Max(maxRow, ii + 2)
         Next
     End With
     With [n1].Resize(maxRow, UBound(a, 2))
         .CurrentRegion.ClearContents
         .Value = a
         For ii = 1 To .Columns.Count Step 2
             .Columns(ii).NumberFormat = "m月d日"
         Next
         .Columns.AutoFit
     End With
 End Sub
(seiya) 2019/07/04(木) 16:58

(seiya)さん、ありがとうございましす。

このマクロで実行したのですが、エラーが出てしまいます。
「実行時エラー"13"  型が一致しません」のようにエラーが出ます。
下記のところが、黄色のエラーがでます。
お教え頂けませんでしょうか。よろしくお願い致します。

.Item(a(i, 2))(1)(a(i, 1)) = .Item(a(i, 2))(1)(a(i, 1)) + a(i, 4)

行を増やした表です。

   A   B         C   D          E        F          G   H   I      J        K   L   M   N         O             P         Q             R         S             T         U            
  1      日付          当該番号   品名     金額品名           番号   品名                 日付      1りんご金額   日付      2ぶどう金額   日付      3バナナ金額   日付      4みかん金額  
  2                               合計     1500                                      合計        500 合計        100  合計        500  合計        400
  3       3月12日              2  ぶどう         100              1  りんご                4月16日           300   3月12日           100   5月13日           500   5月12日           400 
  4       4月16日              1  りんご         200              2  ぶどう                4月19日           200                                                                         
  5       4月19日              1  りんご         300              3  バナナ                                                                                                              
  6       5月12日              4  みかん         400              4  みかん                                                                                                              
  7       5月13日              3  バナナ         500                                           

(令和20) 2019/07/05(金) 09:20


 >行とデータとの間に、集計などの行を改めて設けます。 
 この辺が分かりずらかったのですが、それでも動いているんですがね...
 まだどこか違うのかもしれませんが、とりあえず下記で試してください。

 Sub test()
     Dim a, i As Long, ii As Long, t As Long, maxRow As Long
     a = Range("b2", Range("b" & Rows.Count).End(xlUp)).Resize(, 4).Value
     With CreateObject("System.Collections.SortedList")
         For i = 3 To UBound(a, 1)
             If Not .Contains(a(i, 2)) Then
                 .Item(a(i, 2)) = Array(a(i, 2) & a(i, 3), _
                 CreateObject("System.Collections.SortedList"))
             End If
             .Item(a(i, 2))(1)(a(i, 1)) = .Item(a(i, 2))(1)(a(i, 1)) + a(i, 4)
         Next
         ReDim a(1 To UBound(a, 1), 1 To .Count * 2)
         For i = 0 To .Count - 1
             t = t + 2
             a(1, t - 1) = "日付": a(1, t) = .GetByIndex(i)(0) & "金額"
             a(2, t - 1) = "合計"
             For ii = 0 To .GetByIndex(i)(1).Count - 1
                 a(ii + 3, t - 1) = .GetByIndex(i)(1).GetKey(ii)
                 a(ii + 3, t) = .GetByIndex(i)(1).GetByIndex(ii)
                 a(2, t) = a(2, t) + .GetByIndex(i)(1).GetByIndex(ii)
             Next
             maxRow = Application.Max(maxRow, ii + 2)
         Next
     End With
     With [n1].Resize(maxRow, UBound(a, 2))
         .CurrentRegion.ClearContents
         .Value = a
         For ii = 1 To .Columns.Count Step 2
             .Columns(ii).NumberFormat = "m月d日"
         Next
         .Columns.AutoFit
     End With
 End Sub
(seiya) 2019/07/05(金) 09:57

 >行とデータとの間に、集計などの行を改めて設けます。 
すみません、理解しがたい表現ですね。改めて自分で読んでもおかしいと思いました。
これは、
 >行を増やした表です。で示したとおり、2行目に1行増やすことを意味しています。
また、合計の所はsum関数で合計します。
1行増やさない状態のデータで、このひとつ前のマクロを実行するとうまくいきます。
しかし、1行増やした状態で、最新のマクロを実行すると、「実行時エラー -2147467261(800004003)」
キーをNullにすることができません。
パラメータ名:Key
と出て実行できないのですが、どうでしようか。面倒をおかけしますが、お教え下さいませんでしようか。よろしくお願い致します。
(令和20) 2019/07/05(金) 12:35

 確認ですが
 列はB:E, B1 = 日付, C1 = 当該番号, D1 = 品名, E1 = 金額品名
          B2 = 空白, C2 = 空白,     D2 = 合計, E2 = 1500 (合計)

 データは3行目から

 からではないのですか?
(seiya) 2019/07/05(金) 12:51

 解りにくい作表で、すみません。多分。。。C列は全て空かと。。。
 ご本人に聞かないと真実は解りませんが。。。m(_ _)m

(隠居じーさん) 2019/07/05(金) 12:55


 (隠居じーさん)さん、ありがとうございます。

 もしそうなら、これで

 Sub test()
     Dim a, i As Long, ii As Long, t As Long, maxRow As Long
     a = Range("b3", Range("b" & Rows.Count).End(xlUp)).Resize(, 5).Value
     With CreateObject("System.Collections.SortedList")
         For i = 1 To UBound(a, 1)
            If a(i, 3) <> "" Then
                If Not .Contains(a(i, 3)) Then
                    .Item(a(i, 3)) = Array(a(i, 3) & a(i, 4), _
                    CreateObject("System.Collections.SortedList"))
                End If
                .Item(a(i, 3))(1)(a(i, 1)) = .Item(a(i, 3))(1)(a(i, 1)) + a(i, 5)
            End If
         Next
         ReDim a(1 To UBound(a, 1), 1 To .Count * 2)
         For i = 0 To .Count - 1
             t = t + 2
             a(1, t - 1) = "日付": a(1, t) = .GetByIndex(i)(0) & "金額"
             a(2, t - 1) = "合計"
             For ii = 0 To .GetByIndex(i)(1).Count - 1
                 a(ii + 3, t - 1) = .GetByIndex(i)(1).GetKey(ii)
                 a(ii + 3, t) = .GetByIndex(i)(1).GetByIndex(ii)
                 a(2, t) = a(2, t) + .GetByIndex(i)(1).GetByIndex(ii)
             Next
             maxRow = Application.Max(maxRow, ii + 2)
         Next
     End With
     With [n1].Resize(maxRow, UBound(a, 2))
         .CurrentRegion.ClearContents
         .Value = a
         For ii = 1 To .Columns.Count Step 2
             .Columns(ii).NumberFormat = "m月d日"
         Next
         .Columns.AutoFit
     End With
 End Sub
(seiya) 2019/07/05(金) 13:25

大変、わかりずらい表になりました。すいませんでした。

C・G・H・K・L・M列は空白にしている理由は
公開では少しまずいので、空白にしています。
マクロに関わるデータではないと思いましたので
そのようにさせて頂いています。

 >確認ですが
 >列はB:E, B1 = 日付, C1 = 当該番号, D1 = 品名,    E1 = 金額品名
 >         B2 = 空白, C2 = 空白,     D2 = 合計,    E2 = 1500 (合計)

正しくは下記の通りです。

 列はB:F, B1 = 日付, C1 = 空白, D1 = 当該番号, E1 = 品名 F1 = 金額品名

          B2 = 空白, C2 = 空白,     D2 = 空白,     E2 = 合計    F1 = 1500 (合計)

 >データは3行目から

     データは3行目からです。
   2行目は、合計などのためのsum関数などが入る行です。

(令和20) 2019/07/05(金) 16:18


(seiya) 2019/07/05(金) 13:25。seiyaさんこれでできました。

合計までできるようにして下さっていたとは感激です。凄いです。

誠に、ありがとうございました。

詳しく、やってはいませんが、私の思うようなことをして頂いたと思います。

今度も、驚かされました。ご協力に感謝・感謝です。重ねてお礼を申し上げま

す。

(隠居じーさん)さん、へのお礼も忘れるところでした。ありがとうございまし

た。

(令和20) 2019/07/05(金) 16:40


コメント返信:

[ 一覧(最新更新順) ]


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