2017-02-21 4 views
0

配列に精通している人にとっては簡単に答えてくれることを願っています。(1)値を持つダイナミックアレイ - VBA Excel

私は、スペースで区切られたさまざまな数のリストを持つ単一の列を持っています。私は数字を追加するプログラムを持っています。それが空のセルに当たったら、その数を配列に追加し、配列内のスペースの数を(1)だけ増やし、合計カウンターを0に戻し、そのループの次の反復にスキップする必要があります。それが再び空間に当たるまで数え始めます。時間がたつにつれて、さまざまな量のリストが存在します。 3-4以上はあるとは思いませんが、それ以上のことがあればそれを処理するようにプログラムしたいと思います。

ので、例えば、細胞はC4:C10が200まで追加番号が含まれ、その後、セルC11は空です。セルC12:C14には150までの数字が含まれています。私は最初のスポットに200を格納し、2番目のスポットに150を格納したいと思います。それから、メッセージボックスに "List 1 is 200"、List 2 is 150 "などのポップアップが表示されます。

今、私は下付き文字を外に出していますが、私は配列の大きさを宣言していませんでしたが、ダイナミックであることを望みますが、配列に(1)スロットのみを含める方法はわかりませんでしたが、常にarr(0〜1)のようなものです。私が見ている例では単一の値しか見ていないし、forループになっているので、もし私がuboundへの束縛のループをしたら、 "List 1 is 200"、 "List 2 "リストが1つだけの場合はデータがないので、2番目の値は無価値です"

私はこれを考えすぎているか間違った方向に行っているかもしれませんが、私はこのプログラムに役立つと思う。あなたが提供できるお手伝いをありがとう。

私は以下の混乱を提供します。私はこれをきれいにしておらず、コメントしていますが、質問があるかどうか尋ねることができます。私はそれが間違っていると確信しています、私はちょうどあなたに私が行くつもりのアイデアを与えようとしています。

Private Sub cmdTest_Click() 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim intCounter As Integer 
    Dim intValue As Integer 
    Dim strCell As String 
    Dim arr() As Long 
    Dim intArr As Integer 

    Set wb = Application.Workbooks("ListTotal.xlsm") 
    Set ws = wb.Worksheets("Main") 

    Call LastRowWithData_xlUp_1(lastColRow) 

    MsgBox "Number of lists is: " & WorksheetFunction.CountIf(Range("C3:C" & lastColRow), "") + 1 

    Call FindLastRow(LastRow) 

    'Count pages left in each series 
    intValue = 0 

    'set number of values in array 
    intArr = 1 

    For i = 3 To LastRow 

      strCell = "C" & i 

     If Range(strCell) = "" Then 
      arr(0) = intValue 
      intValue = 0 
      GoTo NextIteration 
     End If 

       openingParen = InStr(Range(strCell), "[") 
       closingParen = InStr(Range(strCell), "]") 
       enclosedvalue = Mid(Range(strCell), openingParen + 1,    closingParen - openingParen - 1) 
       intValue = intValue + enclosedvalue 
       MsgBox "The number of pages in this book is: " & enclosedvalue 

     NextIteration: 
     MsgBox "The total pages left in the series is: " & intValue 

    Next 

    For i = LBound(arr) To UBound(arr) 
     MsgBox ("The number of pages left in Series " & j & " is:") 'arr(i)) 
    Next i 

End Sub 
+0

配列のサイズを変更する必要があるようです。 'Redim'を使ってこれを実現できます。 'Redim Arr(99)'のようなものは、1次元の配列100の空の要素の大きさになります。各列に十分なスペースが必要ですか?もしそうなら、LastRowを使うことができますが、どこに宣言されているのか分かりません。 –

+0

ちょっとライアン。はい、私はそれをサイズ変更する方法を見ました。私はRedim Preserve Arrを使うことができました。私は各行を保存していません。私は各リストを集計し、合計を配列に保存しています。アイデアは配列全体をループして各合計を表示できるということでした。だから私が3つのリストを持っていたなら、私は配列のuboundを取得し、j = 1からuboundまで言うことができる。msgbox "合計は:"&arr(j)。 – Dalton

答えて

0

私が使用するアプローチは、配列ではなく辞書にデータを格納することです。辞書を使用して

は、キーに基づいて検索を実行するために、高速になり、そしてあなたが一意に合計を識別したい、ほぼ何でも鍵を作ることができます。これは、配列内のインデックス番号よりも象徴的で理解しやすい(おそらく)と思われます。

シート私は(Sheet1の)テストのように設定しました:イミディエイトウィンドウで

Option Explicit 

Public Sub Example() 
    Dim myDict As Object: Set myDict = CreateObject("Scripting.Dictionary") 
    Dim i As Long 

    'Add data to a dictionary 
    With myDict 
     'the first parameter is a unique key that identifies the record 
     'the second parameter is the value 
     'Remember to change the range reference 
     .Add "the Range A1:A5", WorksheetFunction.Sum(Range("Sheet1!A1:A5")) 
     .Add "the Range B1:B5", WorksheetFunction.Sum(Range("Sheet1!B1:B5")) 
     .Add "the Range C1:C5", WorksheetFunction.Sum(Range("Sheet1!C1:C5")) 
    End With 

    'Iterate the dictionary and return the key and value 
    For i = 0 To myDict.Count - 1 
     Debug.Print "The sum is: " & myDict.items()(i) & " for Key: " & myDict.keys()(i) 
    Next i 
End Sub 

結果::

The sum is: 6 for Key: the Range A1:A5 
The sum is: 5 for Key: the Range B1:B5 
The sum is: 12 for Key: the Range C1:C5 

Spreadsheet

ここではサンプルコードがあります

+0

Ryan、私の範囲は可変です。リストの長さは異なります。 – Dalton

+0

範囲も変数にすることができます。 –

関連する問題