如果不想每次都改就用下面这句
pr = range("G3:G" & range("G65536").end(3).row).value
改了一个完善的,用于年度的. 如果到了2010后要改一下年份.
Private Sub CommandButton1_Click()
Dim i0, i, ii, i3, x, y, arr1(), arr2()
Dim dic1 As Object
Set dic1 = CreateObject("scripting.dictionary")
x = Range("A65536").End(3).Row
arr1 = Range("A4:D" & x).Value
dic1(0) = 0
For i = 1 To x - 3
dic1(arr1(i, 2)) = dic1(arr1(i, 2)) + 1
Next
On Error Resume Next
ld = DateValue(DateSerial(2009, Month(arr1(x - 3, 1)) + 1, 0))
v = dic1.items
pr = Range("G3:G" & Range("G65536").End(3).Row).Value
Sheets("仓储费").Range("H2:K65536").ClearContents
For i0 = 1 To dic1.Count
z = z + v(i0 - 1)
Erase arr1
arr1 = Range("A" & 4 + z).Resize(v(i0), 4).Value
ReDim arr2(1 To ld - arr1(1, 1) + 1, 1 To 4)
y = 0
For i = 1 To v(i0)
If i = v(i0) Then
For ii = 1 To ld - arr1(i, 1) + 1
y = y + 1
arr2(y, 1) = arr1(1, 1) + y - 1
arr2(y, 2) = arr1(1, 2)
For i3 = 1 To i
arr2(y, 3) = arr2(y, 3) + arr1(i3, 3) - arr1(i3, 4)
Next
arr2(y, 4) = arr2(y, 3) * pr(i0, 1)
Next
Else
For ii = 1 To arr1(i + 1, 1) - arr1(i, 1)
y = y + 1
arr2(y, 1) = arr1(1, 1) + y - 1
arr2(y, 2) = arr1(1, 2)
For i3 = 1 To i
arr2(y, 3) = arr2(y, 3) + arr1(i3, 3) - arr1(i3, 4)
Next
arr2(y, 4) = arr2(y, 3) * pr(i0, 1)
Next
End If
Next
With Sheets("仓储费")
tr = .[H1].CurrentRegion.Rows.Count + 1
.Range("H" & tr).Resize(UBound(arr2), 4).Value = arr2
Erase arr2
End With
Next
If Err.Number <> 0 Then Err.Clear
On Error GoTo 0
Erase arr1, arr2, pr, v
Set dic1 = Nothing
End Sub
[ 本帖最后由 lb_bn 于 2009-9-29 19:58 编辑 ]