Excel VBA質問箱 IV

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

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


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

【37643】集計処理速度を早くするには? 06/5/13(土) 20:12 質問[未読]
【37646】Re:集計処理速度を早くするには? ハチ 06/5/14(日) 1:59 回答[未読]
【37653】Re:集計処理速度を早くするには? ハチ 06/5/14(日) 11:27 回答[未読]
【37695】Re:集計処理速度を早くするには? 06/5/15(月) 20:34 お礼[未読]
【37708】Re:集計処理速度を早くするには? ハチ 06/5/16(火) 9:59 発言[未読]
【37709】Re:集計処理速度を早くするには? ハチ 06/5/16(火) 10:08 発言[未読]
【37719】Re:集計処理速度を早くするには? 06/5/16(火) 19:00 お礼[未読]

【37643】集計処理速度を早くするには?
質問    - 06/5/13(土) 20:12 -

引用なし
パスワード
   こんばんわ。

下記のような表が、5列目〜31列目を会社A、32列目〜58列目を会社Bと26列毎に9会社あり、その会社毎に、日付と人の計を計算しています。
┌─┬──┬────┬──┬───┬───┬───┬──┬──┬──┬──
│ │A  │B    │C  │D   │E   │F   │・ │・ │AD │AE 
├─┼──┼────┼──┼───┼───┴───┴──┴──┴──┴──
│ 1│  │    │  │   │会社A                
├─┼──┼────┼──┼───┼───┬───┬──┬──┬──┬──
│ 2│No. │日付  │天気│曜日 │Aさん │Bさん │・ │・ │計 │累計
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│ 3│  │    │  │計  │   4│  4.5│  4│ 1.5│ 14│  
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│ 4│  1│ 4月26日│晴 │( 水 )│   1│   │  1│  │  2│  2
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│ 5│  2│ 4月27日│晴 │( 木 )│   │   1│  │  │  1│  3
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│ 6│  3│ 4月28日│晴 │( 金 )│   1│   1│ 0.5│  │ 2.5│ 5.5
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│ 7│  4│ 4月29日│晴 │( 土 )│   │   │  1│  │  1│ 6.5
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│ 8│  5│ 5月1日│晴 │( 月 )│   │  0.5│  │  1│ 1.5│  8
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│ 9│  6│ 5月2日│曇 │( 火 )│   1│   │  │  │  1│  9
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│10│  7│ 5月8日│曇 │( 月 )│   │   1│  1│  │  2│ 11
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│11│  8│ 5月9日│晴 │( 火 )│  0.5│   │  │  │ 0.5│11.5
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│12│  9│ 5月10日│雨 │( 水 )│   │   1│ 0.5│  │ 1.5│ 13
├─┼──┼────┼──┼───┼───┼───┼──┼──┼──┼──
│13│ 10│ 5月11日│雨 │( 木 )│  0.5│   │  │ 0.5│  1│ 14
└─┴──┴────┴──┴───┴───┴───┴──┴──┴──┴──
初めはSUM関数で処理していたのですが、行数が増えてくるとBookの容量が大きくなるのでマクロで処理するようにしたのですが、下記の記述では、処理に時間が掛かってしまいます。
Private Sub CommandButton2_Click()
Dim I, G, S As Integer
Dim L, R As Long
  Application.EnableEvents = False
  '行の計
     L = 0
   Do While Cells(L + 4, 2).Value <> ""
     Cells(L + 4, 30).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 5), Cells(L + 4, 29)))
     Cells(L + 4, 57).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 32), Cells(L + 4, 56)))
     Cells(L + 4, 84).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 59), Cells(L + 4, 83)))
     Cells(L + 4, 111).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 86), Cells(L + 4, 110)))
     Cells(L + 4, 138).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 113), Cells(L + 4, 137)))
     Cells(L + 4, 165).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 140), Cells(L + 4, 164)))
     Cells(L + 4, 192).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 167), Cells(L + 4, 191)))
     Cells(L + 4, 219).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 194), Cells(L + 4, 218)))
     Cells(L + 4, 246).Value = Application.WorksheetFunction.Sum(Range(Cells(L + 4, 221), Cells(L + 4, 245)))
     L = L + 1
   Loop
  '累計
   Cells(4, 31).Value = Cells(4, 30)
   Cells(4, 58).Value = Cells(4, 57)
   Cells(4, 85).Value = Cells(4, 84)
   Cells(4, 112).Value = Cells(4, 111)
   Cells(4, 139).Value = Cells(4, 138)
   Cells(4, 166).Value = Cells(4, 165)
   Cells(4, 193).Value = Cells(4, 192)
   Cells(4, 220).Value = Cells(4, 219)
   Cells(4, 247).Value = Cells(4, 246)
   
   For G = 27 To 216 Step 27
     Cells(4, 31 + G).Value = Cells(4, 30 + G)
   Next G
     R = 0
   Do While Cells(R + 5, 30).Value <> ""
     Cells(R + 5, 31).Value = Cells(R + 4, 31) + Cells(R + 5, 30)
     Cells(R + 5, 58).Value = Cells(R + 4, 58) + Cells(R + 5, 57)
     Cells(R + 5, 85).Value = Cells(R + 4, 85) + Cells(R + 5, 84)
     Cells(R + 5, 112).Value = Cells(R + 4, 112) + Cells(R + 5, 111)
     Cells(R + 5, 139).Value = Cells(R + 4, 139) + Cells(R + 5, 138)
     Cells(R + 5, 166).Value = Cells(R + 4, 166) + Cells(R + 5, 165)
     Cells(R + 5, 193).Value = Cells(R + 4, 193) + Cells(R + 5, 192)
     Cells(R + 5, 220).Value = Cells(R + 4, 220) + Cells(R + 5, 219)
     Cells(R + 5, 247).Value = Cells(R + 4, 247) + Cells(R + 5, 246)
     R = R + 1
   Loop
  '列の計
   For I = 5 To 247
     Cells(3, I).Value = Application.WorksheetFunction.Sum(Range(Cells(4, I), Cells(35536, I)))
   Next I
  Application.EnableEvents = True
