Страницы: 1
RSS
Найти неопределенное множество строк между определенными значениями
 
Есть два листа, один из которых - рабочий с формулами, второй - в текстовом виде и выглядит так:
Цитата
.......
7
Адрес организации
603011
НИЖЕГОРОДСКАЯ ОБЛАСТЬ
Г. НИЖНИЙ НОВГОРОД
Ш. СОРМОВСКОЕ
ДОМ 99
ЭТАЖ 9 ПОМЕЩЕНИЕ 1 ПОДПОМЕЩЕНИЕ 11
8
..........
В качестве результата нужно все, что находится ниже "Адрес организации" и до цифры "8". Когда была необходимость поиска одной строки, формула выглядела так:
Код
=ИНДЕКС(БАЗА!A:A;ПОИСКПОЗ("Адрес организации";БАЗА!A:A;0)+1;)

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

Какой формулой можно добиться нужного результата? Заранее спасибо!
 
Цитата
Jake: Есть два листа
есть 2 стула …  :D
Файл-пример сделайте или будете долго ждать
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Не знаю, что именно Вам нужно, но если надо так же несколько строк перенести одна за другой между числами, как в примере, то можно так:
Код
=ЕСЛИ(ПОИСКПОЗ("Адрес организации";БАЗА!A:A;0)+СТРОКА(A1)<ПОИСКПОЗ(9^9;БАЗА!A:A);ИНДЕКС(БАЗА!A:A;ПОИСКПОЗ("Адрес организации";БАЗА!A:A;0)+СТРОКА(A1););"")

записываете в первую ячейку и протягиваете на максимально возможное кол-во строк. Те, что без адреса останутся пустыми.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
записываете в первую ячейку и протягиваете на максимально возможное кол-во строк. Те, что без адреса останутся пустыми.
К сожалению такое многострочное решение не подходит, так как в принципе получаем уже то, что и так имеем

Цитата
Jack Famous написал: =ИНДЕКС(БАЗА!A:A;ПОИСКПОЗ("Адрес организации";БАЗА!A:A;0)+1;)
Все в принципе уже описано, но раз так - добавил)
 
Цитата
Jake: Все в принципе уже описано, но раз так - добавил)
вы чё - прикалываетесь? Вам ТАК надо?
удачи в поисках решения…
Изменено: Jack Famous - 02.03.2021 13:35:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jake написал:
такое многострочное решение не подходит, так как в принципе получаем уже то, что и так имеем
а вот и нет. Моя формула универсальная и если её протянуть, то получим все строки адреса, сколько бы этих строк между двумя цифрами не было. А пока Вы не покажете каким хотите видеть результат - сидеть и накидывать всевозможных решений желания ноль.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Jack Famous,  нужно решение формулой с выводом результата в одну строку. Не понял суть претензий..
 
Цитата
Jake написал:
нужно решение формулой с выводом результата в одну строку
Во-о-о-от! Так бы сразу и написали. Изначально-то звучало вот как:
Цитата
Jake написал:
В качестве результата нужно все, что находится ниже "Адрес организации" и до цифры "8".
без всякой конкретики по одной строке.
По теме: либо с доп.столбцом, либо макросами. Ну и еще вариант - если укажете версию офиса, то в более новых можно попробовать и формулами извернуться.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал: Ну и еще вариант - если укажете версию офиса, то в более новых можно попробовать и формулами извернуться.
Офис 2019, подойдет любой из вариантов который позволит добиться адреса в одной строке
 
Цитата
Jake написал:
подойдет любой из вариантов
тогда с доп.столбцом - работать будет в любой версии.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
кажется лучше уже макрос)
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
тогда с доп.столбцом - работать будет в любой версии.
Спасибо, я так понимаю если будет нужно восстановить формат как в базе (1 строка но с переносами строк), то с формулой будет совсем непросто..

Наверное действительно, надо как-то думать о реализации макросом  :sceptic:  
 
