2016-03-29 3 views
0

私が持っている配列をループしようとしています。まず、行2、列2(約1000行×100列)で始まるスプ​​レッドシートデータから配列を作成します。配列を定義した後、各列を別々のデータセットとして扱い、最大値と最大値の行番号を見つけ、別々の配列に格納します。このコードを実行すると、0の値の列が返されます。それはどんなエラーも出さないが、それは明らかに動作していない、任意の提案ですか?デフォルトではVBAで配列をループする

Public Maxindex() As Long 

Public MaxVal() As Double 

Sub ArrayOptimized() 
'Uses arrays to call data from the sheet once then process it 

    Dim dataset() As Variant 
    Dim rows As Long 
    Dim columns As Integer 

    ReDim Maxindex(100) 
    ReDim MaxVal(100) 
    MaxVal(1) = 1 

    rows = ShData.Cells(ShData.rows.Count, 1).End(xlUp).Row 
    columns = ShData.Cells(1, ShData.columns.Count).End(xlToLeft).Column 
    ReDim dataset(2 To rows, 2 To columns) 
    dataset = ShData.Range(ShData.Cells(2, 2), ShData.Cells(rows, columns)) 
    'Check to sheet 

    Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(rows, columns)) = dataset 


    For i = LBound(dataset, 2) To UBound(dataset, 2) 

     For j = LBound(dataset, 1) To UBound(dataset, 1) 
      If dataset(j, i) > MaxVal(i) Then 
      MaxVal(i) = dataset(j, i) 
      'Returns row index number in array for max val 
      Maxindex(i) = j 
      End If 

     Next j 

    Next i 

    Sheet2.Range(Sheet2.Cells(1, 1), Sheet2.Cells(columns, 1)) = Maxindex 

End Sub 
+1

私は答えを書いていたが、ティムがそれに私を打ちます。インデックス1に値を入力し始めただけで、ゼロから始まる最大値の配列の最初の要素が得られます。データセットのラバウンド。さらに、 'ReDim dataset(2 To rows、2 To Columns)'は何もしません。次の行では、暗黙的なデフォルト値でデータセットに値を割り当てるからです。 – Jeeped

+0

私もそれを打ち負かす - 私は 'ReDim Maxindex(1 To columns)'と 'ReDim MaxVal(1 To columns)'を固定値の代わりに使うことも考えています。 – Comintern

+0

@Jeepedしたがって、値を割り当てる前に配列サイズをsepcifyする必要はありませんか? – Duranchula

答えて

2

は、Excelはない列に、にシート上の1次元配列を配置したいので、あなたがそれを置くしようとすると、各セルの配列の最初の要素を取得します列で。

1次元配列がゼロベースであり、ループ内にそのスロットを設定しなかったため、すべての値はゼロです。

あなたは、列にあなたの配列を「フリップ」する転置を使用することができます。

Sheet2.Range(Sheet2.Cells(1, 1), Sheet2.Cells(columns, 1)) = _ 
    Application.Transpose(Maxindex)