Страницы: 1
RSS
Разбор кода, Перевод из иерархической таблицы (группы) в плоскую
 
Добрый вечер ребят, долгое время немного программировал на php, сейчас снова тяжело выезжаю в vba
Помоги разобраться в коде, нашел на просторах в интернете

Код
Sub reFormat()
    Dim sh As Worksheet  'Лист исходник
    Dim shd As Worksheet 'Лист результат
    Dim cell As Range
    Dim dest As Range
    Dim fil(1 To 6) As Variant  'Массив
    
    Set shd = ThisWorkbook.Worksheets("Result") 'Присвоить лист результат 
    shd.UsedRange.Rows.Delete 'Очистить лист
    
   shd.[a1].Resize(1, 9) = Array("1", "2", "3", "4", "5", "6", "7", "8", "9")
    Set dest = shd.[a2]
     
    Set sh = ThisWorkbook.Worksheets("Start")
    
    
    For Each cell In sh.UsedRange.Columns(1).Cells  'Выбираем первый столбец
        If cell.EntireRow.OutlineLevel = 1 Then fil(1) = cell.Value
        If cell.EntireRow.OutlineLevel = 2 Then fil(2) = cell.Value
        If cell.EntireRow.OutlineLevel = 3 Then fil(3) = cell.Value
        If cell.EntireRow.OutlineLevel = 4 Then fil(4) = cell.Value
        'If cell.EntireRow.OutlineLevel = 4 Then fil(5) = cell.Value
             
        If cell.EntireRow.OutlineLevel = 4 Then
            dest.Resize(1, 9).Value = Array(fil(1), fil(2), fil(3), fil(4), fil(5), cell.Value, cell.Offset(, 1).Value, cell.Offset(, 2).Value, cell.Offset(, 4).Value)
            Set dest = dest.Offset(1)
        End If
        Set cell = cell.Offset(1)
    Next
    shd.Activate
    End Sub

Не понимаю след строки,  для чего в объекте еще массив появляется [a1] и так же зачем [a2]
Код
shd.[a1].Resize(1, 9) = Array("1", "2", "3", "4", "5", "6", "7", "8", "9") 
 Set dest = shd.[a2]
Что находится в Сell.value
Код
If cell.EntireRow.OutlineLevel = 1 Then fil(1) = cell.Value
Буду признателен, т к пытаюсь переписать код под свои нужды
 
вообще это код для сбора иерархической таблицы (строк, собранных в группы) листа Старт в плоскую таблицу на лист Результат
shd.[a1].Resize(1, 9) = Array("1", "2", "3", "4", "5", "6", "7", "8", "9")
записывает числа 1,2,3,4...9  в диапазон А1:I1
это формируется шапка таблицы, знаете как написать компактнее - напишите нам, мы тоже будем знать
данные с листа "Старт" вносятся на лист "Результат" начиная с строки 2 (под шапкой, все логично)
в Сell.value находится значение ячейки Сell

может есть смысл просто описать свои нужды? трудно предположить как вы адаптируете этот код, например, для решения задачи: "определение корней квадратного уравнения"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Добрый день. [a2] - это не массив, это альтернативная запись диапазона.
Код
можно так записать:
shd.Range("A1") и это будет эквивалентно shd.[a1]
просто запись короче
В инструкции 
shd.[a1].Resize(1, 9) = Array("1", "2", "3", "4", "5", "6", "7", "8", "9")
диапазон ячейки А1 с листа shd расширяется на 9 столбцов и в него записывается содержимое одномерного массива
Во второй инструкции
Set dest = shd.[a2]
переменной dest присваивается диапазон ячейки А2 с листа shd
Кому решение нужно - тот пример и рисует.
Страницы: 1
Наверх