Jake, рекомендую файл-пример показать несколько вариантов и ЖЕЛАЕМЫЙ результат так же показать, я же не думаю что у вас одна организация, хотя судя по этому это выписка из ЕГРЮЛ
Изменено: Mershik - 02.03.2021 16:44:19
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, да, все верно.

Желаемый результат
Цитата
603011
НИЖЕГОРОДСКАЯ ОБЛАСТЬ
Г. НИЖНИЙ НОВГОРОД
Ш. СОРМОВСКОЕ
ДОМ 99
ЭТАЖ 9 ПОМЕЩЕНИЕ 1 ПОДПОМЕЩЕНИЕ 11
в одной ячейке
Изменено: Jake - 02.03.2021 16:48:03
 
Jake, почему сразу не  писать что нужно из выписки сделать то и то ..и сразу понятнее становится всем
Код
Sub mrshkei()
Dim arr, i As Long, n as long lr As Long
With Worksheets("База")
lr = .Cells(Rows.Count, 1).End(xlUp).Row
arr = .Range("A1:A" & lr)
For i = LBound(arr) To UBound(arr)
    If arr(i, 1) = 7 Then
        For n = 1 To lr
            If arr(i + n, 1) <> 8 Then
            If arr(i + n, 1) <> "" Then
                x = x & arr(i + n, 1) & vbLf
            End If
            Else
                Worksheets("Лист1").Range("B2") = x
                Exit Sub
            End If
        Next n
    End If
Next i
End With
End Sub



Изменено: Mershik - 02.03.2021 16:55:59 (lдобавил проверку на пустую строку)
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Jake написал:
1 строка но с переносами строк
да просто формулу на такую замените и все:
Код
=ЕСЛИ(ПОИСКПОЗ("Адрес организации";БАЗА!A:A;0)+СТРОКА(A1)<ПОИСКПОЗ(9^9;БАЗА!A:A);ИНДЕКС(БАЗА!A:A;ПОИСКПОЗ("Адрес организации";БАЗА!A:A;0)+СТРОКА(A1);)&СИМВОЛ(10);"")
и в ячейке с итоговой формулой не забудьте в формате ячейки перенос на строки поставить.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Sub FullAdres()
Dim FoundAdres As Range
Dim FAdr As Long
Dim EAdr As Long
Dim i As Long
     Columns(2).ClearContents
  With Worksheets("БАЗА")
    Set FoundAdres = .Columns(1).Find("Адрес организации", , xlValues, xlWhole)
      FAdr = FoundAdres.Row + 1
      EAdr = .Columns(1).Find("8", FoundAdres).Row - 1
      For i = FAdr To EAdr
        Range("B2") = Range("B2") & Chr(10) & .Cells(i, 1)
      Next
  End With
End Sub
 
Mershik, Спасибо! Там была пропущена запятая в Dim и результатом вылезало лишняя строка с которой искать и начинаем, сейчас так
Код
Sub mrshkei()
Dim arr, i As Long, n As Long, lr As Long
With Worksheets("База")
lr = .Cells(Rows.Count, 1).End(xlUp).Row
arr = .Range("A1:A" & lr)
For i = LBound(arr) To UBound(arr)
    If arr(i, 1) = 7 Then
        For n = 2 To lr
            If arr(i + n, 1) <> 8 Then
            If arr(i + n, 1) <> "" Then
                x = x & arr(i + n, 1) & vbLf
            End If
            Else
                Worksheets("Лист1").Range("B2") = x
                Exit Sub
            End If
        Next n
    End If
