2016-11-16 60 views
0

試圖創建一個VBA宏,它在一列上添加總和,然後當再次按下該按鈕時,繼續添加下一列的總和。用於添加列的VBA宏

我的代碼如下。目前它會添加第一列,但似乎失去了整數值並且只是覆蓋了它自己。

另外我有問題搞清楚我將如何保存列字母而不是列的數字。任何幫助將是偉大的!

Sub Button1_Click() 
Dim vStartRow As Integer 
Dim vEndRow As Integer 
Dim vStartCol As Integer 
Dim vEndCol As Integer 

Range("A2").Select 
ActiveCell.End(xlDown).Select 
MsgBox vStartCol 
vStartRow = 2 'Row 2 
vStartCol = ActiveCell.Column 

ActiveCell.End(xlToRight).Select 
vEndRow = ActiveCell.Row 'Row 7 

MsgBox vStartCol 
Cells(vEndRow + 1, vStartCol + 1).Formula = "=SUM(" & vStartCol & vStartRow & ":" & vStartCol & vEndRow & ")" 
Cells(vEndRow, vStartCol + 1).Select 
vStartCol = vStartCol + 1 
MsgBox vStartCol 

End Sub 

數據表的樣子:

 Year 1 Year 2 Year 3 
Chris 1   4  6 
Jimmy 1   2  7 
John 1   2  1 
Frank 1   5  3 
Fred 1   4  7 
Jodie 1   2  6 
+1

爲什麼不只是添加一個總行並使用公式來填充它? – jsheeran

回答

3

你在這裏什麼是一個非常好的開始。

類似下面的,這是非常接近你已經開始用什麼,應該做的伎倆:

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,RowsColumns都是Range的同義詞。所以......你可以遍歷cells中的每個row,或rows中的每一個columncolumns中的每一個range。在這個解決方案中,我們遍歷cellsrow,其中cell只是一個range(),它是...單個單元。通常當你在一個範圍上使用For Each循環時,你會發現自己迭代了一個範圍的行或者一行的單元格。

+0

美麗!非常感謝 :) –