VBAmacros添加列

试图创build一个VBAmacros,它将一个列添加到和,然后再次按下button时,继续添加下一列的总和。

我有下面的代码如下。 目前它将添加第一列,但似乎失去了整数值,只是覆盖自己。

另外我有问题搞清楚我将如何保存列字母,而不是列号。 任何帮助将是伟大的!

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 

你在这里有一个非常好的开始。

类似于以下内容的内容与您开始的内容非常接近,应该这样做:

 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循环遍历集合中的For Each

循环遍历工作簿中每个工作表的示例:

 Sub test() Dim sht as Worksheet For Each sht in ThisWorkbook.Sheets msgbox(sht.name) Next sht End Sub 

第二:不是select一个单元格,而是获得该单元格的属性(就像是行),可以直接进入该属性。

所以,而不是:

 Cells(1,2).Select myVar = Selection.Row 

你可以做:

 myVar = Cells(1,2).Row 

如果你发现自己使用。select或。 .Activate那么你可能做错了什么。 人类。select和.Activate ,但电脑并不需要。 这是浪费,会导致你的代码中的一些奇怪的行为。 尽pipe…有时这是有道理的。 如果您的要求是:

“我想总结用户在按下button时select的行中的所有数字”

那么selectedCell = Selection会很有意义。

或者,相反,如果你的要求是:

“子程序完成后,我想单元格A1被选中”

然后Sheet1.Range("A1").Select是要走的路。 但是,您可以看到在这两个实例中,这是由于我们需要与用户进行交互,因此我们使用了Selection对象的Range属性和Select()方法。

第三:你可以通过访问它的.Address属性来获取范围对象的地址。 所以没有必要用列字母猴子。 只需打上.Address ,它就会.Address出来。

第四:提交之后我添加了这个,但这很重要,也很混乱。 CellsRangesRowsColumns都是Range同义词。 所以,你可以遍历row每个cells ,或者一column每一rows或一个range每一columns中的每一rows 。 在这个解决scheme中,我们遍历row中的cell ,其中cell就是一个range() ,它是…单个单元格。 通常当你在一个范围上使用For Each循环时,你会发现自己迭代了一个范围的行或者一行的单元格。