Next i
End With
End Sub
Пока не понял как убрать пустой CR/LF после последней строки, и начинать именно с "Адрес организации" а не между 7 и 8, т.к. по тексту большая вероятность ошибок. И самое главное, не знаю как вызвать из строки формулой не запуская из меню Модулей  :(  Это наверное функция нужна?
 
Цитата
Jake написал:
Пока не понял как убрать пустой CR/LF после последней строки, и начинать именно с "Адрес организации"
Код
замените 
Worksheets("Лист1").Range("B2") = x
на
Worksheets("Лист1").Range("B2") = Left(x, Len(x) - 1)
Цитата
Jake написал:
а не между 7 и 8, т.к. по тексту большая вероятность ошибок.
а на чем заканчивать ?
Цитата
Jake написал:
И самое главное, не знаю как вызвать из строки формулой не запуская из меню Модулей    Это наверное функция нужна?
тогда нужно в UDF переделывать, но вопросы остаются
Не бойтесь совершенства. Вам его не достичь.
 
Kuzmich, еще один вариант, спасибо!

Mershik, Начинать с с "Адрес организации" и заканчивать на единственной "8" в строке
 
Jake, чет состряпал, но поря уходить
Код
Function myaddress(rng As Range) As String
Dim cell As Range
For Each cell In rng
    If cell = "Адрес организации" Then
        x1 = 1: GoTo XXX
    End If
    If x1 = 1 And cell <> 8 Then
        myaddress = myaddress & cell & vbLf
    ElseIf x1 = 1 And cell = 8 Then
         myaddress = Left(myaddress, Len(myaddress) - 1)
        Exit For
    End If
XXX:
Next cell
End Function
Изменено: Mershik - 02.03.2021 18:00:29
Не бойтесь совершенства. Вам его не достичь.
 
а можно пример более обширный? Ну и указать размер базы реальный.
Изменено: БМВ - 02.03.2021 20:18:31
По вопросам из тем форума, личку не читаю.
 
БМВ, это часть данных из файла ЕГРЮЛ
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Mershik написал:
БМВ , это часть данных из файла ЕГРЮЛ
вот и хочу понять какая часть :-)
По вопросам из тем форума, личку не читаю.
 
БМВ,  ну так раздел "Место нахождения и адрес юридического лица" и там 7 и 8 пункты) типа как на картинике
Изменено: Mershik - 02.03.2021 20:25:35
Не бойтесь совершенства. Вам его не достичь.
 
=IF(MATCH(8;БАЗА!A:A;)-1-MATCH("Адрес организации";БАЗА!A:A;)>0;INDEX(БАЗА!A:A;MATCH("Адрес организации";БАЗА!A:A;)+1);"")&
IF(MATCH(8;БАЗА!A:A;)-1-MATCH("Адрес организации";БАЗА!A:A;)>1;CHAR(10)&INDEX(БАЗА!A:A;MATCH("Адрес организации";БАЗА!A:A;)+2);"")&
IF(MATCH(8;БАЗА!A:A;)-1-MATCH("Адрес организации";БАЗА!A:A;)>2;CHAR(10)&INDEX(БАЗА!A:A;MATCH("Адрес организации";БАЗА!A:A;)+3);"")&
IF(MATCH(8;БАЗА!A:A;)-1-MATCH("Адрес организации";БАЗА!A:A;)>3;CHAR(10)&INDEX(БАЗА!A:A;MATCH("Адрес организации";БАЗА!A:A;)+4);"")&
IF(MATCH(8;БАЗА!A:A;)-1-MATCH("Адрес организации";БАЗА!A:A;)>4;CHAR(10)&INDEX(БАЗА!A:A;MATCH("Адрес организации";БАЗА!A:A;)+5);"")&
IF(MATCH(8;БАЗА!A:A;)-1-MATCH("Адрес организации";БАЗА!A:A;)>5;CHAR(10)&INDEX(БАЗА!A:A;MATCH("Адрес организации";БАЗА!A:A;)+6);"")


Добавить строчек по вкусу

Разумеется для свежих версий можно сделать и вложенность а для последних и совсем красиво использовать TEXTJOIN
Изменено: БМВ - 02.03.2021 20:46:28
По вопросам из тем форума, личку не читаю.
 
Цитата
Mershik написал:
чет состряпал, но поря уходить
Это очень круто, спасибо!!

БМВ, благодарю за вариант!
Страницы: 1
Наверх