アプリ版:「スタンプのみでお礼する」機能のリリースについて

A列が文字列(数字もあります)で、B列~最終列までがデータ行となっています、
A列で重複している行を削除し、B列~最終列までをそれぞれの列毎に数値を合算したいのですが、
どのようにすれば良いかご教授頂けないでしょうか。(1行目はタイトル行です)
行は1万行ぐらい、列は現状AE列まである為、SUMIF関数だとすごく時間がかかってしまっています。
他にVBAで処理しようと思いましたが、ネットで調べても列数の多い合算方法が見つかりませんでした。

A 回答 (7件)

こんにちは!



一例です。
元データはSheet1にあり、Sheet2に表示するとします。
尚、1列目は項目行で最終列まで項目名が入っていて、B列2行目以降のデータはすべて数値だとします。

標準モジュールにしてください。

Sub Sample1()
 Dim myDic As Object
 Dim i As Long, j As Long
 Dim lastRow As Long, lastCol As Long
 Dim myStr As String, buf As String, wS As Worksheet
 Dim myKey, myItem, myR, myAry1, myAry2

  Set myDic = CreateObject("Scripting.Dictionary")
  Set wS = Worksheets("Sheet2")
   wS.Cells.ClearContents
    With Worksheets("Sheet1")
     lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
     lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
      Range(wS.Cells(1, "A"), wS.Cells(1, lastCol)).Value = Range(.Cells(1, "A"), .Cells(1, lastCol)).Value
       myR = Range(.Cells(2, "A"), .Cells(lastRow, lastCol))
        For i = 1 To UBound(myR, 1)
         For j = 2 To lastCol
          buf = buf & myR(i, j) & "_"
         Next j
          buf = Left(buf, Len(buf) - 1)
          If Not myDic.exists(myR(i, 1)) Then
           myDic.Add myR(i, 1), buf
          Else
           myAry1 = Split(myDic(myR(i, 1)), "_")
           myAry2 = Split(buf, "_")
            For j = 0 To UBound(myAry1)
             myStr = myStr & Val(myAry1(j)) + Val(myAry2(j)) & "_"
            Next j
             myStr = Left(myStr, Len(myStr) - 1)
             myDic(myR(i, 1)) = myStr
          End If
         buf = ""
         myStr = ""
        Next i
    End With
     myKey = myDic.keys
     myItem = myDic.Items
      myR = Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, lastCol))
       For i = 0 To UBound(myKey)
        myR(i + 1, 1) = myKey(i)
        myAry1 = Split(myItem(i), "_")
         For j = 0 To UBound(myAry1)
          myR(i + 1, j + 2) = myAry1(j)
         Next j
       Next i
      Range(wS.Cells(2, "A"), wS.Cells(UBound(myKey) + 2, lastCol)) = myR
     Set myDic = Nothing
     wS.Activate
     MsgBox "完了"
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 1
この回答へのお礼

構文作成頂き誠にありがとうございました。
意図通りの結果が算出された上、一瞬で処理が終わりました。
VBAの配列型がまだよく理解出来ていない分があるので、頑張って勉強致します。

お礼日時:2020/04/07 18:42

>A列で重複している行


が妨げになっているなら、シートをコピーしてそのシートで リボン>データ>重複の削除で必要なデータシートにしてから
そのシートにVBAで~処理してみてはいかがでしょう。ワークシート関数でも問題ないと思います。
シートをコピーしてリボン>データ>重複の削除で必要なデータシートにすること自体もVBAで特記するほど時間はかからないかと思いますが
ちなみに条件がないなら、合計数値を知りたいだけなら、ステータスバーに合計を設定すれば全セルに対しても一瞬かと思いますよ。
VBAで複雑な条件を処理するなら、tom04さんが示されているように配列で計算するのが早いと思います。

>A列で重複している行を削除し  私も意味の理解に達していませんが 参考まで
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。
説明不足で大変申し訳ございません。
例を出せばよかったです、すみません。
A列 B列 C列 D列・・・
AAA 0 1 2
AAA 2 2 2
AAA 0 5 0

AAA 2 8 4

お礼日時:2020/04/07 18:50

No2です



「列で合計したい」ということは理解しました。
「重複を削除し」がいまいちわかりません。
「重複していない行だけを集計したい」という意味で良いのでしょうか?

条件が多少変わっても、フィルター機能とSUBTOTAL関数で求められそうな気がします。
例えば、「重複の無い行だけを集計」という場合なら、準備として…
1)どこかに作業列を設けて、1行目に
 =IF(COUNTIF(A:A,A1)=1,"○","")
 の式を入れ、フィルハンドルをダブルクリック(下方までフィルコピーされる)
 この結果、A列に重複の無い行だけ○が表示されます。
2)どこかの行に集計行を設け(大抵は最初か、最後の行)
 =SUBTOTAL(109,1列分の範囲)
 の式を入れて、横方向にフィルコピーします。
この状態では集計行には各列全体の合計値が表示されていると思います。

3)作業列のフィルターで○のみを表示する
この結果、集計行には○のみの行の集計が表示されることになります。

行数が多いとのことなので、若干時間は掛かるかもしれませんが、SUMIFで計算するよりも遥かに速いのではないかと思います。
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます、
説明が伝わりづらく大変申し訳ございません。
A列の重複は全て削除し、B列以降のデータは、列毎、A列の重複ごとに合算したいと考えていました。
例を出せばよかったです、すみません。
A列 B列 C列 D列・・・
AAA 0 1 2
AAA 2 2 2
AAA 0 5 0

AAA 2 8 4

お礼日時:2020/04/07 18:49

レイアウトがわかりにくいですが、統合機能は使えませんか?


データ数が多いなら、一旦表を上半分と下半分にして次はそれを合算するとかでもできるとおもいますが。
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。
統合機能は使ったことないので、勉強致します。

お礼日時:2020/04/07 18:45

A列で重複している行について、


・最初に見つかった行は保存して以降の重複した行を削除する。
・重複している中の一番後ろを残す。
・重複している物はすべて消す。
のどれなのでしょうか?
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。
A列の重複に関してはどれを残しても構いません。
A列の重複分を全て削除し、B列以降のデータを列毎、重複データ毎に合算したいと考えています。

お礼日時:2020/04/07 18:44

こんにちは



>列は現状AE列まである為、SUMIF関数だとすごく時間がかかってしまっています
行数も効いてくるので、どれほど効果があるかはわかりませんが・・・

>B列~最終列までをそれぞれの列毎に数値を合算したいのですが
抽出処理と同に列の合計計算を行わせているので、計算量が増える原因になっていると想像します。
「B~最終列」は常に一セットなのでしょうから、先に「最終行+1」列あるいは、A列の右側に新しく列を挿入して、その列に(各行の)「B~最終列の合計値」を算出しておけば良いのでは?
(SUM関数等で簡単に求められます)

SumiFの集計列として、こちらの列1列だけを指定することで行数分の計算だけにできるので、かなり負荷が減るのではなかろうかと推測します。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
説明不足で申し訳ございません。
「B~最終列の合計値」ではなく、列毎で合計したい為、
B列+C列・・・+最終列の合計ではないです。
B列はB列の合計、C列はC列の合計・・・最終列は最終列の合計とそれぞれの列毎の
合計をさせたいと思っています。

お礼日時:2020/04/01 17:55

ピボットとかでも遅すぎるなら、エクセルでは厳しいかな。


アクセスにインポートして、集計クエリ作るとか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
検討してみます。

お礼日時:2020/04/01 17:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A