Страницы: 1
RSS
Определение что в найденных частях строки. отсутствуют ее начальные части VBA
 
Всем привет еще раз. Что-то я застрял сегодня на этих адресах. Еще одна тема с жутким названием). Суть - есть адресная строка, после прогонки через программу, рядом выдаются найденные блоки. Но может так получится, что программа не нашла улицу, населенный пункт (пример в файле). Как определить это отсутствие? На первый взгляд задача вообще не благодарная, кажется придется сперва собрать найденные блоки в строку, а потом сравнивать.
Может попробовать косвенно - типа полученная длина строки меньше начальной?
 
Но ведь прошлая тема об этом же?
 
Нет, теперь как бы обратная задача. Посложнее мне кажется.

Думаю что-то такое: исходная строка имеет постоянные разделители в виде запятых. Проверить все части между запятыми на наличие в столбцах C:P. Если строка встречается хотя бы раз, значит ОК. Если строка не встречается ни разу - вывести в столбец Q все не найденные части.
И сжать пробелы применить, чтобы точно попасть.
Изменено: Laider - 21.05.2018 22:53:15
 
Такой очень простой макрос:
Код
Option Explicit

Sub naydi_chego_net()
Dim vim%, i%, strk&: strk = 1
Dim tkct$, tbl
Dim nayd As Range

    Application.ScreenUpdating = False
    Do Until Trim(Range("A" & strk).Value) = ""
        tkct = ""
        tbl = Split(Trim(Range("A" & strk).Value), ",", -1, 1)
        vim = UBound(tbl)
        For i = 0 To vim
            Set nayd = Range("b" & strk & ":p" & strk).Find(Trim(tbl(i)), Range("b" & strk), xlValues, xlWhole, xlByColumns)
            If nayd Is Nothing Then
                tkct = tkct & "," & Trim(tbl(i))
                If Left(tkct, 1) = "," Then tkct = Right(tkct, Len(tkct) - 1)
                Range("q" & strk).Value = tkct
            End If
            Set nayd = Nothing
        Next
        strk = strk + 1
    Loop
    Application.ScreenUpdating = True
End Sub
 
ocet p, спасибо. Еще пара уточняющих вопросов
1. Как быть с последним сочетанием строке, после него запятой нет и его определяет как не найденный неверно.
2. Как посчитать сколько не найденных блоков было выведено в столбец Q
 
к пункту 1

Я не совсем понимаю:
чего код не находит ?
и
при каких обстоятельствах ?

может быть, какой-то пример в книге excel ?

к пункту 2
Код
Option Explicit

Sub naydi_chego_net()
Dim vim%, i%, chsl_nenayd%, strk&: strk = 1
Dim itogo&: itogo = 0                           'itogo ne naydennykh
Dim tkct$, tbl
Dim nayd As Range

    Application.ScreenUpdating = False
    Do Until Trim(Range("A" & strk).Value) = ""
        chsl_nenayd = 0                         'chislo ne naydennykh
        tkct = ""
        tbl = Split(Trim(Range("A" & strk).Value), ",", -1, 1)
        vim = UBound(tbl)
        For i = 0 To vim
            Set nayd = Range("b" & strk & ":p" & strk).Find(Trim(tbl(i)), Range("b" & strk), xlValues, xlWhole, xlByColumns)
            If nayd Is Nothing Then
                chsl_nenayd = chsl_nenayd + 1   'chislo ne naydennykh
                tkct = tkct & "," & Trim(tbl(i))
                If Left(tkct, 1) = "," Then tkct = Right(tkct, Len(tkct) - 1)
                Range("q" & strk).Value = tkct
            End If
            Set nayd = Nothing
        Next
        Range("r" & strk).Value = chsl_nenayd   'chislo ne naydennykh
        itogo = itogo + chsl_nenayd             'itogo ne naydennykh
        strk = strk + 1
    Loop
    Range("r" & strk).FormulaR1C1 = "=sum(r[" & 1 - strk & "]c:r[-1]c)" 'itogo ne naydennykh - variant I
    Range("r" & strk).Offset(0, 1).Value = itogo                        'itogo ne naydennykh - variant II
    Application.ScreenUpdating = True
End Sub
 
Поменялся принцип чистки строк, и вместо запятых - пробелы и теперь двухсоставные адреса типа Карла Маркса кидает в ошибку. Думаю заменить пробелы назад на запятые, или есть другой маневр?
Изменено: Laider - 25.05.2018 19:25:39
Страницы: 1
Наверх