Скорее всего из-за макроса создающего выпадающий список без пустых значений, расположенного в модуле 1-го листа. ... просто в первых файлах было намного меньше данных - а сейчас больше 2000. Удалите его и все проверки данных с 1-го листа.
По цвету - добавьте УФ с формулой проверки пустого значения в столбце "Е" и не пустого в "Д" -по правилам форума это уже другой вопрос - другая тема
По последнему пункту - нужно менять структуру вложенного цикла - а как тогда выделять какой это подузел какого узла? Вы должны сначала полностью прописать понятный алгоритм, что как называть и куда вставлять - и показать на примере... Может гляну когда будет время, может кто - то другой возьмется за "так" переделывать... это же форум
Скорее всего из-за макроса создающего выпадающий список без пустых значений, расположенного в модуле 1-го листа. ... просто в первых файлах было намного меньше данных - а сейчас больше 2000. Удалите его и все проверки данных с 1-го листа.
По цвету - добавьте УФ с формулой проверки пустого значения в столбце "Е" и не пустого в "Д" -по правилам форума это уже другой вопрос - другая тема
По последнему пункту - нужно менять структуру вложенного цикла - а как тогда выделять какой это подузел какого узла? Вы должны сначала полностью прописать понятный алгоритм, что как называть и куда вставлять - и показать на примере... Может гляну когда будет время, может кто - то другой возьмется за "так" переделывать... это же форум SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 02.06.2015, 09:42
ZamoK, список вложенных подузлов в результирующую таблицу выводить обязательно или достаточно вывести агрегированный список деталей со всех уровней вложенности?
ZamoK, список вложенных подузлов в результирующую таблицу выводить обязательно или достаточно вывести агрегированный список деталей со всех уровней вложенности?krosav4ig
krosav4ig, я уже незнаю как лучше объяснить, видимо SLAVICK, так и не понял, что конкретно нужно было реализовать, тема то "Многоуровневый сбор данных", а не двух уровневый. Т.е цикл просмотра такой: 1. Взял первый номер на листе Перечень, ищем на листе Состав узлов в столбце А, переносим на лист Комплект содержимое первого номера; 2. Проверяем перенесенные данные на наличие номера начинающегося на 3 или 6 (т.е. узлы) 2.1 если такие имеются то переносим с листа Состав узлов, то из чего он состоит (как в п.1), для каждого узла (желательно под сам номер) (Принцип Русской МАТРЁШКИ) 2.2 если номер начинающийся на 3 или 6 есть, но на листе Состав узлов в столбце А его нет, то как вариат приклеить такой диалог:
MsgBox("Отсутствует часть данных!!! Продолжить?", vbQuestion + vbYesNo) = vbNo
а/ Да - выделяем цветом и продолжаем цикл. б/ Нет - перкращаем работу макроса 3. Взял следующий номер на листе Перечень, ищем на листе Состав узлов в столбце А, переносим на лист Комплект, то что содержит позиция, 4. Повторяем п.2 (вот на этом месте гвоздь у SLAVICK, ) 5. Повторяем п.3 до первой пустой ячейки. 6. На листе Итог перечень деталей в алфавитном порядке (все повторяющиеся позиции суммированы)
Образцы листов в приложении
krosav4ig, я уже незнаю как лучше объяснить, видимо SLAVICK, так и не понял, что конкретно нужно было реализовать, тема то "Многоуровневый сбор данных", а не двух уровневый. Т.е цикл просмотра такой: 1. Взял первый номер на листе Перечень, ищем на листе Состав узлов в столбце А, переносим на лист Комплект содержимое первого номера; 2. Проверяем перенесенные данные на наличие номера начинающегося на 3 или 6 (т.е. узлы) 2.1 если такие имеются то переносим с листа Состав узлов, то из чего он состоит (как в п.1), для каждого узла (желательно под сам номер) (Принцип Русской МАТРЁШКИ) 2.2 если номер начинающийся на 3 или 6 есть, но на листе Состав узлов в столбце А его нет, то как вариат приклеить такой диалог:
MsgBox("Отсутствует часть данных!!! Продолжить?", vbQuestion + vbYesNo) = vbNo
а/ Да - выделяем цветом и продолжаем цикл. б/ Нет - перкращаем работу макроса 3. Взял следующий номер на листе Перечень, ищем на листе Состав узлов в столбце А, переносим на лист Комплект, то что содержит позиция, 4. Повторяем п.2 (вот на этом месте гвоздь у SLAVICK, ) 5. Повторяем п.3 до первой пустой ячейки. 6. На листе Итог перечень деталей в алфавитном порядке (все повторяющиеся позиции суммированы)
P.S. Если Вам помогли и Вы хотите сказать "Спасибо" форумчанину помогшему Вам - нажмите "+" напротив надписи "Репутация" в любом его посте. Материя вторична !
P.S. Если Вам помогли и Вы хотите сказать "Спасибо" форумчанину помогшему Вам - нажмите "+" напротив надписи "Репутация" в любом его посте. Материя вторична ! ZamoK
ZamoK, я правильно понял, что нужно в итоге получить список всех строк (со всех уровней вложенности), которые НЕ являются узлами (Т.е не нужно выводить в итоговую таблицу список вложенных узлов, которые были найдены в процессе сбора)? Если так, то есть решение с помощью Power Query
ZamoK, я правильно понял, что нужно в итоге получить список всех строк (со всех уровней вложенности), которые НЕ являются узлами (Т.е не нужно выводить в итоговую таблицу список вложенных узлов, которые были найдены в процессе сбора)? Если так, то есть решение с помощью Power Querykrosav4ig
но и сами узлы тоже !!! Узлы начинаются на 3 и на 6 т.е. в списке могут и должны присутствовать такие номера как (301524.070, 685544.123, 741121.121 и т.д.) Лист Состав узлов предположительно будет содержать порядка 25000~30000 строк.
но и сами узлы тоже !!! Узлы начинаются на 3 и на 6 т.е. в списке могут и должны присутствовать такие номера как (301524.070, 685544.123, 741121.121 и т.д.) Лист Состав узлов предположительно будет содержать порядка 25000~30000 строк.
nilem, Ну да как вариант лист итог получился, я бы добавил [vba]
Код
With Sheets("Итог") .Activate .Range("a3:d" & Rows.Count).ClearContents End With
[/vba]
[vba]
Код
Option Explicit
Sub main() 'with using reference MS Scripting Runtime Dim arr, i&, d As New Dictionary d.CompareMode = 1 With Sheets("Перечень") arr = .Range("B3:D" & .Cells(Rows.Count, 2).End(xlUp).Row).Value End With
For i = 1 To UBound(arr) Call ertert(d, CStr(arr(i, 1)), arr(i, 3)) Next i With Sheets("Итог") .Activate .Range("a3:d" & Rows.Count).ClearContents End With With Sheets("Итог").Range("B3:D3").Resize(d.Count) .Columns(1).Value = Application.Transpose(d.Keys) .Columns(3).Value = Application.Transpose(d.Items) .Sort Key1:=.Cells(1, 1), Order1:=xlAscending .Parent.Activate End With End Sub
[/vba]
Жаль что пропал №п/п и лист Комплект думаю можно допилить наверно
с помощью Power Query - что-то новенькое, скачал установил изучаю
че-то я не догоняю как с этим бороться, да и устанавливать придется эту надстройку на всех ПК которые будут открывать файл - не вариант.
nilem, Ну да как вариант лист итог получился, я бы добавил [vba]
Код
With Sheets("Итог") .Activate .Range("a3:d" & Rows.Count).ClearContents End With
[/vba]
[vba]
Код
Option Explicit
Sub main() 'with using reference MS Scripting Runtime Dim arr, i&, d As New Dictionary d.CompareMode = 1 With Sheets("Перечень") arr = .Range("B3:D" & .Cells(Rows.Count, 2).End(xlUp).Row).Value End With
For i = 1 To UBound(arr) Call ertert(d, CStr(arr(i, 1)), arr(i, 3)) Next i With Sheets("Итог") .Activate .Range("a3:d" & Rows.Count).ClearContents End With With Sheets("Итог").Range("B3:D3").Resize(d.Count) .Columns(1).Value = Application.Transpose(d.Keys) .Columns(3).Value = Application.Transpose(d.Items) .Sort Key1:=.Cells(1, 1), Order1:=xlAscending .Parent.Activate End With End Sub
[/vba]
Жаль что пропал №п/п и лист Комплект думаю можно допилить наверно
Sub main() 'with using reference MS Scripting Runtime Dim arr, i&, d As New Dictionary d.CompareMode = 1: n = 0: ReDim rez(1 To 10000, 1 To 4) With Sheets("Перечень") arr = .Range("B3:D" & .Cells(Rows.Count, 2).End(xlUp).Row).Value End With
For i = 1 To UBound(arr) Call ertert(d, CStr(arr(i, 1)), arr(i, 3)) Next i d.RemoveAll With Sheets("Итог").Range("A3:D3") .CurrentRegion.Offset(2).ClearContents .Resize(n).Value = rez() .Parent.Activate End With End Sub
Sub ertert(d As Dictionary, ByVal t As String, ByVal k As Long) Dim x, j&, s$, r As Range Set r = Sheets("Состав узлов").Columns(1).Find(t, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then MsgBox "oops: " & t, 48: Exit Sub x = r.CurrentRegion.Value For j = 1 To UBound(x) s = CStr(x(j, 3)) If d.Exists(s) Then rez(d.Item(s), 4) = rez(d.Item(s), 4) + x(j, 5) * k Else n = n + 1: d.Item(s) = n rez(n, 1) = n rez(n, 2) = s rez(n, 3) = x(j, 4) rez(n, 4) = x(j, 5) * k End If If Left(s, 1) = 3 Or Left(s, 1) = 6 Then ertert d, s, x(j, 5) * k Next j End Sub
[/vba]
вот, пробуйте
[vba]
Код
Option Explicit Dim rez(), n&
Sub main() 'with using reference MS Scripting Runtime Dim arr, i&, d As New Dictionary d.CompareMode = 1: n = 0: ReDim rez(1 To 10000, 1 To 4) With Sheets("Перечень") arr = .Range("B3:D" & .Cells(Rows.Count, 2).End(xlUp).Row).Value End With
For i = 1 To UBound(arr) Call ertert(d, CStr(arr(i, 1)), arr(i, 3)) Next i d.RemoveAll With Sheets("Итог").Range("A3:D3") .CurrentRegion.Offset(2).ClearContents .Resize(n).Value = rez() .Parent.Activate End With End Sub
Sub ertert(d As Dictionary, ByVal t As String, ByVal k As Long) Dim x, j&, s$, r As Range Set r = Sheets("Состав узлов").Columns(1).Find(t, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then MsgBox "oops: " & t, 48: Exit Sub x = r.CurrentRegion.Value For j = 1 To UBound(x) s = CStr(x(j, 3)) If d.Exists(s) Then rez(d.Item(s), 4) = rez(d.Item(s), 4) + x(j, 5) * k Else n = n + 1: d.Item(s) = n rez(n, 1) = n rez(n, 2) = s rez(n, 3) = x(j, 4) rez(n, 4) = x(j, 5) * k End If If Left(s, 1) = 3 Or Left(s, 1) = 6 Then ertert d, s, x(j, 5) * k Next j End Sub
4) потом проходим по столбцу В лист «Комплект» и проверяем на наличие не разузлованных узлов находящихся в составе узлов т.е. a) берём значение ячейки В3 лист Комплект i) повторяем п.п 1а , 1 б до пустой ячейки End Sub
И где здесь пункт о возврате к пункту 4 ? Он появился только в новом алгоритме в 45-м сообщении. В моем коде я показывал не просто набор деталей, а состав главных узлов... т.е. из каких деталей состоят все "Главные узлы". Мой вопрос был как отображать в такой структуре состав главного узла, если у него н-ное количество вложенности подузлов? Код nilem, просто отображает набор нужных подузлов и деталей. (в моем коде похожую задачу выполняет процедура "Summ"). Из этого кода нельзя понять что куда относится - если это и не нужно - тогда масса вопросов просто отпадает ввиду их ненадобности и еще Вы раньше указывали? :
Нет особого желания тратить свое время впустую, зная, что все может поменяться за одно сообщение Я говорю о том, если Вы хотите получать сразу правильный ответ на вопрос - описывайте сразу правильно все, что Вы хотите увидеть в итоге, и сразу вкладывайте правильные примеры, которые показывают реальную задачу...
А теперь по теме: Код nilem, идет по всем главным узлам: [vba]
Код
For i = 1 To UBound(arr) Call ertert(d, CStr(arr(i, 1)), arr(i, 3)) Next i
[/vba] И вызывает внешнюю процедуру заполнения итогового массива данными узлов. Эта процедура проверяет наличие кода в листе "Состав узлов" [vba]
[/vba] и если не находит выдает сообщение и заканчивает свою работу: [vba]
Код
If r Is Nothing Then MsgBox "oops: " & t, 48: Exit Sub
[/vba] Если находит - создает массив из прилегающих значений: [vba]
Код
x = r.CurrentRegion.Value
[/vba] И если в словаре уже есть деталь - добавляет данные массива к количеству в итоговом массиве: [vba]
Код
rez(d.Item(s), 4) = rez(d.Item(s), 4) + x(j, 5) * k
[/vba] Если это новая деталь - она добавляется в словарь и заполняется итоговый массив новой инфой Если левый символ = 3 или = 6 процедура вызывает себя же. [vba]
Код
If Left(s, 1) = 3 Or Left(s, 1) = 6 Then ertert d, s, x(j, 5) * k
[/vba]
Надеюсь Вы теперь понимаете что очень важно сразу самому постараться и составить правильно нужный алгоритм, сформулировать все нужные условия, и архиважно сразу давать пример отображающий всю суть вопроса, и не ждать 45-ть сообщений, чтобы что-то добавить Тогда Вам будут быстро и качественно помогать решить Вашу задачу
4) потом проходим по столбцу В лист «Комплект» и проверяем на наличие не разузлованных узлов находящихся в составе узлов т.е. a) берём значение ячейки В3 лист Комплект i) повторяем п.п 1а , 1 б до пустой ячейки End Sub
И где здесь пункт о возврате к пункту 4 ? Он появился только в новом алгоритме в 45-м сообщении. В моем коде я показывал не просто набор деталей, а состав главных узлов... т.е. из каких деталей состоят все "Главные узлы". Мой вопрос был как отображать в такой структуре состав главного узла, если у него н-ное количество вложенности подузлов? Код nilem, просто отображает набор нужных подузлов и деталей. (в моем коде похожую задачу выполняет процедура "Summ"). Из этого кода нельзя понять что куда относится - если это и не нужно - тогда масса вопросов просто отпадает ввиду их ненадобности и еще Вы раньше указывали? :
Нет особого желания тратить свое время впустую, зная, что все может поменяться за одно сообщение Я говорю о том, если Вы хотите получать сразу правильный ответ на вопрос - описывайте сразу правильно все, что Вы хотите увидеть в итоге, и сразу вкладывайте правильные примеры, которые показывают реальную задачу...
А теперь по теме: Код nilem, идет по всем главным узлам: [vba]
Код
For i = 1 To UBound(arr) Call ertert(d, CStr(arr(i, 1)), arr(i, 3)) Next i
[/vba] И вызывает внешнюю процедуру заполнения итогового массива данными узлов. Эта процедура проверяет наличие кода в листе "Состав узлов" [vba]
[/vba] и если не находит выдает сообщение и заканчивает свою работу: [vba]
Код
If r Is Nothing Then MsgBox "oops: " & t, 48: Exit Sub
[/vba] Если находит - создает массив из прилегающих значений: [vba]
Код
x = r.CurrentRegion.Value
[/vba] И если в словаре уже есть деталь - добавляет данные массива к количеству в итоговом массиве: [vba]
Код
rez(d.Item(s), 4) = rez(d.Item(s), 4) + x(j, 5) * k
[/vba] Если это новая деталь - она добавляется в словарь и заполняется итоговый массив новой инфой Если левый символ = 3 или = 6 процедура вызывает себя же. [vba]
Код
If Left(s, 1) = 3 Or Left(s, 1) = 6 Then ertert d, s, x(j, 5) * k
[/vba]
Надеюсь Вы теперь понимаете что очень важно сразу самому постараться и составить правильно нужный алгоритм, сформулировать все нужные условия, и архиважно сразу давать пример отображающий всю суть вопроса, и не ждать 45-ть сообщений, чтобы что-то добавить Тогда Вам будут быстро и качественно помогать решить Вашу задачу SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Четверг, 04.06.2015, 11:41
Мой вопрос был как отображать в такой структуре состав главного узла, если у него н-ное количество вложенности подузлов?
на этот вопрос ответ во вложении все того же сообщения №45, видимо только к 45 сообщению в процессе формирования нарисовался более приемлемый вид этого документа. На самом деле я даже предположить не мог, что excel может так собирать и отображать такого рода информацию.
Мой вопрос был как отображать в такой структуре состав главного узла, если у него н-ное количество вложенности подузлов?
на этот вопрос ответ во вложении все того же сообщения №45, видимо только к 45 сообщению в процессе формирования нарисовался более приемлемый вид этого документа. На самом деле я даже предположить не мог, что excel может так собирать и отображать такого рода информацию.ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Четверг, 04.06.2015, 13:31
nilem, все отлично работает. Можно ли пояснить что где происходит в этом коде?
SLAVICK, спасибо, что ответили на вопрос. Теперь даже я понял [offtop]Вообще, нравится, когда вот так вот происходит: без эмоций, без лишних слов и по делу. Наверное, потому что это Лучший форум :)[/offtop]
nilem, все отлично работает. Можно ли пояснить что где происходит в этом коде?
SLAVICK, спасибо, что ответили на вопрос. Теперь даже я понял [offtop]Вообще, нравится, когда вот так вот происходит: без эмоций, без лишних слов и по делу. Наверное, потому что это Лучший форум :)[/offtop]nilem
видимо только к 45 сообщению в процессе формирования нарисовался более приемлемый вид этого документа.
Я с вами не согласен - визуально это может быть приемлемо только для маленьких "разузловований" А теперь представьте что у вас 10 подузлов, каждый из которых также раскрываются до 15 - го уровня
А теперь со стороны написания макроса - такая раскраска потребует существенных доработок макроса... что ввиду вышеописанного сведет на нет пользу от нее.
Практического применения от такого массива тоже не будет, поскольку все эти детали будут "Числится" за главным узлом. Поэтому лично я за такое браться не хочу
видимо только к 45 сообщению в процессе формирования нарисовался более приемлемый вид этого документа.
Я с вами не согласен - визуально это может быть приемлемо только для маленьких "разузловований" А теперь представьте что у вас 10 подузлов, каждый из которых также раскрываются до 15 - го уровня
А теперь со стороны написания макроса - такая раскраска потребует существенных доработок макроса... что ввиду вышеописанного сведет на нет пользу от нее.
Практического применения от такого массива тоже не будет, поскольку все эти детали будут "Числится" за главным узлом. Поэтому лично я за такое браться не хочу
такая раскраска потребует существенных доработок макроса...
А раскраска вовсе и не нужна, раскрасил только для того чтоб было понятно что к чему относится, какой порядок построения данных. Нужны только данные, только информация!!! А подсветить просил только те узлы в которых были проблемы
такая раскраска потребует существенных доработок макроса...
А раскраска вовсе и не нужна, раскрасил только для того чтоб было понятно что к чему относится, какой порядок построения данных. Нужны только данные, только информация!!! А подсветить просил только те узлы в которых были проблемы
Если это новая деталь - она добавляется в словарь и заполняется итоговый массив новой инфой Если левый символ = 3 или = 6 процедура вызывает себя же. If Left(s, 1) = 3 Or Left(s, 1) = 6 Then ertert d, s, x(j, 5) * k
А как добавить к 3 и 6 буквенный индекс например "ВГ"
Если это новая деталь - она добавляется в словарь и заполняется итоговый массив новой инфой Если левый символ = 3 или = 6 процедура вызывает себя же. If Left(s, 1) = 3 Or Left(s, 1) = 6 Then ertert d, s, x(j, 5) * k
А как добавить к 3 и 6 буквенный индекс например "ВГ"ZamoK