|
>早速確認しましたところ、日付データが増えていっても動作しましたが、
>材料数が増えていった場合、うまく抽出しませんでした。
ゴメン
>のデータ(日付も、材料数も増え続けます)
を忘れていました
最終列位置を自動で取得する様にしました
以下の様にコードを変更して下さい
Option Explicit
Public Sub AddUp()
'材料1の列位置
Const lngMat As Long = 3
Dim i As Long
Dim j As Long
Dim vntData As Variant
Dim lngEnd As Long
Dim vntResult() As Variant
Dim lngPos() As Long
Dim lngCol As Long
Dim lngKinds As Long '★この行追加
'Sheet1のデータを配列に取得
With Worksheets("Sheet1")
'★以下の10行追加
lngKinds = .Cells(1, _
"IV").End(xlToLeft).Column
If lngKinds < lngMat Then
Beep
MsgBox "データが有りません"
Exit Sub
End If
lngKinds = lngKinds - lngMat
'結果用変数、書き込みポインタを配列として確保
ReDim vntResult((lngKinds + 1) * 2 - 1, 0)
ReDim lngPos(lngKinds)
lngEnd = .Cells(65536, "A").End(xlUp).Row
If lngEnd < 2 Then
Beep
MsgBox "データが有りません"
Exit Sub
End If
vntData = Range(.Cells(1, "A"), _
.Cells(lngEnd, _
lngMat + lngKinds)).Value
End With
'結果配列に列見出しを取得
For i = 0 To lngKinds
vntResult(i * 2, 0) = vntData(1, 1) '日付
vntResult(i * 2 + 1, 0) _
= vntData(1, i + lngMat) '材料
lngPos(i) = 0 '書き込みポインタの初期値
Next i
'集計
'データの先頭から終りまで繰り返し
For i = 2 To UBound(vntData, 1)
'材料1、2、3に就いて繰り返し
For j = 0 To lngKinds
'書き込み列を計算
lngCol = j * 2
'もし、日付が書き込み行の日付と違うなら
If vntData(i, 1) _
<> vntResult(lngCol, lngPos(j)) Then
'もし、データが0を超えるなら
If vntData(i, j + lngMat) > 0 Then
'書き込み行ポインタを更新
lngPos(j) = lngPos(j) + 1
'もし、結果配列の大きさがより
'書き込み位置が後なら
If UBound(vntResult, 2) _
< lngPos(j) Then
'結果配列を拡張
ReDim Preserve _
vntResult((lngKinds + 1) * 2 _
- 1, lngPos(j))
End If
'日付を代入
vntResult(lngCol, lngPos(j)) _
= vntData(i, 1)
'値を代入
vntResult(lngCol + 1, lngPos(j)) _
= vntData(i, j + lngMat)
End If
Else
'値を加算
vntResult(lngCol + 1, lngPos(j)) _
= vntResult(lngCol + 1, lngPos(j)) _
+ vntData(i, j + lngMat)
End If
Next j
Next i
'結果配列の行列を入れ替えて出力
With Worksheets("Sheet2")
.Cells(1, "A").Resize(UBound(vntResult, 2) + 1, _
UBound(vntResult, 1) + 1).Value _
= Application.Transpose(vntResult)
End With
Beep
MsgBox "処理が完了しました"
End Sub
|
|