2016-04-18 4 views
0

私は大きなテーブルをピボットテーブルに入れましたが、ユニークなカウントを取得したいので、1の側にヘルパーカラムを設定しようとしています/ユニークカウント、ピボット、それは私が持っている式はバック1に要約して:(B2:B460489、B2、I2:I460489、I2)VBA Counties over 500k Rows

1/COUNTIFS

これは動作するはずですが、以来私は計算するために年齢を取っているほぼ500kの行を持っています。私はVBAで計算をやろうとしていましたが、速くなることを期待していましたが、終了する前に10分以上かかりました。

この計算を管理しやすくするにはどうすればよいですか?

配列を使用するという考えに基づいて、テーブル内の各行について、ストア/製品がテーブル全体で何回発生したかを知る必要があるため、以下のコードをダブルループを使用して作成しました。まだまだ遅いですが、それをより効率的にすることは可能でしょうか?

arr = Sheets("Data").Range("A2:AH" & lr) 

ReDim Arr2(UBound(arr) - 1, 0) 

For i = LBound(arr) To UBound(arr) 
    Ans = 0 
    For j = LBound(arr) To UBound(arr) 
     If arr(j, 2) = arr(i, 2) And arr(j, 9) = arr(i, 9) Then 'And arr(j, 33) = 1 Then 
      Ans = Ans + 1 
     End If 
    Next j 
    If Ans > 0 Then 
     arr(i, 34) = 1/Ans 
     Arr2(i - 1, 0) = arr(i, 34) 
    End If 
Next i 

Sheets("Data").Range("AH2:AH" & lr) = Arr2 
+0

*何*のユニークな数ですか?あなたがVBAの解決に向かう場合は、ヘルパー列を捨てて問題をより直接的に記述してください。 –

+0

私は1週間に店頭に在庫があるシートを持っています。 B列は店舗、I列は商品です。ピボットテーブルの残りの計算で、その数式の合計が1に戻るように、ヘルパー列が必要です。 数式が1/Countifs(店舗、特定の店舗、製品、特定の製品)であることによって 製品が私のテーブルの13週間のデータすべての店舗にある場合、数式は1/13になり、ピボットではすべて1に戻って合計する必要があります。 –

+0

VBAで行います。計算するすべての行を配列に貼り付け、配列を計算して答えを投稿します。シートから読み込むのではなく、メモリで処理することで、プロセスが大幅に高速化されます。 – Tom

答えて

0

これを達成するために配列を使用する方法の例。私はあなたが記述したものに似た4列を使用しましたが、正確ではないので少し変更する必要があります。何が起こっているのかをより明確に説明できる場合は、必要に応じてこれをあなたの問題に正確に反映させることができます。

Example Layout

Option Explicit 
Sub Example() 
    Dim ans As Integer, i As Integer 
    Dim arr() as variant 

    arr = Range("B2:J8") 

    For i = LBound(arr) To UBound(arr) 
     If arr(i, 2) = 1 And arr(i, 9) = "Fruit" Then 
      ans = ans + 1 
     End If 
    Next i 

    If ans > 0 Then 
     MsgBox 1/ans 
    Else 
     MsgBox "Division by 0 error" 
    End If 
End Sub 

このコードは、あなたがあなたに合わせて範囲を変更する必要があります(配列にあなたの範囲を設定します。私は、他の計算の場合には、配列の中にあなたの全体のusedrangeを置くことをお勧めしたいですあなたがしたいと思うもの)。 if条件に一致する場合、配列の各エントリをテストします。カウントに1を加算します。

+0

これはうまくいくと思いますが、配列全体の各商品/店舗の数を知りたいのでダブルループを作成する必要がありました。私は今まで持っていたコードで質問を更新しました –

+0

今はどれくらいかかりますか? – Tom

+0

これは10分間実行され、その後Excelがクラッシュしました。私は数分後にこれを行う方法を見つけることを望んでいましたが、おそらくそれは不可能でしょうか? –