С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/89: Рейтинг темы: голосов - 89, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11

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

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

Студворк — интернет-сервис помощи студентам
Привет всем.
Обхожу экселевский файл в цикле, в файле иерархическая структура многоуровневая с "плюсиками", нужно узнать какая строка является строкой-родителем для текущей и получить из нее информацию.
Искал на разных форумах, нашел как определить уровень и принадлежность група/не группа. Но как обратиться к строке-родителю???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2012, 09:12
Ответы с готовыми решениями:

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

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

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

11
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 09:48
  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
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 11:23  [ТС]
Спасибо, идею я понял.
Но я извиняюсь, надо было сразу уточнить - я пишу обработку под 1С, которая обрабатывает файл Excel. Находясь на текущей строке в цикле, не могу ли я обратиться напрямую к ближайшей строке-родителю, используя какой-либо метод или параметр текущей строки?
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 12:00
Alt+F11, F2 - попадете в Object Browser.
найдёте то, что ищете - расскажете?
0
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 12:17  [ТС]
Очень широкий простор для поиска
А через свойство Parent мне почему то всегда самая первая строка возвращается, нельзя через него?
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 13:15
Parent для объекта Range даст ссылку на объект Worksheet.
насколько мне известно, нужного Вам свойства или метода в "чистом" виде нет.
стал бы я иначе макрос писать?


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

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

заводим A(1 to 8) - одномерный массив длинных целых (номера строк)
перебираем строки сверху вниз:
  • для каждой строки определяем OutlineLevel (допустим, 4)
  • сохраняем номер текущей строки в A(4)
  • обнуляем элементы массива от 5-го до конца (? м.б., и не надо)
  • из A(3) берем номер строки родителя (3 = 4-1)
  • переходим к следующей строке.
1
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 18:27  [ТС]
ikki_cf, так понятней. Вобщем без изобретательства не обойтись
Но теперь ясен путь решения, за что и спасибо.
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 18:40
мде...
можно нарваться на подводные камни - см. файл.
Вложения
Тип файла: xls кривая группировка.xls (23.0 Кб, 128 просмотров)
1
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 19:23  [ТС]
Мда, 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
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
31.05.2012, 19:29
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
31.05.2012, 19:31  [ТС]
Понял, но у меня файл как раз с такими вот кривыми группировками как назло..

Добавлено через 1 минуту
Цитата Сообщение от ikki_cf Посмотреть сообщение
нет, неправильно.
не просто поменялся, а первый с меньшим значением
да-да, подсознательно я это предполагал
0
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 11
02.06.2012, 22:57  [ТС]
Цитата Сообщение от ikki_cf Посмотреть сообщение
заводим A(1 to 8) - одномерный массив длинных целых (номера строк)
перебираем строки сверху вниз:
для каждой строки определяем OutlineLevel (допустим, 4)
сохраняем номер текущей строки в A(4)
обнуляем элементы массива от 5-го до конца (? м.б., и не надо)
из A(3) берем номер строки родителя (3 = 4-1)
переходим к следующей строке.
ikki_cf, спасибо еще раз, у меня все получилось сделать, используя предложенный тобой вариант. С самого начала у меня была мысль как-нибудь сохранять текущего родителя для данного уровня. Предложенный тобой вариант очень помог мне принять правильное решение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2012, 22:57
Помогаю со студенческими работами здесь

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

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

Как получить значение из ячейки текущей строки DataGridView в дочерней форме?
Помогите новичку в C#. Форма2 вызывается из Формы1. На Форме1 есть DataViewGrid1 и ToolStrip1, в котором и находится кнопка для открытия...

Excel - Как узнать диапазон - родитель?
Ребята подскажите пзл 1) Как узнать диапазон родитель ящейки 'B3'? http://tavis1.narod.ru/Image/S1.jpg 2) И как опредилить...

Как из С++ получить значение ячейки в файле Excel
хотелось бы наиболее простым способом получить значение из открытого файла в Excel значение в заданной ячейке.


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru