Страницы: 1
RSS
Автозаполнение строк из одной таблицы в другую по условию или же формулами
 
Всем, привет!!!
Суть проблемы: необходимо перенести данные из таблицы 2 в таблицу 1. В ячейку таблицы 1 вводится только номер этажа, а дальше автоматом вставляется марка стен (стена 1, стена 2 и на каждом этаже их может быть разное количество), следом вставляется класс бетона для этих стен, следом объем бетона проектный и расчетный, и далее считается вес арматуры одинаковых диаметров (у каждой марки стен, может быть разное количество диаметров арматуры и они могут повторяться).  
 
Вы бы показали как должно быть, а то в таблице 1 много ячеек, я аж растерялся в какую из них
Цитата
Valdis написал:
вводится только номер этажа
, тем более этаж в этой самой таблице уже указан
"Все гениальное просто, а все простое гениально!!!"
 
Извиняюсь, за не доработку!!!))))
 
Valdis, объединенные ячейки это зло от них нужно избавиться... формат таблицы  № 2 можно менять для решения вопроса ?
Изменено: Mershik - 22.01.2020 09:31:18
Не бойтесь совершенства. Вам его не достичь.
 
Фома должна оставаться исходной, я так понимаю проблема, где стоит номер этажа??? Какое предложение по изменению формата таблицы 2??
 
Valdis,
Цитата

объединенные ячейки это зло от них нужно избавиться
Изменено: Mershik - 22.01.2020 09:44:56
Не бойтесь совершенства. Вам его не достичь.
 
Если есть решение, то можно поменять формат!!!
 
Код
Function Стена() As String
    Стена = ""
    
    Dim n As Long
    n = Application.Caller.Row
    
    Dim a As Variant
    a = Range(Cells(1, 1), Cells(n - 1, 1))
    
    Dim y As Long
    Dim z As Long
    Dim c As Long
    Dim b As Variant
    Dim w As Variant
    c = 0
    For y = n - 1 To 1 Step -1
        If InStr(a(y, 1), " этаж") > 0 Then
            With Sheets("ТАБЛИЦА 2")
                On Error Resume Next
                    z = WorksheetFunction.Match(a(y, 1), .Columns(2), 0)
                On Error GoTo 0
                If z > 0 Then
                    b = .Range(.Cells(1, 1), .Cells(.Rows.Count, 3).End(xlUp))
                    w = z + 1
                    Do
                        If w > UBound(b, 1) Then Exit Do
                        If b(w, 2) <> "" And b(w, 3) = "" Then Exit Do
                        
                        If b(w, 1) <> "" Then
                            c = c + 1
                            If c = n - y Then
                                .Select
                                Стена = b(w, 1)
                                Exit Do
                            End If
                        End If
                        w = w + 1
                    Loop
                End If
            End With
            Exit For
        End If
    Next
End Function
Вариант через UDF.
 
Вставляю код, но ни чего не выходит((( пишет нет аргумента данной функции...
Можете пояснить что то не так???
 
В А6 листа ТАБЛИЦА 1 напишите формулу =Стена()
 
Я правильно понимаю, что остальные колонки можно по такому же принципу заполнить??? И не получиться всю строку автоматически заполнить????
 
Если нужны значения для других столбцов, то надо использовать этот код:
Код
Function Стена() As String
    Стена = ""
    
    Dim n As Long
    n = Application.Caller.Row
    
    Dim a As Variant
    a = Range(Cells(1, 1), Cells(n - 1, 1))
    
    Dim y As Long
    Dim z As Long
    Dim c As Long
    Dim b As Variant
    Dim w As Variant
    c = 0
    For y = n - 1 To 1 Step -1
        If InStr(a(y, 1), " этаж") > 0 Then
            With Sheets("ТАБЛИЦА 2")
                On Error Resume Next
                    z = WorksheetFunction.Match(a(y, 1), .Columns(2), 0)
                On Error GoTo 0
                If z > 0 Then
                    b = .Range(.Cells(1, 1), .Cells(.Rows.Count, 3).End(xlUp))
                    w = z + 1
                    Do
                        If w > UBound(b, 1) Then Exit Do
                        If b(w, 2) <> "" And b(w, 3) = "" Then Exit Do
                        
                        If b(w, 1) <> "" Then
                            c = c + 1
                            If c = n - y Then
                                Стена = w 'b(w, 1)
                                Exit Do
                            End If
                        End If
                        w = w + 1
                    Loop
                End If
            End With
            Exit For
        End If
    Next
End Function
Эта функция возвращает строку искомого значения.
Зная строку, получаем значения.
Код
А6    =СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена()-1;0)
B6    =СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена()+5;4)
C6    =СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена()+5;12)
D6    =СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена()+5;3)
 
