2016-12-06 190 views
0

我有一個關於VBA的問題。如果發現並且空值,我的腳本應該通過表格停止。所以,我有2個問題,我的代碼:VBA不更改變量值

Sub BudgetKontoRechnen() 
Dim row As Long, column As String, locSum As Double, sumRow As Integer 

row = 4 
column = "A" 

Do 
    ' Point 1 
    If Len(Range(column & row).Value) = 0 Then 
     Exit Do 
    End If 
    Set sumCell = Range(column & row).Offset(0, 1) 
    sumRow = 0 
    locSum = 0 

    Do 
     sumRow = sumRow + 1 
     If Len(sumCell.Offset(sumRow, 0).Value) = 0 Then 
      Exit Do 
     End If 
     locSum = locSum + CDbl(sumCell.Offset(sumRow, 0).Value) 
    Loop 

    nextCol = Split(Range(column & row).Offset(0, 2).Address, "$") 
    column = nextCol(1) 
    ' Point 2 
    sumCell.Value = locSum 
Loop 

End Sub 

我加了一些分方向:

在點1列始終是「A」。 在第2點,它應該改變列到第二個下一列,所以當在這一點檢查列時,是說C.但在下一個循環中它再次A.我不知道爲什麼...

第二:我添加的每個代碼在最後一行(sumCell.Value = locSum)之後沒有執行。誰能解釋爲什麼?

+2

我建議你使用'細胞(行,列)'行和列的整數,而不是'範圍()',它應該更容易迭代在「Do ... Loop」中。 –

+0

奇怪,但代碼適用於我,對於錯誤的答案抱歉,已將其刪除。 – holmicz

回答

0

你的方式來組織你的代碼很奇怪。我建議您使用Cells()而不是Range()來訪問您的數據,並在Do行中移動它所屬的行的繼續測試,而不是稍後使用Exit Do

Sub BudgetKontoRechnen() 
    Dim row As Long, column As Long 
    Dim sumCell As Range 
    Dim locSum As Double, sumRow As Long 

    row = 4 
    column = 1 

    Do While Cells(row, column).Text <> "" 
     ' Point 1 
     Set sumCell = Cells(row, column + 1) 

     sumRow = 1 
     locSum = 0 

     Do While sumCell.Offset(sumRow, 0).Text <> "" 
      locSum = locSum + CDbl(sumCell.Offset(sumRow, 0).value) 
      sumRow = sumRow + 1 
     Loop 

     ' Point 2 
     sumCell.value = locSum 

     column = column + 2 
    Loop 

End Sub 

我也從.Value.Text檢查改變了測試,不知道這是否是更好的。

請注意,代碼與ActiveSheet進行交互,您可能需要明確您的工作表。

0

您的代碼可以簡化到什麼如下:

Sub BudgetKontoRechnen() 
    Dim iCol As Long 

    With Range("A4", Cells(4, Columns.count).End(xlToLeft)) 
     For iCol = 1 To .Columns.count Step 2 
      If WorksheetFunction.Trim(.Cells(1, iCol).Text) <> vbNullString Then 
       With .Cells(1, iCol + 1) 
        .Value = WorksheetFunction.Sum(Application.Transpose(.Parent.Range(.Offset(1), .Offset(1).End(xlDown)).Value)) 
       End With 
      End If 
     Next iCol 
    End With 
End Sub