Создавать темы типа «ХЕЛП», «Условное форматирование», «Проблема с макросом», «ПОМОГИТЕ», «Не работает формула», «Как решить?» и подобные - НЕЛЬЗЯ!!! Такие темы будут закрываться или удаляться.
название меняйте, а то модераторы "помогут" :deal: [moder]Полностью поддерживаю
п2.правил форума:
Цитата
Создавать темы типа «ХЕЛП», «Условное форматирование», «Проблема с макросом», «ПОМОГИТЕ», «Не работает формула», «Как решить?» и подобные - НЕЛЬЗЯ!!! Такие темы будут закрываться или удаляться.
название меняйте, а то модераторы "помогут" :deal: [moder]Полностью поддерживаюкитин
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
Сообщение отредактировал _Boroda_ - Пятница, 04.03.2016, 09:25
BorisEfim, Ваша задачка заинтересовала. Долго сидел, получилось громоздко, но вродебы работает...
[vba]
Код
Sub Tree() Dim i&, i_n&, j0&, i1&, i2&, i3&, i_0&, j_n& Dim Tabl() As String Dim Der() As String Dim sovpal As Long Dim cell As Range i_n = Cells(Rows.Count, 1).End(xlUp).Row i_0 = Cells(1, 1).End(xlDown).Row For Each cell In ActiveSheet.UsedRange If j_n < cell.Column Then j_n = cell.Column End If Next cell For i = 1 To 12 Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Borders(i).LineStyle = xlNone Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Clear Next i ReDim Tabl(2, i_n) For i = i_0 To i_n Tabl(1, i) = Cells(i, 1) Tabl(2, i) = Cells(i, 2) Next i j0 = 1 ReDim Preserve Der(i_n, 1) For i1 = 1 To i_n sovpal = 0 If Tabl(1, i1) <> "" Then For i = 1 To i_n For j = 1 To UBound(Der, 2) If Der(i, j) = Tabl(1, i1) Then sovpal = sovpal + 1 End If Next j Next i If sovpal = 0 Then If Tabl(2, i1) = "" Then Der(1, 1) = Tabl(1, i1) i3 = 1 Else For i = 1 To i_n - 1 For j = 1 To UBound(Der, 2) If Der(i, j) = Tabl(2, i1) Then If UBound(Der, 2) < j + 1 Then ReDim Preserve Der(i_n, j + 1) For i2 = i_n - 1 To i + 1 Step -1 For j2 = UBound(Der, 2) To j0 + 1 Step -1 Der(i2 + 1, j2) = Der(i2, j2) Der(i2, j2) = "" Next j2 Next i2 i3 = i Else i2 = i Do While i2 < i_n For j2 = j To UBound(Der, 2) If Der(i2, j2) <> "" Then i3 = i2 End If Next j2 If Der(i2 + 1, j) <> "" Then Exit Do i2 = i2 + 1 Loop For i2 = i_n - 1 To i3 + 1 Step -1 For j2 = UBound(Der, 2) To j0 + 1 Step -1 Der(i2 + 1, j2) = Der(i2, j2) Der(i2, j2) = "" Next j2 Next i2 End If Der(i3 + 1, j + 1) = Tabl(1, i1) i3 = i3 + 1 End If Next j Next i End If End If End If Next i1 Cells(i_0, 4) = Cells(i_0, 1) For i = 1 To UBound(Der) For j = 1 To UBound(Der, 2) If Der(i, j) <> "" Then Cells(i + i_0, j + 4) = Der(i, j) If i_n < i Then i_n = i If j_n < j Then j_n = j End If Next j Next i For i = 7 To 10 Cells(i_0, 4).Resize(i_n - i_0 + 2, j_n - 3).Borders(i).Weight = xlThin Next i End Sub
[/vba]
BorisEfim, Ваша задачка заинтересовала. Долго сидел, получилось громоздко, но вродебы работает...
[vba]
Код
Sub Tree() Dim i&, i_n&, j0&, i1&, i2&, i3&, i_0&, j_n& Dim Tabl() As String Dim Der() As String Dim sovpal As Long Dim cell As Range i_n = Cells(Rows.Count, 1).End(xlUp).Row i_0 = Cells(1, 1).End(xlDown).Row For Each cell In ActiveSheet.UsedRange If j_n < cell.Column Then j_n = cell.Column End If Next cell For i = 1 To 12 Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Borders(i).LineStyle = xlNone Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Clear Next i ReDim Tabl(2, i_n) For i = i_0 To i_n Tabl(1, i) = Cells(i, 1) Tabl(2, i) = Cells(i, 2) Next i j0 = 1 ReDim Preserve Der(i_n, 1) For i1 = 1 To i_n sovpal = 0 If Tabl(1, i1) <> "" Then For i = 1 To i_n For j = 1 To UBound(Der, 2) If Der(i, j) = Tabl(1, i1) Then sovpal = sovpal + 1 End If Next j Next i If sovpal = 0 Then If Tabl(2, i1) = "" Then Der(1, 1) = Tabl(1, i1) i3 = 1 Else For i = 1 To i_n - 1 For j = 1 To UBound(Der, 2) If Der(i, j) = Tabl(2, i1) Then If UBound(Der, 2) < j + 1 Then ReDim Preserve Der(i_n, j + 1) For i2 = i_n - 1 To i + 1 Step -1 For j2 = UBound(Der, 2) To j0 + 1 Step -1 Der(i2 + 1, j2) = Der(i2, j2) Der(i2, j2) = "" Next j2 Next i2 i3 = i Else i2 = i Do While i2 < i_n For j2 = j To UBound(Der, 2) If Der(i2, j2) <> "" Then i3 = i2 End If Next j2 If Der(i2 + 1, j) <> "" Then Exit Do i2 = i2 + 1 Loop For i2 = i_n - 1 To i3 + 1 Step -1 For j2 = UBound(Der, 2) To j0 + 1 Step -1 Der(i2 + 1, j2) = Der(i2, j2) Der(i2, j2) = "" Next j2 Next i2 End If Der(i3 + 1, j + 1) = Tabl(1, i1) i3 = i3 + 1 End If Next j Next i End If End If End If Next i1 Cells(i_0, 4) = Cells(i_0, 1) For i = 1 To UBound(Der) For j = 1 To UBound(Der, 2) If Der(i, j) <> "" Then Cells(i + i_0, j + 4) = Der(i, j) If i_n < i Then i_n = i If j_n < j Then j_n = j End If Next j Next i For i = 7 To 10 Cells(i_0, 4).Resize(i_n - i_0 + 2, j_n - 3).Borders(i).Weight = xlThin Next i End Sub
Ваша задачка заинтересовала. Долго сидел, получилось громоздко, но вродебы работает...
да в примере все отлично работает но в рабочем excel возникла проблема , можешь глянуть почему полностью не формируется дерево, на листе "как должно быть дерево" как должно быть, как я понял макрас пробегается по столбцу находит совпадения и что в него входит на основе этого формирует дерево.
Ваша задачка заинтересовала. Долго сидел, получилось громоздко, но вродебы работает...
да в примере все отлично работает но в рабочем excel возникла проблема , можешь глянуть почему полностью не формируется дерево, на листе "как должно быть дерево" как должно быть, как я понял макрас пробегается по столбцу находит совпадения и что в него входит на основе этого формирует дерево.BorisEfim
BorisEfim, По примеру ориентировался я). Макрос был рассчитан, что в столбце "А" более "внешние ветки" появляются раньше, а чем ниже, тем более "глубокие". в нынешнем Вашем файле это не так. Поидее, можно добавить в макрос дополнительный цикл... но я сразу сейчас с лёту не соображу. Смогу ток когда время будет... А пока предлагаю всё-таки привести Ваш файлик к "внешние" раньше "более глубоких".
BorisEfim, По примеру ориентировался я). Макрос был рассчитан, что в столбце "А" более "внешние ветки" появляются раньше, а чем ниже, тем более "глубокие". в нынешнем Вашем файле это не так. Поидее, можно добавить в макрос дополнительный цикл... но я сразу сейчас с лёту не соображу. Смогу ток когда время будет... А пока предлагаю всё-таки привести Ваш файлик к "внешние" раньше "более глубоких".Roman777
Мб я Ваш пример не понял. В общем, я думал, что в первом столбце у Вас указаны все элементы - веточки (листочки) дерева. Сначала в первом столбце указываются внешние веточки, а потом более глубокие... Но важно, что в первом столбце перечислены все "веточки" и "листочки".
Мб я Ваш пример не понял. В общем, я думал, что в первом столбце у Вас указаны все элементы - веточки (листочки) дерева. Сначала в первом столбце указываются внешние веточки, а потом более глубокие... Но важно, что в первом столбце перечислены все "веточки" и "листочки".Roman777
BorisEfim, смотрю я на новый файл и не понимаю: "Труба всасывающая D150-28.02.200" содержится в "Боковина правая D150-28.02.000-01", почему же она тогда ("Труба всасывающая D150-28.02.200") стоит не правее "Боковина правая D150-28.02.000-01", а на одном уровне с "Полка топливного бака D150-28.01.100", который с свою очередь содержит "Боковина правая D150-28.02.000-01"? Я видимо, не понимаю пока что логику...
BorisEfim, смотрю я на новый файл и не понимаю: "Труба всасывающая D150-28.02.200" содержится в "Боковина правая D150-28.02.000-01", почему же она тогда ("Труба всасывающая D150-28.02.200") стоит не правее "Боковина правая D150-28.02.000-01", а на одном уровне с "Полка топливного бака D150-28.01.100", который с свою очередь содержит "Боковина правая D150-28.02.000-01"? Я видимо, не понимаю пока что логику...Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Среда, 09.03.2016, 13:20
BorisEfim, не дают мне времени глянуть подробней задачу. Я тут вот что ещё хотел уточнить. У Вас в файле получается, что "Боковина левая D150-28.01.000-01" включает в себя 2 "Полка топливного бака D150-28.01.100", а так же известно, что в "Полка топливного бака D150-28.01.100" содержатся 6 деталей: Отвод П60-57х3,5-6,3 ГОСТ 17375-2001 Втулка D200-28.01.103 Полка D150-28.01.101 Стенка D150-28.01.102 Отвод П60-57х3,5-6,3 ГОСТ 17375-2001 Бобышка D150-28.01.104 Вот в дереве, получается, должно отражаться, что каждая "Полка топливного бака D150-28.01.100" содержит по 6 этих деталей, или только 1 содержит, а другая пустая?
BorisEfim, не дают мне времени глянуть подробней задачу. Я тут вот что ещё хотел уточнить. У Вас в файле получается, что "Боковина левая D150-28.01.000-01" включает в себя 2 "Полка топливного бака D150-28.01.100", а так же известно, что в "Полка топливного бака D150-28.01.100" содержатся 6 деталей: Отвод П60-57х3,5-6,3 ГОСТ 17375-2001 Втулка D200-28.01.103 Полка D150-28.01.101 Стенка D150-28.01.102 Отвод П60-57х3,5-6,3 ГОСТ 17375-2001 Бобышка D150-28.01.104 Вот в дереве, получается, должно отражаться, что каждая "Полка топливного бака D150-28.01.100" содержит по 6 этих деталей, или только 1 содержит, а другая пустая?Roman777
Sub Tree() Dim i&, i_n&, j0&, i1&, i2&, i3&, i_0&, j_n&, k& Dim Tabl() As String Dim Der() As String Dim sovpal As Long Dim cell As Range i_n = Cells(Rows.Count, 1).End(xlUp).Row i_0 = Cells(1, 1).End(xlDown).Row For Each cell In ActiveSheet.UsedRange If j_n < cell.Column Then j_n = cell.Column End If Next cell For i = 1 To 12 Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Borders(i).LineStyle = xlNone Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Clear Next i ReDim Tabl(3, i_n) For i = i_0 To i_n Tabl(1, i) = Trim(Cells(i, 1)) Tabl(2, i) = Trim(Cells(i, 2)) k = k + 1 Tabl(3, i) = k Next i k = 0 For i = i_0 To i_n If Tabl(1, i) <> "" Then j_k = i_0 + k + 1 For j = j_k To i_n If Tabl(1, i) = Tabl(2, j) Then k = k + 1 If i_0 + k > i_n Then Exit For Temp1$ = Tabl(1, i_0 + k) Temp2$ = Tabl(2, i_0 + k) Temp3$ = Tabl(3, i_0 + k) Tabl(1, i_0 + k) = Tabl(1, j) Tabl(2, i_0 + k) = Tabl(2, j) Tabl(3, i_0 + k) = Tabl(3, j) Tabl(1, j) = Temp1 Tabl(2, j) = Temp2 Tabl(3, j) = Temp3 End If Next j End If Next i j0 = 1 ReDim Preserve Der(i_n, 2, 1) For i1 = 1 To i_n sovpal = 0 If Tabl(1, i1) <> "" Then For i = 1 To i_n For j = 1 To UBound(Der, 3) If Der(i, 1, j) & Der(i, 2, j) = Tabl(1, i1) & Tabl(3, i1) Then sovpal = sovpal + 1 End If Next j Next i If sovpal = 0 Then If Tabl(2, i1) = "" Then Der(1, 1, 1) = Tabl(1, i1) i3 = 1 Else For i = 1 To i_n - 1 For j = 1 To UBound(Der, 3) If Der(i, 1, j) = Tabl(2, i1) And Tabl(2, i1) <> "" Then If UBound(Der, 3) < j + 1 Then ReDim Preserve Der(i_n, 2, j + 1) For i2 = i_n - 1 To i + 1 Step -1 For j2 = UBound(Der, 3) To j0 + 1 Step -1 Der(i2 + 1, 1, j2) = Der(i2, 1, j2) Der(i2 + 1, 2, j2) = Der(i2, 2, j2) Der(i2, 1, j2) = "" Der(i2, 2, j2) = "" Next j2 Next i2 i3 = i Else i2 = i Do While i2 < i_n For j2 = j To UBound(Der, 3) If Der(i2, 1, j2) <> "" Then i3 = i2 End If Next j2 If Der(i2 + 1, 1, j) <> "" Then Exit Do i2 = i2 + 1 Loop For i2 = i_n - 1 To i3 + 1 Step -1 For j2 = UBound(Der, 3) To j0 + 1 Step -1 Der(i2 + 1, 1, j2) = Der(i2, 1, j2) Der(i2 + 1, 2, j2) = Der(i2, 2, j2) Der(i2, 1, j2) = "" Der(i2, 2, j2) = "" Next j2 Next i2 End If Der(i3 + 1, 1, j + 1) = Tabl(1, i1) Tabl(1, i1) = "" ' убираем повторы Tabl(2, i1) = "" ' убираем повторы Der(i3 + 1, 2, j + 1) = Tabl(3, i1) End If Next j Next i End If End If End If Next i1 Cells(i_0, 4) = Cells(i_0, 1) For i = 1 To UBound(Der) For j = 1 To UBound(Der, 3) If Der(i, 1, j) <> "" Then Cells(i + i_0, j + 4) = Der(i, 1, j) If i_n < i Then i_n = i If j_n < j Then j_n = j End If Next j Next i For i = 7 To 10 Cells(i_0, 4).Resize(i_n - i_0 + 2, j_n - 3).Borders(i).Weight = xlThin Next i End Sub
[/vba]
BorisEfim, в общем, такой вариант:
[vba]
Код
Sub Tree() Dim i&, i_n&, j0&, i1&, i2&, i3&, i_0&, j_n&, k& Dim Tabl() As String Dim Der() As String Dim sovpal As Long Dim cell As Range i_n = Cells(Rows.Count, 1).End(xlUp).Row i_0 = Cells(1, 1).End(xlDown).Row For Each cell In ActiveSheet.UsedRange If j_n < cell.Column Then j_n = cell.Column End If Next cell For i = 1 To 12 Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Borders(i).LineStyle = xlNone Cells(i_0, 3).Resize(i_n - i_0 + 2, j_n - 2).Clear Next i ReDim Tabl(3, i_n) For i = i_0 To i_n Tabl(1, i) = Trim(Cells(i, 1)) Tabl(2, i) = Trim(Cells(i, 2)) k = k + 1 Tabl(3, i) = k Next i k = 0 For i = i_0 To i_n If Tabl(1, i) <> "" Then j_k = i_0 + k + 1 For j = j_k To i_n If Tabl(1, i) = Tabl(2, j) Then k = k + 1 If i_0 + k > i_n Then Exit For Temp1$ = Tabl(1, i_0 + k) Temp2$ = Tabl(2, i_0 + k) Temp3$ = Tabl(3, i_0 + k) Tabl(1, i_0 + k) = Tabl(1, j) Tabl(2, i_0 + k) = Tabl(2, j) Tabl(3, i_0 + k) = Tabl(3, j) Tabl(1, j) = Temp1 Tabl(2, j) = Temp2 Tabl(3, j) = Temp3 End If Next j End If Next i j0 = 1 ReDim Preserve Der(i_n, 2, 1) For i1 = 1 To i_n sovpal = 0 If Tabl(1, i1) <> "" Then For i = 1 To i_n For j = 1 To UBound(Der, 3) If Der(i, 1, j) & Der(i, 2, j) = Tabl(1, i1) & Tabl(3, i1) Then sovpal = sovpal + 1 End If Next j Next i If sovpal = 0 Then If Tabl(2, i1) = "" Then Der(1, 1, 1) = Tabl(1, i1) i3 = 1 Else For i = 1 To i_n - 1 For j = 1 To UBound(Der, 3) If Der(i, 1, j) = Tabl(2, i1) And Tabl(2, i1) <> "" Then If UBound(Der, 3) < j + 1 Then ReDim Preserve Der(i_n, 2, j + 1) For i2 = i_n - 1 To i + 1 Step -1 For j2 = UBound(Der, 3) To j0 + 1 Step -1 Der(i2 + 1, 1, j2) = Der(i2, 1, j2) Der(i2 + 1, 2, j2) = Der(i2, 2, j2) Der(i2, 1, j2) = "" Der(i2, 2, j2) = "" Next j2 Next i2 i3 = i Else i2 = i Do While i2 < i_n For j2 = j To UBound(Der, 3) If Der(i2, 1, j2) <> "" Then i3 = i2 End If Next j2 If Der(i2 + 1, 1, j) <> "" Then Exit Do i2 = i2 + 1 Loop For i2 = i_n - 1 To i3 + 1 Step -1 For j2 = UBound(Der, 3) To j0 + 1 Step -1 Der(i2 + 1, 1, j2) = Der(i2, 1, j2) Der(i2 + 1, 2, j2) = Der(i2, 2, j2) Der(i2, 1, j2) = "" Der(i2, 2, j2) = "" Next j2 Next i2 End If Der(i3 + 1, 1, j + 1) = Tabl(1, i1) Tabl(1, i1) = "" ' убираем повторы Tabl(2, i1) = "" ' убираем повторы Der(i3 + 1, 2, j + 1) = Tabl(3, i1) End If Next j Next i End If End If End If Next i1 Cells(i_0, 4) = Cells(i_0, 1) For i = 1 To UBound(Der) For j = 1 To UBound(Der, 3) If Der(i, 1, j) <> "" Then Cells(i + i_0, j + 4) = Der(i, 1, j) If i_n < i Then i_n = i If j_n < j Then j_n = j End If Next j Next i For i = 7 To 10 Cells(i_0, 4).Resize(i_n - i_0 + 2, j_n - 3).Borders(i).Weight = xlThin Next i End Sub
Уважаемые форумчане, добрый день! Ранее нашел в этой ветке чудесный инструмент, он мне очень помог и пригодился в работе, однако при использовании была выявлена проблема. Очень прошу помочь её решить: Суть: есть два столбца с данными. В левом - "Деталь", точнее номер её чертежа, в правом деталь на уровень выше - "Сборка" или номер сборки. Ну понятно, что в какой-то момент деталь может состоять из других деталей, на уровень выше, а может и не иметь внутренностей. При запуске Макроса дерево деталей строится не совсем корректно, а именно - описание в файле.Строчка 458 Прошу пока не обращать внимание на столбец "W" и на кнопку "Извлечь сквозной номер", сквозные номера это немного другая история.
Скорее всего тут должен быть добавлен еще один или несколько дополнительных циклов. Помогите пожалуйста.
Уважаемые форумчане, добрый день! Ранее нашел в этой ветке чудесный инструмент, он мне очень помог и пригодился в работе, однако при использовании была выявлена проблема. Очень прошу помочь её решить: Суть: есть два столбца с данными. В левом - "Деталь", точнее номер её чертежа, в правом деталь на уровень выше - "Сборка" или номер сборки. Ну понятно, что в какой-то момент деталь может состоять из других деталей, на уровень выше, а может и не иметь внутренностей. При запуске Макроса дерево деталей строится не совсем корректно, а именно - описание в файле.Строчка 458 Прошу пока не обращать внимание на столбец "W" и на кнопку "Извлечь сквозной номер", сквозные номера это немного другая история.
Скорее всего тут должен быть добавлен еще один или несколько дополнительных циклов. Помогите пожалуйста.Geminus