2017-01-03 6 views
0

次のコードがあります。どちらがうまくいきましたが、今はエラーが発生しています。 「実行時エラー '7:メモリ不足」以下は私のコードですメモリ不足エラー - データのソート時

Sub SpiltData() 

Dim tmpArr As Variant, rCell As Range, v, i As Long, v2(), J As Long, K As Long 
Dim ws1 As Worksheet, ws2 As Worksheet, n As Long 

ThisWorkbook.Sheets("Data").Activate 

Set ws1 = ActiveSheet 
Set ws2 = Sheets("Hours Sorted") 'You need to specify a sheet here 

v = ws1.Range("J6").CurrentRegion.Value 
ReDim v2(1 To UBound(v, 1) * 100, 1 To UBound(v, 2)) 
n = 1 

For i = LBound(v, 1) To UBound(v, 1) 
tmpArr = Split(v(i, 10), Chr(10)) 
For K = 0 To UBound(tmpArr) 
    For J = LBound(v, 2) To UBound(v, 2) 
     v2(n, J) = v(i, J) 
    Next J 
    v2(n, 10) = tmpArr(K) 
    n = n + 1 
Next K 
Next i 

ws2.Range("A1").Resize(n, UBound(v2, 2)) = v2 

End Sub 

私は別のことができるのでしょうか?

+0

あなたはこの 'UBound(v、1)* 100'が必要ですか?あなたが異なって行うことができるいくつかのことは、 'Redim Preserve v2()'を使用することです.2次元だけを再描画できるという問題がありますが、v2内の次元を逆にし、最後に 'ws2 ' –

答えて

0

あなたが巨大な選択肢から始まり、配列の10位の区切り文字で区切られたデータが大きい場合は、「巨大x大」の結果が得られます。すべてがメモリに保存されていますws2

また、範囲を繰り返し処理して、値に合わせて書き出すこともできます。変数を細かくして、おそらくコードを理解してデバッグするのが簡単です。この作業を迅速に行うには、application.screenupdatingトグルをオフにすることができます。それはする必要がある場合

Sub SpiltData() 
    Dim rngRead As Range 
    Dim rngReadRow As Range 
    Dim rngReadCell As Range 
    Dim arrSplit As Variant 
    Dim intWriteRow As Integer 

    'initialize intWriteRow 
    intWriteRow = 1 

    'get that range 
    Set rngReadRow = Sheets("Data").Range("J6").CurrentRegion 

    'loop through each row 
    For Each rngReadRow In rngReadRow.Rows 

     'split your carriage return delimited cell into an array 
     arrSplit = Split(rngReadRow.Cells(1, 11), Chr(10)) 

     'iterate the array and write out 
     For Each arrItem In arrSplit 

      'by iterating each cell in the readrow 
      For Each rngReadCell In rngReadRow.Cells 

       'and writing it to the other worksheet 
       Sheets("Hours Sorted").Cells(intWriteRow, rngReadCell.Column).Value = rngReadCell     

       'increment the row to which we are writing 
       intWriteRow = intWriteRow + 1 

      Next rngReadCell 

     'and now write the split out value in the array 
     Sheets("Hours Sorted").Cells(intWriteRow, 11) = arrItem 

     Next arrItem 
    Next rngReadRow 

End Sub 

これはおそらく私が範囲に配列から変換され、いくつかの仮定をしたので、小さなビットを微調整する必要がありますが、それは球場であなたを取得し、優れますが一日中これにクランクします主な制限は、ラムの代わりにExcelの行数です。