2017-01-09 32 views
1

現在、ExcelでVBAでデータを正規化しようとしています。したがって、私のワークブックはいくつかのcsvファイルをインポートし、異なるワークシートでそれらを書きました。それらのすべてがこのように構築されています。VBA(Excel)でデータを高速化する高速方法

  • 最初の行(プロットする)をX軸
  • n番目の列の第2の列:ヘッダー
  • 第1の列y値

今は2からすべての列を正規化します〜n(各列の最大値で割る)。ここに私がこれまで使用している関数は次のとおりです。

Sub NormalizeData(dataName) 

cs = Worksheets(dataName).UsedRange.SpecialCells(xlCellTypeLastCell).Column 
rs = Worksheets(dataName).UsedRange.SpecialCells(xlCellTypeLastCell).Row 

For col = 2 To cs 
    maxValue = Application.WorksheetFunction.Max(Worksheets(dataName).Columns(col)) 

    For r = 2 To rs 
     Worksheets(dataName).Cells(r, col) = Worksheets(dataName).Cells(r, col)/maxValue 
    Next r 
Next col 
End Sub 

このアプローチは機能しますが、データ量が非常に遅いためです。速度を上げる方法はありますか?私はすでに画面の更新を切り替えました。

ご協力いただきありがとうございます。

答えて

2

は、矩形範囲の数を正規化したサブあります。

Sub NormalizeRange(R As Range) 
    'assumes that R is a rectangular range 
    'will throw an error if any column has max 0 

    Dim vals As Variant, maxes As Variant 
    Dim i As Long, j As Long, m As Long, n As Long 

    m = R.Rows.Count 
    n = R.Columns.Count 
    ReDim maxes(1 To n) 

    With Application.WorksheetFunction 
     For i = 1 To n 
      maxes(i) = .Max(R.Columns(i)) 
     Next i 
    End With 

    vals = R.Value 
    For i = 1 To m 
     For j = 1 To n 
      vals(i, j) = vals(i, j)/maxes(j) 
     Next j 
    Next i 
    R.Value = vals 
End Sub 

これはそれがなく、バルク転送にスプレッドシートやVBAの間の値を移動するので、あなたが現在持っているものよりも効率的になります:あなたは正常化し、このサブにその範囲を渡したい及ぶものに決定することができます多数の個々の読み取り/書き込みを介して行われる。また、スクリーン更新の問題や、これらの値に応じた関数の中間再計算などのことも避けています。

+0

あなたのサブのためにジョン・コールマンに感謝します。それはこれまでのところ素晴らしいです。あなたのアプローチとJanBのアプローチの利点は、空のワークシートは必要ないということです。 – Stefan

3

別のシートとPasteSpecialを使用してください。 WS1は、あなたのデータとWS2が含まれていると仮定すると、現在使用されていない。ここで

with ws2.Range(.Cells(2,2), .Cells(rs, cs)) 
    .value = maxValue 
    .copy 
end with 
ws1.Range(.Cells(2,2), .Cells(rs, cs)).PasteSpecial _ 
Operation:=xlPasteSpecialOperationDivide 
Application.CutCopyMode = False 
+0

は、ここで私はそう自分自身を停止し、私は彼がすべてのファイルのための複数のワークシートを使用してリストを見... xlDivideを掲示について考え、それは彼が持っていたものよりも高速になるかどうかわかりませんでした。 – Cyril

+0

ありがとう、私はあなたと@ジョンコールマンのサブと小さなテストスクリプトを書いて、それは正常に動作します。後でそれをテストするために私のプロジェクトに実装するつもりです。 JanB:小さな発言が1つあり、xlPasteSpecialOperationDevideにタイプミスがあります。 – Stefan