2016-08-25 42 views
0

我需要以編程方式格式化Excel表格,這個表格基於兩個指定列中的值的更改創建兩個不同的小計(第一個和第二個電子表格)。創建一個帶有數據上面的小計的行,通過VBA中的數組添加一個循環

我設法編寫了第一個小計的例程,但我現在試圖弄清楚代碼的第二部分。

在第二個例程中,我需要在將要添加的數據上方創建小計行。我無法設法將計算插入到正確的行中,並且在通過數組中包含的列進行循環時出現問題。

任何人都可以看到我做錯了什麼?

謝謝

Public Sub SubtotalTable() 
Dim RowNumber As Long 
Dim RangePointer As Range 
Dim RangeTopRow As Range 

'Pointing the column to check 
Set RangePointer = ActiveSheet.Range("B1") 

'Assigning the first row to a range 
Set RangeTopRow = Rows(2) 

'Assigning to long a variable the number of row from which begin checking 
RowNumber = 3 

Do 
    If RangePointer.Offset(RowNumber).Value <> RangePointer.Offset(RowNumber - 1).Value Then 
     Set RangeTopRow = Rows(RowNumber) 
     'Call the function to insert the row 
     Call InsertRowTotalsAbove(RangePointer.Offset(RowNumber), RangeTopRow, RowNumber)   
    Else 
     RowNumber = RowNumber + 1 
    End If 
     RowNumber = RowNumber + 1 
    Loop 
End Sub 

Public Function InsertRowTotalsAbove(RangePointer As Range, lastRow As Range, RowNumber As Long) 
Dim ArrayColumns() As Variant 
Dim ArrayElement As Variant 
Dim newRange As Range 

'Assigning number of columns to an array 
ArrayColumns = Array("D", "E", "F", "G") 

Do 
    If RangePointer.Offset(RowNumber).Value = RangePointer.Offset(RowNumber - 1).Value Then 
     RowNumber = RowNumber - 1    
    Else 
     ActiveSheet.Cells(RowNumber + 1, 2).Select 
     Set newRange = Range(ActiveCell, ActiveCell.Offset(0, 0)) 
     Rows(newRange.Offset(RowNumber + 1).Row).Insert shift:=xlDown 
     newRange.Offset(RowNumber + 1, 0).Value = "Totale" & " " & newRange.Offset(RowNumber + 2, 0)   
     For Each ArrayElement In ArrayColumns 
      newRange.Cells(RowNumber, ArrayElement).Value = Application.WorksheetFunction.Sum(Range(lastRow.Cells(-1, ArrayElement).Address & ":" & RangePointer.Cells(0, ArrayElement).Address)) 
     Next ArrayElement 
    End If  
Loop 

End Function 
+0

你究竟是什麼意思,「有什麼問題」? – arcadeprecinct

+0

不看看你的數據,我問你:格式化好嗎?如果你格式化你的數據,所以你可以使用Excel的表格,它更容易操作,另外還有一個內置的小計行。就這段代碼而言,它會給你一個錯誤嗎?如果是這樣,哪一行? – SandPiper

+0

@arcadeprecinct計算被移動一列。不是從「D」開始,而是從「E」開始,結果也不正確,我不明白是什麼加起來的。 – Davide

回答

0

我覺得這是你的第一個問題(轉移)的原因。清理代碼後,第二個問題(錯誤的值)希望能夠清楚。

ActiveSheet.Cells(RowNumber + 1, 2).Select 
Set newRange = Range(ActiveCell, ActiveCell.Offset(0, 0)) 

首先,在一般情況下不會使用select,因爲它是難以調試,並可能導致顯著的性能問題。但是在這種情況下,這不會導致你的問題。

newRange現在是細胞Cells(RowNumber + 1, 2),即在B列(這是太複雜順便說一句,爲什麼不這樣做在一行Set newRange = ActiveSheet.Cells(RowNumber + 1, 2)?)

無論如何,當你以後有

newRange.Cells(RowNumber, ArrayElement).Value 

該列相對於newRange。由於newRange是B列中的一個單元格,因此newRange.Cells(RowNumber, "A")將列在B列中,依此類推。

我的建議是使用列索引,並通過從列索引中減去1來調整1的偏移量。但是,您應該嘗試使用較少的間接引用來清理代碼。例如,如果知道實際的行號,則使用less OffsetRows(newRange.Offset(RowNumber + 1).Row簡直就是Rows(2 * RowNumber + 1)

相關問題