你在這裏什麼是一個非常好的開始。
類似下面的,這是非常接近你已經開始用什麼,應該做的伎倆:
Sub Button1_Click()
Dim vStartRow As Integer
Dim vEndRow As Integer
Dim rngCell As Range
'get start and end rows for your sum
vStartRow = 2 'Row 2
vEndRow = Range("A2").End(xlDown).Row()
'determine which column already has a sum by iterating through the cells in your vEndRow
For Each rngCell In Rows(vEndRow + 1).Cells
'Does the rngCell (the cell in the first empty row) have a value already (assuming it's not column 1, which we can't sum anyway)
If rngCell.Value = "" And rngCell.Column <> 1 Then 'we have an empty cell and it's not column 1.
'Since the value of rngCell has been determined we can exit the loop and it will stay set to this cell
Exit For
End If
Next rngCell
'finally set the formula for our empty column's total row
rngCell.Formula = "=SUM(" & Cells(vStartRow, rngCell.Column()).Address & ":" & Cells(vEndRow, rngCell.Column()).Address & ")"
End Sub
幾件事情發生在這裏:
第一:的For Each
循環。在VBA中,我們有可以是範圍,工作表,工作簿等的對象。許多對象都有其他對象的集合。例如,範圍具有行的集合,工作簿具有一組表。我們可以使用For Each
循環遍歷集合中的項目的Each
。
通過每個工作簿中的每個表循環的例子:
Sub test()
Dim sht as Worksheet
For Each sht in ThisWorkbook.Sheets
msgbox(sht.name)
Next sht
End Sub
二:而不是選擇一個單元格,然後讓該小區的物業(喜歡它的行),你可以去直到物業。
所以不是:
Cells(1,2).Select
myVar = Selection.Row
你可以這樣做:
myVar = Cells(1,2).Row
如果您在使用.Select
或.Activate
那麼你可能做錯事找你的自我。人類.Select
和.Activate
,但電腦並不需要。這很浪費,會導致代碼中出現一些奇怪的行爲。雖然......有時這很有道理。如果您的要求是:
「我想總結一下所有的數字行中用戶已 選擇當按下按鈕」
然後,selectedCell = Selection
將使很多感。
或者,反之,如果你的要求是:
「當子程序結束,我想單元格A1被選擇」
然後Sheet1.Range("A1").Select
是要走的路。但是,您可以在兩種情況下都看到,這是由於我們需要與用戶進行交互,因此我們使用Selection
屬性和對象的Select()
方法。
第三:您可以通過訪問它的.Address
屬性來獲取範圍對象的地址。所以不需要使用列字母猴子。只需點擊.Address
,它就會知道。
第四個:我在提交後添加了這個,但它很重要且令人困惑。 Cells
,Ranges
,Rows
和Columns
都是Range
的同義詞。所以......你可以遍歷cells
中的每個row
,或rows
中的每一個column
或columns
中的每一個range
。在這個解決方案中,我們遍歷cells
的row
,其中cell
只是一個range()
,它是...單個單元。通常當你在一個範圍上使用For Each
循環時,你會發現自己迭代了一個範圍的行或者一行的單元格。
爲什麼不只是添加一個總行並使用公式來填充它? – jsheeran