2017-07-27 16 views
1

この質問は複雑です(私は感じます)。問題を説明するために最善を尽くします。列の合計Excel VBA

本質的には、範囲内の各列を下に移動し、各セルの値を加算して(列の合計を求めて)配列に追加します。しかし、配列に保持されている値をテストするときは、常に0になります。これを行うより良い方法はありますか?

Dim sumHoldings(1 To 36) As Double 
k = 1 

For Each rep In repNames 

    If rep <> vbNullString Then 
    Worksheets(rep).Activate 
    Dim i As Integer 
    Dim sumHolder As Double 

    For i = 3 To 6 

     Columns(i).Select 

     For Each rangeCell In Selection 

      If rangeCell <> vbNullString Then 

       sumHolder = rangeCell.Value + sumHolder 

       Else: 
        sumHoldings(k) = sumHolder 'this current method will keep overwriting itself 
        k = k + 1 
        Exit For 

      End If 

     Next rangeCell 
    Next i 
    End If 
Next rep 
相続

私がやろうとしています何の視覚的な表現:

はここに私の現在のコードである enter image description here

enter image description here

すべてのヘルプは大歓迎です、ありがとうございました!

答えて

2

これはあなたがする必要があります。

Option Explicit 

Public Sub TestMe() 

    Dim myRng  As Range 
    Dim myCell  As Range 
    Dim myCol  As Range 
    Dim arrResults As Variant 
    Dim dblSum  As Double 
    Dim lngCounter As Long 


    Set myRng = Range("R17:T25") 
    ReDim arrResults(myRng.Columns.Count -1) 

    For Each myCol In myRng.Columns 
     dblSum = 0 
     For Each myCell In myCol.Cells 
      dblSum = dblSum + myCell 
     Next myCell 
     arrResults(lngCounter) = dblSum 
     lngCounter = lngCounter + 1 
    Next myCol 

End Sub 

配列arrResultsは各列の合計を取得します。 Set myRng = Range("R17:T25")を意味のあるものに編集してください。

コードは、記述したとおりに動作します。つまり、myRng.Columnsを使用して範囲内の各列を取り、それを反復処理します。次に、各セルをmyCol.Cellsに入れ、それをもう一度繰り返します。したがって、複雑さはO2です。

+0

'dblSum = dblSum + myCell.Value' –

+0

@RafaelMatos - ' .Value'が必要とされていない、それは同様にW/Oそれは動作します。 – Vityata

+0

私はコードをテストしませんでしたが、あなたがそう言っても大丈夫です。 –

0

ゼロが得られるのは、ifステートメントが何もないときにnullセルを配列に格納させるためです。ただ、すべてのセルの後に記憶部を移動総括されています

For Each rangeCell In Selection 

If rangeCell <> vbNullString Then 

sumHolder = rangeCell.Value + sumHolder 

End If 

Next rangeCell 
    sumHoldings(k) = sumHolder 
    k = k + 1 
Next i 
End If