2017-02-21 11 views
-5

あなたが助けてくれることを願っています!VBAをソート順に並べ替える - 平均に基づいて

私はこのようなリストを持っている...

 

Item Value 
Prod_1 0.22 
Prod_2 0.30 
Prod_3 0.23 
Prod_4 0.22 
Prod_5 0.28 
Prod_6 0.23 
Prod_7 0.22 
Prod_8 0.28 
Prod_9 0.24 

これら3つの項目の平均が降順にソートされる必要があるであろうので、私は3人の中のグループにそれらを望む..

親切に下記を参照してください..私は後でそれらをソートすると思います... -

はここでの課題は、使用する必要のある組み合わせを知ることです!

これは私が取得したいものです。..

 


Name Value Average 

Prod_1 0.22 0.2500000 
Prod_2 0.30   
Prod_6 0.23   

Prod_9 0.24 0.2466667 
Prod_5 0.28   
Prod_7 0.22   

Prod_4 0.22 0.2433333 
Prod_8 0.28   
Prod_3 0.23   

現在、私は.. 9つのアイテムを持っているが、これはn個となり、常に3のグループにあることが必要となります。 。

私は他の方法を試してみました..しかし、成功しませんでした。..

+1

あなたが試したことをvba codeとtellusを追加してください。どのようにトリプレットをグループ化するべきかは明確ではない – dlatikay

+0

リスト?あなたのシート上の範囲、またはバリアント配列変数、または...?コードを入力してください。 – trincot

+0

正直なところ私は初心者です - 論理をどのように開始するかわかりません - パーミュテーションとコンビネーションVBAを見ていました - そして、その特定のシートの範囲 – Shyam

答えて

0

をあなたは10に列A、列2に製品名を入れた場合、すなわち、Prod_1など、およびそのcorrespondiを置きます列 "B"行2〜10の値を指定すると、このサブルーチンはあなたの例が明示的に求めていることを行います。 VBAスクリプティングがどのように機能するかを知るのに役立ちますので、新しいニーズが発生したときに後で修正することができます。

コード内には、作成されている2つの配列originalArrayがあります。これは多次元配列です。それは名前と値の2つのデータを保持する9つの項目を持っています。行2から行10に向かうループで満たされ、各行のデータを配列の新しい行に集めます。

次に、あなたは分離した要素の配列を持っていますか、グループを3つに分割する方法です。これは多次元配列ですが、一度に初期化して定義します。

"For"ループが追加され、 "E"と "F"列にグループを3つ配置し、その平均を列 "G"に入れます。次に、行をスキップして3の次のグループを実行し、行をスキップして3の最後のグループを実行します。

コードを慎重に調べたり、F8キーを使用してステップを進めると、コードは上から下へ -

Sub getAvgs() 
Dim origArray(1 To 9, 1 To 2) 
Dim varData, rowCounter As Long, averager As Double 

    For i = 1 To 9 
     origArray(i, 1) = Sheet1.Range("A" & i + 1).Value 
     origArray(i, 2) = Sheet1.Range("B" & i + 1).Value 
    Next i 

    varData = [{1, 2, 6; 9, 5, 7; 4, 8, 3}] 


    rowCounter = 3 
    Columns("G:G").Select 
    Selection.NumberFormat = "0.00000" 
    Columns("E:G").ColumnWidth = 12 
    Sheet1.Range("E1").Value = "Name" 
    Sheet1.Range("F1").Value = "Value" 
    Sheet1.Range("G1").Value = "Average" 


    For i = 1 To 3 
     For f = 1 To 3 
      Sheet1.Range("E" & rowCounter).Value = origArray(varData(f, i), 1) 
      Sheet1.Range("F" & rowCounter).Value = origArray(varData(f, i), 2) 
      averager = averager + origArray(varData(1, f), 2) 
      rowCounter = rowCounter + 1 
     Next f 
     Sheet1.Range("G" & rowCounter - 3).Value = averager/3 
     averager = 0 
     rowCounter = rowCounter + 1 
    Next i 

End Sub 
+0

ありがとうジョン..良い見えます.. – Shyam