2016-12-20 2 views
0

Мой макрос проходит через диапазон, обводя столбцами, находит, где числовые данные начинаются в каждом столбце и сохраняет диапазоны в массиве с зубцами (вариант «матрица» в коде).VBA Jagged Array to Range

После этого я хотел бы вернуть всю матрицу в диапазон в другом листе. Если я попытаюсь назначить «matrix (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

Если вы готовы забыть требование о том, что выход не должен быть записан внутри цикла, следующий код, вероятно, не будет делать то, что вы тр инь делать:

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