既存のリストを2つの配列にキャプチャし、少なくとも$ 500を費やした顧客に費やした顧客名と金額の新しい配列を2つ作成する必要があります。これらの新しい配列が塗りつぶされた後、列DとEに書き込む必要があります。VBAファイリングアレイと列の作成
したがって、列1はA3:A50に由来し、これは顧客名が で、列2は売上高がC3:50です顧客が購入する価格。
配列を並べ替えるコードの部分を書くのに問題があり、販売価格が500ドルを超えているかどうかを判断しています。誰かが私がどこに間違っているかを指摘できますか?
これは私がこれまで持っているものですが、それは動作しません:
Sub ProductSales()
' These are inputs: the number of customers, the customer's name,
' and the dollar amount of each sale.
Dim nCustomers As Integer
Dim namesData() As String
Dim dollarsData() As Integer
' The following are outputs: the customer name found over 500, and the number
'of customer over 500
Dim customerFound() As String
Dim customerCount() As Integer
' Variables used in finding if sale is over 500
Dim isOver As Boolean
Dim nFound As Integer
' Counters.
Dim i As Integer
Dim j As Integer
' Clear any old results in columns E to G.
With wsData.Range("E2")
Range(.Offset(1, 0), .Offset(0, 2).End(xlDown)).ClearContents
End With
' Find number of customers in the data set, redimension the namesdata and
' dollarsData arrays, and fill them with the data in columns A and C.
With wsData.Range("A2")
nCustomers = Range(.Offset(1, 0), .End(xlDown)).Rows.Count
ReDim namesData(1 To nCustomers)
ReDim dollarsData(1 To nCustomers)
For i = 1 To nCustomers
namesData(i) = .Offset(i, 0).Value
dollarsData(i) = .Offset(i, 2).Value
Next
End With
' Initialize the number of names found to 0.
nFound = 0
' Loop through all sales.
For i = 1 To nCustomers
' Set the Boolean isOver to False, and change it to True only
' if the sale is over 500
isOver = False
If nFound > 0 Then
' Loop through all customer names already found and add to new list
' and exit loop
For j = 1 To nFound
If dollarsData(i) > 500 Then
isOver = True
customerCount(j) = customerCount(j) + 1
Exit For
End If
Next
End If
If isOver Then
' The current product code is a new one, so update the list of
' codes found so far, and initialize the transactionsCount and dollarsTotal
' values for this new product.
nFound = nFound + 1
ReDim Preserve customerFound(1 To nFound)
ReDim Preserve customerCount(1 To nFound)
customerCount(nFound) = namesData(i)
customerCount(nFound) = 1
End If
Next
' Place the results in columns E to G.
For j = 1 To nFound
With wsData.Range("E2")
.Offset(j, 0).Value = customerFound(j)
.Offset(j, 1).Value = customerCount(j)
End With
Next
End Subの
ニースの迅速な解決を開始...しかし、 'Application.Coutif(ws.Range( "C3:C50")、 "> = 500")を実行していることがあり、'あなたの行数を与えます。この方法で、コレクション部分全体をスキップして、見つかった行を直接入力することができます。 ;) –
@DirkReichel、はい、 'CountIf'関数はサイジングに適しています。 'CountIf'がすべての値を反復し、新しい配列に値を書き込む際にもすべての値が反復され、true/falseアルゴリズムが両方の時間に実行されなければならないので、避けます。 'Collection'オブジェクトを使うことで、完全な反復と真偽チェックは一度だけ起こります。 2回目の反復は「真の」細胞にのみ起こります。 'CountIf'はまだ言及する価値があるので、ありがとう。 – Ambie