End Sub
どのようにしたら、早く処理させることが出来るのか、自分なりには考えてみたのですが、さっぱり分からないので、御教授をお願いします。

【37646】Re:集計処理速度を早くするには?
回答  ハチ  - 06/5/14(日) 1:59 -

引用なし
パスワード
   ▼吉 さん:
>こんばんわ。
>
>下記のような表が、5列目〜31列目を会社A、32列目〜58列目を会社Bと26列毎に
>9会社あり、その会社毎に、日付と人の計を計算しています。

>どのようにしたら、早く処理させることが出来るのか、自分なりには考えてみたのですが、さっぱり分からないので、御教授をお願いします。

こんばんは
合計=5列目から29列目までのSUMだとするとこんな感じでどうでしょうか?
とりあえず1社目だけ作ってみました。
もっと簡単に表記できそうな気もしてきましたが・・・もう寝ます。

9社作るには、cの値をFor NextとかSelect Caseとかでうまいことやってください。


Sub test()

Dim c As Long 'Columnの指定
Dim LRow As Long 'D列の最終行

With Worksheets(1)
LRow = .Range("D65536").End(xlUp).Row


c = 30

'合計
.Range(.Cells(4, c), .Cells(LRow, c)).Formula _
= "=SUM(" & .Cells(4, c - 25).Address(0, 0) & ":" & .Cells(4, c - 1).Address(0, 0) & ")"

'累計
.Cells(4, c + 1) = .Cells(4, c)
.Range(.Cells(5, c + 1), .Cells(LRow, c + 1)).Formula _
= "=" & .Cells(4, c + 1).Address(0, 0) & "+" & .Cells(5, c).Address(0, 0)

End With

End Sub

【37653】Re:集計処理速度を早くするには?
回答  ハチ  - 06/5/14(日) 11:27 -

引用なし
パスワード
   >もっと簡単に表記できそうな気もしてきましたが・・・もう寝ます。

基準列を開始列にしてR1C1で記述したほうが、すっきりしました。

Sub test2()

Dim c As Integer '開始Columnの指定
Dim GoukeiC As Integer '合計のColumn
Dim LRow As Long 'D列の最終行

With Worksheets(1)

LRow = .Range("D65536").End(xlUp).Row
c = 5
GoukeiC = c + 25

'合計
.Range(.Cells(4, GoukeiC), .Cells(LRow, GoukeiC)).FormulaR1C1 _
= "=SUM(RC" & c & ":RC" & GoukeiC - 1 & ")"

'累計
.Cells(4, GoukeiC + 1).FormulaR1C1 = "=RC[-1]"
.Range(.Cells(5, GoukeiC + 1), .Cells(LRow, GoukeiC + 1)).FormulaR1C1 _
= "=R[-1]C+RC[-1]"

End With

End Sub

【37695】Re:集計処理速度を早くするには?
お礼    - 06/5/15(月) 20:34 -

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

こんばんわ。

返事遅くなってすいません。

お蔭様で以前より比べられないぐらい早く処理できるようになりました。

ありがとうございました。今後も宜しくお願いします。

参考に出来た記述を載せておきます。
何か改善点があれば御教授をお願いします。

Private Sub CommandButton2_Click()
Dim a, i As Integer '開始Columnの指定
Dim GoukeiA As Integer '合計のColumn
Dim LRow As Long 'D列の最終行
LRow = Worksheets("人員集計").Range("D65536").End(xlUp).Row
a = 5
GoukeiA = a + 25
For i = 1 To 9
With Worksheets("人員集計")
'行の計
.Range(.Cells(4, GoukeiA), .Cells(LRow, GoukeiA)).FormulaR1C1 = "=SUM(RC" & a & ":RC" & GoukeiA - 1 & ")"
'累計
.Cells(4, GoukeiA + 1).FormulaR1C1 = "=RC[-1]"
.Range(.Cells(5, GoukeiA + 1), .Cells(LRow, GoukeiA + 1)).FormulaR1C1 = "=R[-1]C+RC[-1]"
End With
a = a + 27
GoukeiA = GoukeiA + 27
Next i
'列の計
Range(Cells(3, 5), Cells(3, 247)).FormulaR1C1 = "=SUM(R[1]C:R[" & LRow & "]C)"
Range(Cells(3, 5), Cells(LRow, 247)).Copy
Range(Cells(3, 5), Cells(LRow, 247)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Range("D65536").End(xlUp).Select
End Sub

【37708】Re:集計処理速度を早くするには?
発言  ハチ  - 06/5/16(火) 9:59 -

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

おはようございます。
正解っていうのは無いと思いますので
自分ならこうする を書きます。
自分も修行中なので自信はありませんが。
サンプルがなくて動作確認できてません。
動かなかったら手直しして下さい。

1、GoukeiAを求める場合に+25、+27などとすると
行数が変わって改版するときにミスりそうです。
列の合計Cells(5,247)も計算で出せるようにしたほういいのでは。

2、Withの位置。Worksheetのコントロールなら問題ないですが、
フォームからだとActiveなSheetに列の合計を打ち込みそうです。

3、最後のところで実数にしてるっぽいですが前のままだと
Application.CutCopyMode = False
を入れないとコピーモードで終わりそうな気がします。
>初めはSUM関数で処理していたのですが、行数が増えてくるとBookの容量が大きくなるの>でマクロで処理するようにしたのですが、
の考慮なら、使用してる範囲を全部実数するほうがいいのかなと。


Private Sub CommandButton2_Click()
Dim a, i As Integer '開始Columnの指定
Dim GoukeiA As Integer '合計のColumn
Dim LRow As Long 'D列の最終行

With Worksheets("人員集計")
LRow = .Range("D65536").End(xlUp).Row
a = 5

For i = 1 To 9

GoukeiA = a + 25
'行の計
.Range(.Cells(4, GoukeiA), .Cells(LRow, GoukeiA)).FormulaR1C1 = "=SUM(RC" & a & ":RC" & GoukeiA - 1 & ")"
'累計
.Cells(4, GoukeiA + 1).FormulaR1C1 = "=RC[-1]"
.Range(.Cells(5, GoukeiA + 1), .Cells(LRow, GoukeiA + 1)).FormulaR1C1 = "=R[-1]C+RC[-1]"

a = a + 27

Next i

'列の計
.Range(.Cells(3, 5), .Cells(3, 247)).FormulaR1C1 = "=SUM(R[1]C:R[" & LRow & "]C)"

.UsedRange.Value = .UsedRange.Value

End With

End Sub

【37709】Re:集計処理速度を早くするには?
発言  ハチ  - 06/5/16(火) 10:08 -

引用なし
パスワード
   >a = a + 27

a = GoukeiA +2 '累計列+1

のほうがいいかな。

【37719】Re:集計処理速度を早くするには?
お礼    - 06/5/16(火) 19:00 -

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

こんばんわ。

以前とは比べられないぐらい処理も早くなり、記述もすっきりし、分かりやすくなって思い通りの結果がでました。

御教授、本当にありがとうございました。

.UsedRange.Value = .UsedRange.Value

の意味は、使われたセル範囲に値を設定する。と言うことですね。

大変勉強になりました。他のブックでも使えるところが有ります。

今後も、御教授を宜しくお願いします。

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