Цитата
МатросНаЗебре
Можете пояснить, что и зачем??? Я так понимаю, что второй код нужно использовать  для ячеек В6, С6, D6???? Или же для этих ячеек использовать эту формулу =СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена()+5;4)????
 
Функция в сообщении #12 вернёт номер строки на листе ТАБЛИЦА2, где находится искомая стена. Зная номер строки, используя функцию СМЕЩ, получаем искомые значения. В ячейки A6, B6, C6 и D6 нужно внести разные формулы, как указано в #12. Потом их можно скопировать в другие строки.
 
Спасибо большое!! А как к этим функциям привязать формулу =СУММЕСЛИМН('ТАБЛИЦА 2'!$J8:$J11;'ТАБЛИЦА 2'!$F8:$F11;I4)???
Сейчас только в место стены в ячейки, пишется номер строки, возможно ли оставить чтоб стена писалась??
 
Цитата
Valdis написал:
только вместо стены в ячейки, пишется номер строки
Это не так. Вставьте в A6 формулу:
Код
=СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена()-1;0)
 
Всё отлично работает!!! Огромное спасибо, только остался один вопрос, можно ли как то увязать формулу =СУММЕСЛИМН('ТАБЛИЦА 2'!$J8:$J11;'ТАБЛИЦА 2'!$F8:$F11;I4, я только смог этой формулой воспользоваться?? Или же только через VBA???
 
Код
=СУММЕСЛИМН(СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();9;4);СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();5;4);I$4)
В I6 и протянуть.
 
А если мне ещё необходимо добавить условие в этот код, так как у меня встречается арматура А500С и А240?? Нужно ещё раз добавить СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена(), но уже с конкретными данными????
 
Код
Для столбцов E:H    =СУММЕСЛИМН(СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();9;4);СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();5;4);I$4;СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();6;4);$E$3)
Для столбцов I:S    =СУММЕСЛИМН(СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();9;4);СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();5;4);I$4;СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена();6;4);$I$3)
 
Цитата
МатросНаЗебре написал:
Для столбцов E:H
Для этих столбцов, не получается расчет???
 
Получается. Формула в #20.
 
Спасибо, ещё раз!! Очень сильно помогли!!! Всё работает))))  
 
Можно смещение вычислять от следующей строки.

B6      =СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена2(C6)+Стена2(C7)-Стена2(C6)-2;4)
Код
Function Стена2(r As Range) As String
    Стена2 = ""
    
    Dim n As Long
    n = r.Row
    
    Dim a As Variant
    a = Range(Cells(1, 1), Cells(n - 1, 1))
    
    Dim y As Long
    Dim z As Long
    Dim c As Long
    Dim b As Variant
    Dim w As Variant
    c = 0
    For y = n - 1 To 1 Step -1
        If InStr(a(y, 1), " этаж") > 0 Then
            With Sheets("ТАБЛИЦА 2")
                On Error Resume Next
                    z = WorksheetFunction.Match(a(y, 1), .Columns(2), 0)
                On Error GoTo 0
                If z > 0 Then
                    b = .Range(.Cells(1, 1), .Cells(.Rows.Count, 3).End(xlUp))
                    w = z + 1
                    Do
                        If w > UBound(b, 1) Then Exit Do
                        If b(w, 2) <> "" And b(w, 3) = "" Then Exit Do
                        
                        If b(w, 1) <> "" Then
                            c = c + 1
                            If c = n - y Then
                                Стена2 = w 'b(w, 1)
                                Exit Do
                            End If
                        End If
                        w = w + 1
                    Loop
                End If
            End With
            Exit For
        End If
    Next
End Function
 
Получается, что для каждой ячейки нужно вычислить смещение???? Если в таблицу 2 добавляю ещё стены, то в таблице 1, последнюю стену не считает, пока ещё не добавишь стену...
Изменено: Valdis - 28.01.2020 15:36:49
 
Код
Для E6:H6      =СУММЕСЛИМН(СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена2(E7)-7;9;4);СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена2(E7)-7;5;4);E$4;СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена2(E7)-7;6;4);$E$3)
Код
Для I6:S6      =СУММЕСЛИМН(СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена2(I7)-7;9;4);СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена2(I7)-7;5;4);I$4;СМЕЩ('ТАБЛИЦА 2'!$A$1;Стена2(I7)-7;6;4);$I$3)
Страницы: 1
Наверх