2016-12-20 12 views
0

マクロは列でループし、数値データが各列から始まり、範囲をぎざぎざとした配列(コードの「行列」バリアント)に格納する範囲を見つけます。VBAギザードアレイを範囲に設定

その後、私は別のワークシートの範囲に行列全体を返したいと思います。私はそれが置かれたい範囲に "行列(1)"を割り当てようとすると、それは正常に動作しますが、範囲全体に "行列"を割り当てようとすると、空のセルが得られます。

「行列」のすべての値をループを使用せずに一度に範囲に戻すことはできますか?

これはコードがループそこを通ってソースデータ、次のとおりです。 enter image description here

私は「マトリックス」の行のすべてがこのとして返されることを希望: enter image description here

ここに私のコードです:

 Sub MyMatrix() 

     Dim wb1 As Workbook 
     Set wb1 = ActiveWorkbook 

     Dim wsNSA As Worksheet 
     Set wsNSA = wb1.Worksheets("NSA") 

     Dim wsSA As Worksheet 
     Set wsSA = wb1.Worksheets("SA") 

     Dim col As Range 

     Dim matrix() As Variant 


     'LR is the Last row and LC is the last column with data 
     LR = wsNSA.Cells(1, 1).End(xlDown).Row 
     LC = wsNSA.Cells(LR, 1).End(xlToRight).Column 

     'Loops through columns and finds the row where numeric data begins 
     For Each col In wsNSA.Range(wsNSA.Cells(1, 2), wsNSA.Cells(LR, LC)).Columns 
     wsNSA.Activate 
     nsa = wsNSA.Range(wsNSA.Cells(1, col.Column), wsNSA.Cells(LR, col.Column)) 

     num_linha = Application.Match(True, Application.Index(Application.IsNumber(nsa), 0), 0) 
     nsa = wsNSA.Range(wsNSA.Cells(num_linha, col.Column), wsNSA.Cells(LR, col.Column)) 

    'The range starts in the column B in the worksheet, so the matrix ubound is 'col.column -1 
     ReDim Preserve matrix(1 To col.Column - 1) 
     matrix(col.Column - 1) = nsa 

     Next 

     wsSA.Range(wsSA.Cells(3, 2), wsSA.Cells(LR, LC)) = matrix 


     End Sub 
+1

単一のステートメント内の範囲。 –

+2

あなたは値の暫定記憶域として使うのではなく、 'matrix'を使って何かをやっているのですか?そうでなければ、 'ReDim Preserve'ステートメントはループ内の' wsSA'に各行を単にダンプするよりも、確かに高価です。 –

+0

返されたときに出力をどのように見たいのですか?各ソース列の最初の数値項目を宛先の行3に配置するか、ソース情報の各行を宛先の行として戻したい(空白に設定された非数値の先行セルを使用しますか?)おそらくあなたの質問を更新して、ソースデータと予想される出力のスクリーンダンプを含めてください。 – YowE3K

答えて

0

出力がループ内に書き込まれないようにする必要がある場合は、次のコードではおそらくtr行うには瑛:

Sub MyMatrix() 

    Dim wb1 As Workbook 
    Set wb1 = ActiveWorkbook 

    Dim wsNSA As Worksheet 
    Set wsNSA = wb1.Worksheets("NSA") 

    Dim wsSA As Worksheet 
    Set wsSA = wb1.Worksheets("SA") 

    Dim c As Long 
    Dim LC As Long 
    Dim LR As Long 
    Dim num_linha As Long 
    Dim nsa As Variant 

    With wsNSA 
     'LR is the Last row and LC is the last column with data 
     '???? Is data1_linha declared anywhere and assigned a value? ???? 
     LR = .Cells(data1_linha, 1).End(xlDown).Row 
     LC = .Cells(LR, 1).End(xlToRight).Column 

     'Loops through columns and finds the row where numeric data begins 
     For c = 2 To LC 
      nsa = .Range(.Cells(1, c), .Cells(LR, c)) 
      num_linha = Application.Match(True, Application.Index(Application.IsNumber(nsa), 0), 0) 
      wsSA.Cells(3, c).Resize(LR - num_linha + 1, 1).Value = .Range(.Cells(num_linha, c), .Cells(LR, c)).Value 
     Next 
    End With 

End Sub 
1

あなただけのすべてをコピーした後、空白のセルを削除することができます。それはギザギザの場合、最善のアプローチは、各列を割り当て、行をループするかもしれない

Sheet1.Range("A3").CurrentRegion.Copy Destination:= Sheet2.Range("A3") 

Sheet2.Range("A3").CurrentRegion.SpecialCells(xlCellTypeBlanks).Delete xlShiftUp 
関連する問題