Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.88
SerF_2011
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
#1

Как получить строку-родитель для текущей строки в файле Excel с группировками - VBA

31.05.2012, 09:12. Просмотров 6270. Ответов 11
Метки нет (Все метки)

Привет всем.
Обхожу экселевский файл в цикле, в файле иерархическая структура многоуровневая с "плюсиками", нужно узнать какая строка является строкой-родителем для текущей и получить из нее информацию.
Искал на разных форумах, нашел как определить уровень и принадлежность група/не группа. Но как обратиться к строке-родителю???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2012, 09:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как получить строку-родитель для текущей строки в файле Excel с группировками (VBA):

Как получить имя текущей ячейки в Excel?
Подскажите, как получить имя текущей ячейки (определенное мной). Или как...

Excel - Как узнать диапазон - родитель?
Ребята подскажите пзл 1) Как узнать диапазон родитель ящейки 'B3'? ...

Как получить строку гиперссылки в VBA Excel
В ячейке “A2” Exel таблицы, находится рабочая гиперссылка, которая хорошо...

Как в листе Excel определить номер текущей страницы?
Как в листе Exel определить номер текущей страницы? В Word'е знаю, а в Exel не...

Получить из строк новую строку, содержащую первые N1 символов строки S1 и последние N2 символа строки S2
Помогите,пожалуйста, с заданиями. буду очень благодарна. 1. Даны натуральные...

Как получить имя текущей процедуры или функции?
Всем доброго времени суток. Прошерстив просторы интернета не нашел каким...

11
ikki
призрак
2822 / 878 / 117
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 09:48 #2
  1. узнать уровень группировки текущей строки - X.
  2. в зависимости от того, какой на листе способ группирования - итоги сверху/снизу - идти вверх/вниз от текущей.
  3. первая строка с уровнем (X-1) - "родитель".

Добавлено через 22 минуты
как-то так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function nParentRow&(nChildRow&, Optional ws As Worksheet)
  Dim iStep%, iChLevel%, lRLimit&, i&
  If ws Is Nothing Then Set ws = ActiveSheet
  iChLevel = ws.Rows(nChildRow).OutlineLevel
  If ws.Outline.SummaryRow = xlAbove Then
    iStep = -1: lRLimit = 1
  Else
    iStep = 1: lRLimit = ws.UsedRange.Rows.Count + ws.UsedRange.Rows(1).Row - 1
  End If
  i = nChildRow
  Do Until i = lRLimit
    i = i + iStep
    If ws.Rows(i).OutlineLevel = iChLevel - 1 Then nParentRow = i: Exit Function
  Loop
  nParentRow = -1
End Function
1
SerF_2011
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 11:23  [ТС] #3
Спасибо, идею я понял.
Но я извиняюсь, надо было сразу уточнить - я пишу обработку под 1С, которая обрабатывает файл Excel. Находясь на текущей строке в цикле, не могу ли я обратиться напрямую к ближайшей строке-родителю, используя какой-либо метод или параметр текущей строки?
0
ikki
призрак
2822 / 878 / 117
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 12:00 #4
Alt+F11, F2 - попадете в Object Browser.
найдёте то, что ищете - расскажете?
0
SerF_2011
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 12:17  [ТС] #5
Очень широкий простор для поиска
А через свойство Parent мне почему то всегда самая первая строка возвращается, нельзя через него?
0
ikki
призрак
2822 / 878 / 117
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 13:15 #6
Parent для объекта Range даст ссылку на объект Worksheet.
насколько мне известно, нужного Вам свойства или метода в "чистом" виде нет.
стал бы я иначе макрос писать?


Добавлено через 47 минут
если обработка в цикле.

для конкретики: итоги по строкам сверху.

заводим A(1 to 8) - одномерный массив длинных целых (номера строк)
перебираем строки сверху вниз:
  • для каждой строки определяем OutlineLevel (допустим, 4)
  • сохраняем номер текущей строки в A(4)
  • обнуляем элементы массива от 5-го до конца (? м.б., и не надо)
  • из A(3) берем номер строки родителя (3 = 4-1)
  • переходим к следующей строке.
1
SerF_2011
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 18:27  [ТС] #7
ikki_cf, так понятней. Вобщем без изобретательства не обойтись
Но теперь ясен путь решения, за что и спасибо.
0
ikki
призрак
2822 / 878 / 117
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 18:40 #8
мде...
можно нарваться на подводные камни - см. файл.
1
Вложения
Тип файла: xls кривая группировка.xls (23.0 Кб, 112 просмотров)
SerF_2011
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 19:23  [ТС] #9
Мда, OutlineLevel работает как то некорректно...
Вот нашел кусок на форуме - предлагают определить ячейки начала и конца группировок. Но не пойму что здесь к чему

1C
1
2
3
4
5
6
7
8
9
10
for x = 1 to Count do
    // Выведим пользователю информацию о количестве обработаных строк.
 
    Form.lbStatus.Caption("Обработка листа ""Оглавление"". Обработано: " + x + " строк.");
    // Добавим в таблицу значений Наименование группы, производителя, указатель на
 
    // первую ячейку и количество необходим для обработки ячеек.
 
    AddLine(Sheet.Cells(x, 1).Hyperlinks.Item(1).SubAddress, Sheet.Cells(x, 1).Value, vtItem);
enddo;
Добавлено через 5 минут
Вот так не будет уровень верно считать?
1C
1
2
3
4
5
6
ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
ExcelЛист = ExcelФайл.Sheets(1);
 
.................
 
ExcelЛист.Cells(Строка, Колонка).EntireRow.OutlineLevel
Добавлено через 21 минуту
Ну и пришла еще идея - если перебирая строки обратно (допустим вверх) к родительской строке, можно Текущий уровень сравнивать не (ТекУровень - 1), а просто на отличие, т.е. если уровень поменялся, значит стоп - это родитель.

Как думаешь?
0
ikki
призрак
2822 / 878 / 117
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 19:29 #10
Цитата Сообщение от SerF_2011 Посмотреть сообщение
Мда, OutlineLevel работает как то некорректно...
это с чего такие выводы?
OutlineLevel определяет всё правильно.
просто в файле-примере пользователь криво выполнил группировку.
и для таких криворуких пользователей алгоритм, предложенный в посте #6, сработает неправильно.
кстати, так же, как неправильно сработает макрос из поста #2.
но Excel-то тут причём?

если есть 120%-ная уверенность, что в Ваших файлах подобной ерунды не будет - можно не заморачиваться.
если нет - надо вносить модификацию в макрос и алгоритм.


по поводу кода 1С - я вообще там не вижу ничего, что позволяло бы определять "родительскую" строку.

Добавлено через 4 минуты
Цитата Сообщение от SerF_2011 Посмотреть сообщение
просто на отличие, т.е. если уровень поменялся, значит стоп - это родитель.
нет, неправильно.
не просто поменялся, а первый с меньшим значением.
т.е. 13-ая строка кода из поста #2 должна быть такой:
Visual Basic
1
If ws.Rows(i).OutlineLevel < iChLevel Then nParentRow = i: Exit Function
1
SerF_2011
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 19:31  [ТС] #11
Понял, но у меня файл как раз с такими вот кривыми группировками как назло..

Добавлено через 1 минуту
Цитата Сообщение от ikki_cf Посмотреть сообщение
нет, неправильно.
не просто поменялся, а первый с меньшим значением
да-да, подсознательно я это предполагал
0
SerF_2011
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
02.06.2012, 22:57  [ТС] #12
Цитата Сообщение от ikki_cf Посмотреть сообщение
заводим A(1 to 8) - одномерный массив длинных целых (номера строк)
перебираем строки сверху вниз:
для каждой строки определяем OutlineLevel (допустим, 4)
сохраняем номер текущей строки в A(4)
обнуляем элементы массива от 5-го до конца (? м.б., и не надо)
из A(3) берем номер строки родителя (3 = 4-1)
переходим к следующей строке.
ikki_cf, спасибо еще раз, у меня все получилось сделать, используя предложенный тобой вариант. С самого начала у меня была мысль как-нибудь сохранять текущего родителя для данного уровня. Предложенный тобой вариант очень помог мне принять правильное решение.
0
02.06.2012, 22:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2012, 22:57
Привет! Вот еще темы с решениями:

Как получить номер(или какой нить индифиактор) текущей строки в открытом файле и перейти затем на эту строчку?
открываю файл так: ifstream input(&quot;morf.txt&quot;); перехожу на следующие строчки...

Как получить строку с текущей датой?
Здравствуйте! Я хочу открывать файлы в названии которы присутствует текущая...

Как правильно получить значение id текущей строки?
Допустим в BindingSourсe есть таблица с полями id, name. Как правильно...

Как получить/записать значение столбца текущей строки
Добрый день. У меня есть две формы На Form 1 расположен DataGridView который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru