+ Ответить в теме
Показано с 1 по 5 из 5

Тема: Как на VBA обойти лист Excel с группировками?

  1. #1
    VorkSH is on a distinguished road
    Регистрация
    10.03.2011
    Возраст
    38
    Сообщений
    2
    Вес репутации
    0

    Question Как на VBA обойти лист Excel с группировками?

    Как на VBA обойти иерархически лист Excel с группировками?
    Понятно что это рекурсивно делать надо, но что-то никак не могу найти методы доступа к диапазону ячеек, который входит в группировку и определения принадлежности конкретной ячейки к какой-либо группе.

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    developer mc-black is on a distinguished road Аватар для mc-black
    Регистрация
    08.05.2008
    Адрес
    Россия, Нижний Новгород
    Сообщений
    245
    Вес репутации
    11

    По умолчанию Re: Как на VBA обойти лист Excel с группировками?

    Объясните, как надо обходить иерархически построенный лист в Excel - что именно в конечном результате преследуете? Намного проще будет, если Вы разместите образец такого файла - не обязательно достоверную и полную таблицу, можно утрированный пример фрагмента таблицы, который надо обойти и что-то с ним делать. У меня есть некоторый опыт перевода иерархически-построенного отчета выгрузки в упрощенный вид плоской одномерной таблицы. Там правда я использовал как ориентир не групирующие элементы (хотя мог), а величину отступа текста в ячейке.

    К сообщению прикрепил пример того, каким я представляю себе файл с иерархией на основе группировки строк и в нем есть макрос, который демонстрирует, как можно получить уровень любой строки таблицы в иерархии, если строка подпадает под группировку. На основе уровня отступа и порядка следования элементов иерархии выстраивается алгоритм обхода. Тут для обхода достаточно простого цикла с анализом строк и динамическим массивом, имитирующим стек. Если на основе нижнего уровня надо просчитывать подитоги на разных уровнях, то цикл будет для каждого уровня группировки.
    Вложения
    Последний раз редактировалось mc-black; 10.03.2011 в 13:56.
    На заказ: VBA, Excel mc-black@yandex.ru

  4. #3
    VorkSH is on a distinguished road
    Регистрация
    10.03.2011
    Возраст
    38
    Сообщений
    2
    Вес репутации
    0

    По умолчанию Re: Как на VBA обойти лист Excel с группировками?

    wsh.Rows(i).OutlineLevel - это как раз то что надо. Спасибо!

  5. #4
    developer mc-black is on a distinguished road Аватар для mc-black
    Регистрация
    08.05.2008
    Адрес
    Россия, Нижний Новгород
    Сообщений
    245
    Вес репутации
    11

    По умолчанию Re: Как на VBA обойти лист Excel с группировками?

    Мне стал интересен вопрос и я написал пример переноса данных из таблицы с иерархией в простую плоскую таблицу, содержащую всю информацию по элементам самого нижнего уровня. Обход применим для иерархий, где на каждом уровне группировки собраны данные одного и того же типа.
    Код :
    1. Option Explicit
    2.  
    3. Sub Main()
    4.     Dim wsh As Worksheet, i As Long, m As Long, j As Long, k As Long
    5.     Dim MaxLevel As Long, CurLevel As Long, RowsArr() As Long, dLeft As Long
    6.    
    7.     Set wsh = ThisWorkbook.Worksheets(1)
    8.    
    9.     wsh.Outline.SummaryRow = xlSummaryAbove
    10.    
    11.     i = 3
    12.     Do While Not wsh.Cells(i, 1).Value = Empty
    13.         i = i + 1
    14.     Loop
    15.     MaxLevel = i - 3
    16.     ReDim RowsArr(1 To MaxLevel) As Long
    17.    
    18.     m = wsh.UsedRange.Row + wsh.UsedRange.Rows.Count - 1
    19.     i = 8
    20.     Do While i <= m
    21.         wsh.Cells(i, 3).Value = wsh.Rows(i).OutlineLevel
    22.         i = i + 1
    23.     Loop
    24.    
    25.     m = wsh.UsedRange.Row + wsh.UsedRange.Rows.Count - 1: i = 8
    26.     j = 8: dLeft = 4
    27.     Do While i <= m
    28.         CurLevel = wsh.Rows(i).OutlineLevel
    29.         RowsArr(CurLevel) = i
    30.         If CurLevel = MaxLevel Then
    31.             k = 1
    32.             Do While k <= MaxLevel
    33.                 wsh.Cells(j, k + dLeft).Value = wsh.Cells(RowsArr(k), 1).Value
    34.                 k = k + 1
    35.             Loop
    36.             k = k - 1
    37.             wsh.Cells(j, k + dLeft + 1).Value = wsh.Cells(RowsArr(k), 2).Value
    38.             wsh.Cells(j, k + dLeft + 2).Value = wsh.Cells(RowsArr(k), 3).Value
    39.             j = j + 1
    40.         End If
    41.         i = i + 1
    42.     Loop
    43.    
    44.     Set wsh = Nothing
    45. End Sub
    Вложения
    На заказ: VBA, Excel mc-black@yandex.ru

  6. #5
    Dasist is on a distinguished road
    Регистрация
    06.03.2017
    Возраст
    23
    Сообщений
    1
    Вес репутации
    0

    Cool Re: Как на VBA обойти лист Excel с группировками?

    Вот это ты, брат, полезную вещь смастерил!
    Респект!
    Уважаю.

+ Ответить в теме

Похожие темы

  1. Excel. Подготовить лист для вычислений.
    Добрый день! Обращаюсь за помощью к великим гуру информационных и вычислительных наук, т.к. чувствую свою беспомощьность перед лицом грозного и...
    от krk13 в разделе Решите мне задачку
  2. Задача. Рабочий лист Excel.
    Люди помогите решить задачу по Excel. Срочно надо до четверга. Задано целое число k (1≤k≤252) и последовательность цифр...
    от Nissan в разделе Решите мне задачку
  3. EXCEL-Не копируется лист книги
    Книга, состоящая из 2-ух листов – «Лист1» и «Лист2», содержит макрос Sub CopySheet() MsgBox "До копирования" Sheets("Лист2").Copy...
    от anval в разделе MS Office и VB(A).
  4. Лист Excel на форме
    Можно ли на пользовательской форме показывать содержимое листов Excel? Как? Задача: На форме в MSProject '03 показать содержимое связанного листа...
    от Sokl в разделе MS Office и VB(A).
  5. Помогите защитить лист в Excel 97
    На лист кидаю кнопку и код на обработку нажатия: ActiveSheet.Protect В Ecxel 2000 все нормально выполняется, а в 97 выдается ошибка 1004 - "Метод...
    от flugru в разделе MS Office и VB(A).

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения