2016-05-26 7 views
0

すでに定義されている配列をループして500を超える値を見つけるのに問題があります。私の下付き文字が範囲外です。VBA配列とループ

これはこれまで私が行ってきたことです。誰かが私に2番目の部分を修正するのを助けることができるので、すでに確立されている配列を適切にループします。

Sub hishSale() 

    Dim customers() As String 
    Dim sale() As String 
    Dim hiCustomer() As String 
    Dim hiSale() As String 
    Dim nCustomers As Integer 
    Dim i As Integer 
    Dim isOver As Integer 


    'capture the number of customers and sales and put them in two seperate arrays 
    With wsData.Range("A3") 
     nCustomers = Range(.Offset(1, 0), .End(xlDown)).Rows.Count 
     ReDim customers(nCustomers) 
     ReDim sale(nCustomers) 
     For i = 1 To nCustomers 
      customers(i) = .Offset(i, 0).Value 
      sale(i) = .Offset(i, 1).Value 
     Next 
    End With 

'Loop through arrays to find sales over $500 

    With Range("A3") 
    isOver = 0 
     For i = 1 To nCustomers 
      If .Offset(i, 1).Value > 500 Then 
       isOver = isOver + 1 
       hiCustomer(isOver) = .Offset(i, 0).Value 
       hiSale(isOver) = .Offset(isOver, 1).Value 
      End If 
     Next 
    End With 

    'return results in columns D and E 
    With Range("D3") 
     For i = 1 To nCustomers 
     .Offset(i, 0) = hiCustomer(isOver) 
     .Offset(i, 1) = hiSale(isOver) 
     Next 
    End With 

End Sub 
+0

ループを行うには 'lbound(customers())をubound(customers())に' – findwindow

+0

最後のループで 'hi'と' hiSale'に 'i'を使うことを意図していましたか?あなたは 'isOver'を使用しています。その値はこの時点で固定されています –

+0

正確にどの行にエラーがあるのか​​を指定する必要があります... –

答えて

1

そうしながら、私は、問題はあなたがhiCustomer OR hiSale寸法を記入しませんでした、あなたの配列が大きくあることについて散歩その後、必要に応じて、大きな記述を書き始め、それらがどのようにゼロのベースを持っています。

変更この: - これに

'Loop through arrays to find sales over $500 
With Range("A3") 
isOver = 0 
    For i = 1 To nCustomers 
     If .Offset(i, 1).Value > 500 Then 
      isOver = isOver + 1 
      hiCustomer(isOver) = .Offset(i, 0).Value 
      hiSale(isOver) = .Offset(isOver, 1).Value 
     End If 
    Next 
End With 

: - :

​​

-

ReDim hiCustomer(0) 
ReDim hiSale(0) 
With Range("A3") 
    For i = 1 To nCustomers 
     If .Offset(i, 1).Value > 500 Then 
      ReDim Preserve hiCustomer(UBound(hiCustomer, 1) + 1) 
      ReDim Preserve hiSale(UBound(hiSale, 1) + 1) 
      hiCustomer(UBound(hiCustomer, 1)) = .Offset(i, 0).Value 
      hiSale(UBound(hiCustomer, 1)) = .Offset(i, 1).Value 
     End If 
    Next 
End With 

そして、私はそれが次のループを修正読んでいる場合にもに変化する必要があります。これまでは、> 500リストだけでなく、顧客リストを探していました。

+0

ありがとうございました!これは機能します。 Uboundを使わずにコードを書く方法はありますか? – th65

+0

@ th65はい、それはもっと長くなるでしょう。それを追加することは新しい質問です。誰かが助けてくれると確信しています。私は理由について興味があります。 –