返回列表 上一主題 發帖

[發問] vba做自動合計

本帖最後由 c_c_lai 於 2015-8-1 12:24 編輯

回復 1# tomtracy
試試看:
  1. Sub Ex()
  2.     Dim bt As Single
  3.    
  4.     With Sheet1
  5.         bt = .Range("B" & .Rows.Count).End(xlUp).Row
  6.         If InStr(.Range("B" & bt - 5), "小計") Then
  7.             .Range("K" & bt - 5).Formula = "=SUM(K8:K" & (bt - 6) & ")"
  8.             .Range("K" & bt).Formula = "=SUM(K" & (bt - 5) & ":K" & (bt - 1) & ")"
  9.         End If
  10.     End With
  11. End Sub
複製代碼

TOP

本帖最後由 c_c_lai 於 2015-8-1 18:22 編輯

回復 4# tomtracy

我是以你上次附上的檔案為舉例,如果你
自訂的格式有所異動,程式碼判斷亦應跟隨
更正,以符事實。

TOP

回復 6# tomtracy
先澄清一下,為何你的表單需要連續有四組『小計』,
每組『小計』的定義為何?

原本表單之處裡:
  1. Sub Ex()
  2.     Dim bt As Single
  3.    
  4.     With Sheet1
  5.         bt = .Range("B" & .Rows.Count).End(xlUp).Row
  6.         If InStr(.Range("B" & bt - 5), "小計") Then
  7.             .Range("K" & bt - 5).Formula = "=SUM(K8:K" & (bt - 6) & ")"
  8.             .Range("K" & bt).Formula = "=SUM(K" & (bt - 5) & ":K" & (bt - 1) & ")"
  9.         End If
  10.     End With
  11. End Sub
複製代碼
依照之後附上表單之內容,請自行修正為:
  1. Sub Ex()
  2.     Dim bt As Single
  3.    
  4.     With Sheet1
  5.         bt = .Range("B" & .Rows.Count).End(xlUp).Row
  6.         If InStr(.Range("B" & bt - 3), "小計") Then
  7.             .Range("K" & bt - 3).Formula = "=SUM(K8:K" & (bt - 4) & ")"     '  小計
  8.             .Range("K" & bt).Formula = "=SUM(K" & (bt - 3) & ":K" & (bt - 1) & ")"     '  總計
  9.         End If
  10.     End With
  11. End Sub
複製代碼
便有數值寫入了。

TOP

我再請教Lai先生 為何每次使用此文件時為何都要到代碼內按巨集啟用呢?
tomtracy 發表於 2015-8-3 23:54

因為你的小計並非設定在『固定欄位』上,而是位於不定列上,
通常你可能在確定輸入完成後才會加上『小計』欄,在確定
工作結束後此時你才會去觸發 Ex() 之故。
假設你已確定『小計』欄是位在『固定欄位』上,那你可以直接在
該 K 欄,直接打入 『=SUM(K##:K##)』,不就結了?
何須再多此一舉去應用 VBA 解決!

TOP

本帖最後由 c_c_lai 於 2015-8-4 12:54 編輯

回復 13# tomtracy
放置於 Sheet1 (Sheet1) 程式碼內:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim bt As Single


  3.     bt = Range("B" & Rows.Count).End(xlUp).Row - 3  ' 小計之前的內容

  4.     If (bt >= 8 And Target.Row < bt) And Target.Column = 11 Then  ' 當 K 欄位值異動時
  5.         ThisWorkbook.Ex
  6.     End If
  7. End Sub
複製代碼
放置於 ThisWorkbook 程式碼內:
  1. Sub Ex()
  2.     Dim bt As Single
  3.    
  4.     With Sheet1
  5.         bt = .Range("B" & .Rows.Count).End(xlUp).Row
  6.         If bt > 8 And InStr(.Range("B" & bt - 3), "小計") Then
  7.             .Range("K" & bt - 3).Formula = "=SUM(K8:K" & (bt - 4) & ")"     '  小計
  8.             .Range("K" & bt).Formula = "=SUM(K" & (bt - 3) & ":K" & (bt - 1) & ")"     '  總計
  9.         End If
  10.     End With
  11. End Sub
複製代碼
儲存後,只要從 K8 欄開始至小計前 K 欄內容有所異動時,小計與總計內容值便會自動隨之異動,
而不需再由人工啟動 Ex(),這純粹是懶人的程式寫法亦是你所期望的方式。

TOP

回復 15# tomtracy

TOP

        靜思自在 : 口說好話、心想好意、身行好事。
返回列表 上一主題