Board logo

標題: [發問] 如何使用vba做更快速的計算 [打印本頁]

作者: ting870520    時間: 2015-10-22 09:56     標題: 如何使用vba做更快速的計算

[attach]22232[/attach]
想請問各位大大們,目前附件中的excel資料是使用函數做計算,但速度很慢且容易出錯,想嘗試使用vba去做更快速的計算,也有買書回來研究,但"有看沒有懂",不知各位大大們,是否可以幫忙解決問題??
主要是想把'2015生產日報表統計'中的數量做統計,因每天可能有數筆不同的資料,想統計各項原料的使用量,所以要區分為每日、每月及每年,謝謝各位~~
作者: 准提部林    時間: 2015-10-23 14:00

本帖最後由 准提部林 於 2015-10-23 14:01 編輯

沒有簡便寫法,只能逐一套,
有點複雜,請自行慢慢研究,程式碼太多,無法一一解說:
 
Sub 統計()
Dim j&, k&, Arr, Brr, R&, C&, LB, Day1&, Day2&
Dim Crr, Drr, iDate, DV&, D&, M&, SS
With Sheets(1).UsedRange.Offset(1, 0)
  Arr = .Columns("C"):     R = UBound(Arr) - 1
  Brr = .Columns("N:DU"):  C = UBound(Brr, 2)
  Day1 = CDate(Left(.Parent.Name, 4) & "/1/1")
  Day2 = CDate(Left(.Parent.Name, 4) & "/12/31")
  DV = Day2 - Day1 + 1
End With
 
ReDim Crr(1 To DV, 1 To C), Drr(1 To 12, 1 To C)
For j = 2 To R
  iDate = Arr(j, 1): If Not IsDate(iDate) Then GoTo 101
  If iDate < Day1 Or iDate > Day2 Then GoTo 101
  D = iDate - Day1 + 1:  M = Month(iDate)
  For k = 1 To C
    SS = Crr(D, k) + Brr(j, k)
    If SS <> 0 Then Crr(D, k) = SS
    SS = Drr(M, k) + Brr(j, k)
    If SS <> 0 Then Drr(M, k) = SS
  Next k
101: Next j
 
With Sheets("數量統計")
  .UsedRange.EntireRow.Delete
  .[B1].Resize(R, C) = Brr: .[A1] = "生產日期"
  .[A1].Resize(R) = Arr
  .[A1].Resize(R).NumberFormatLocal = "yyyy/mm/dd"
  With .Cells(R + 1, 1).Resize(1, C + 1)
    .Formula = "=IF(COLUMN()=1,""TOTAL"",SUM(A2:A" & R & "))"
    .Borders(xlEdgeTop).LineStyle = xlContinuous
    .Borders(xlEdgeBottom).LineStyle = xlDouble
  End With
End With
 
With Sheets("日期統計")
  .UsedRange.EntireRow.Delete
  .[B1].Resize(1, C) = Brr: .[A1] = "生產日期"
  .[A2].Resize(DV, 1) = "=" & Day1 & "+ROW(A1)-1"
  .[A2].Resize(DV, 1).NumberFormatLocal = "yyyy/mm/dd"
  .[B2].Resize(DV, C) = Crr
  With .Cells(DV + 2, 1).Resize(1, C + 1)
    .Formula = "=IF(COLUMN()=1,""TOTAL"",SUM(A2:A" & DV + 1 & "))"
    .Borders(xlEdgeTop).LineStyle = xlContinuous
    .Borders(xlEdgeBottom).LineStyle = xlDouble
  End With
End With
 
With Sheets("月份統計")
  .UsedRange.EntireRow.Delete
  .[B1].Resize(1, C) = Brr: .[A1] = "生產月份"
  .[A2].Resize(12) = "=TEXT(ROW(A1),""00月"")"
  .[B2].Resize(12, C) = Drr
  With .Cells(14, 1).Resize(1, C + 1)
    .Formula = "=IF(COLUMN()=1,""TOTAL"",SUM(A2:A13))"
    .Borders(xlEdgeTop).LineStyle = xlContinuous
    .Borders(xlEdgeBottom).LineStyle = xlDouble
  End With
End With
End Sub
 
附檔下載:
[attach]22237[/attach]
 
作者: ting870520    時間: 2015-10-23 15:57

回復 2# 准提部林
感謝大大的指導,我會慢慢研究您的寫法~~
但實際套用後卻出現錯誤,如果資料超過218列,即顯示偵錯,且偵錯停留在  SS = Drr(M, k) + Brr(j, k) 這裡,不知是否為資料太多,還是VBA有地方要做修改,謝謝~~
作者: 准提部林    時間: 2015-10-23 17:02

回復 3# ting870520


一千列以上也可以正常運作, 看一下您的資料內容是否有問題~~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)