Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Оптимизировать работу макросов неточного сравнения
 
Ап. Есть у кого идеи как все-таки ускорить макросы сравнения?
Оптимизировать работу макросов неточного сравнения
 
Цитата
Inexsu написал:
Мой пост был про скорость
Да, теперь макрос по номерам работает быстрее. Но основной вопрос в скорости работы макросов сравнения названий (модуль 6 и 7). В любом случае - спасибо.
Оптимизировать работу макросов неточного сравнения
 
Не работает. Все равно добавляет ' во все ячейки удаляемого диапазона вне зависимости от столбика если в нем есть хоть одна ячейка из [i:q].
Оптимизировать работу макросов неточного сравнения
 
Виноват, было 11 с чем то тыс пустых строк. Простите. Прошу помочь.
Изменено: msdoser - 04.10.2017 14:44:11
Оптимизировать работу макросов неточного сравнения
 
Поменял, оставил 1 вопрос по поводу просчета совпадений и оптимизации этого процесса. С файлом экселя извините ничего сделать не могу, он не уменьшиться меньше 100 кб, там и  так инфы нету.
Изменено: msdoser - 04.10.2017 14:34:24
Оптимизировать работу макросов неточного сравнения
 
Добрый день.
В прикрепленных файл экселя в котором готовится база компаний по ряду реквизитов.

Вопрос следующий:

В эксель файл внедрено ряд макросов, в том числе два макроса (модуль 6 и 7) для неточного поиска совпадений по именной части названия (столбец С) с выводом результатов в 3 столбика (F - номер строчки с компанией, с именной частью которой есть наибольшее совпадение; G - процентный шанс совпадения именной части названия; H - вывод значения именной части названия компании с которой есть наибольшее совпадение). Что примечательно - оно делает поиск совпадений без учета названия компании из которой оно берет текст для поиска. Как оно работает (вкратце): разбивает искомое название на максимально возможное кол-во комбинаций последовательных символов и ищет максимально возможное кол-во совпадений с комбинациями символов из других названий из списка (столбец С) без учета исходного. Опытным путем было определено (и настроено), чтоб для поиска использовались комбинации по 3 последовательных символа. Результат работы макросов полностью подходит для поставленных задач и (опять таки опытным путем) было определено, что надо обращать внимание на совпадения со значением более 85% (оптимальный процент для определения "вероятного совпадения названия").
Проблема: при "растягивании" формул в столбцах F, G и H на 10 и более строк (при кол-ве названий компаний более 1000 позиций) макросы банально вешаются (поправка: на крутом пк оно выдает просчеты 1 строка /сек, что также есть относительно медленно если надо произвести подобные расчеты для 1000 и более названий компаний).
Задача: возможно ли повысить производительность макросов для просчета схожести названий компаний (модуль 6 и 7)?
Изменено: msdoser - 04.10.2017 14:47:30
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
kuklp,
просмотрел код, попробовал в разных ячейках листа. Помимо диапазона F:M, в некоторых ячейках вставляет '  а в некоторых - нет. Также, при удалении номера из ячейки диапазона F:M эксель оставляет символ ' в ячейке. Как-то можно этого избежать (при удалении номера из ячейки)?
Изменено: msdoser - 11.09.2017 11:43:24
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
Есть вопрос: теперь после вставки в любую ячейку листа (не только тех, которые с номерами) вначале всех ячеек ставится символ '
Можно ограничить расстановку этого символа по ячейкам кроме ячеек с номерами (дипазон F:M)?
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
kuklp, спасибо, то что надо

Благодарю форум, администрацию и всех отвечающих за Ваши старания. Вы как всегда лучшие.
Изменено: msdoser - 09.09.2017 10:58:44
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
Пробую устаканить код в моей БД. Дайте чуть времени.
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
kuklp,
теперь при вставке номера в столбцы диапазона "F:M" выдает ошибку с отсылкой на код в странице. Скрины в прикрепленных
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
kuklp,
Спасибо Вам. Очень помогли. можно ли первую строчку таблицы исключить из правила? там заголовки столбиков
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
Можно ли 1ю ячейку столбика от этого правила? там просто название столбика и оно стирается.
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
kuklp,
Уважаемый, подскажите, а где в коде нужно менять, чтоб можно было использовать эту прелесть в другом столбике(-ах) (у меня несколько столбиков с номерами в БД, в диапазоне F:M)?
Сравнение схожести текста для работы с большими списками, оптимизация макроса
 
Андрей VG,
Цель постоянного пересчета: предупредить меня о том, что компания уже есть в списке (при учете того, что она может быть написана чуть по другому) и мне не надо вводить еще 29 уже существующих реквизитов и увеличивать кол-во сущностей в таблице.
Скажите, как можно перевести расчет % схожести на кнопку? Возможно это будет как вариант решения проблемы.
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
Кнопка цитирования не для ответа [МОДЕРАТОР]

а как им пользоваться?) пытаюсь прописать функцию Worksheet_changae() но оно не работает
Сравнение схожести текста для работы с большими списками, оптимизация макроса
 
Jack Famous,
Сразу уточняю: списков не 2. В том и проблема, что нету "словаря" для сравнения. Текстовое значение для сравнения находится в том же диапазоне где проводится поиск/Сравнение. Если дублировать столбик с названиями и превратить его в "словарь", то по результату работы двух предложенных решений из этих топиков станет 100% совпадение со своим клоном из списка-словаря. Цель достигнута не будет.
Сравнение схожести текста для работы с большими списками, оптимизация макроса
 
В прикрепленных файл примера сравнения схожести текста из каждой ячейки с ячейками из того же столбика без учета ячейки, откуда был взят текст для поиска.
В соседних трех столбиках получаем номер строчки с ячейкой в которой находится текст с наибольшей схожестью, процентный показатель схожести и собственно "трансляцию" текста из ячейки с наибольшей схожестью.
При использовании данных макросов и формул, при работе со списками более 500+ строк, после добавления новой строчки оно уводит Excel в пересчет всех показателей схожести по всем строчкам с загрузкой процессора на 100%. Я понимаю, что это логичное действие от Excel и скорее всего этого избежать не получится, но возможно ли оптимизировать работу макросов и формул без ущерба результату? Или минимизировать время обработки данных макросами?
Есть идеи?
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
kuklp,
все что нашел - про формулы, которые работают на основе входных данных из других ячеек. Такое не подходит. Есть идеи про преобразование внутри буфера обмена?
После вставки текста с цифрами/символами в ячейке оставить только цифры
 
Как сделать, чтоб после вставки номера типа "+7 (00822) 123-45-67" через ctrl+v в ячейку оствалось "7008221234567" с автоматическим удалением всех нецифровых символов?
В интернете смотрел, на форумах смотрел, на данный момент пользуюсь 2-мя дополнительными ячейками, в одну из которых вставляю номер, а во второй высвечиваются только цифры, которые потом копирую в нужную ячейку. Удобно, но только при небольших кол-вах.
Подскажите, можно ли реализовать эту "очистку" сразу во время вставки из буфера? Особенность: некоторые номера начинаются с цифры 0, нужно чтоб в таком случае "0" также оставался (а не исчезал, как при числовом форматировании текста).
Буду признателен за ответы, наводки, подсказки.
Как сразу найти все адреса эл.почты содержащие определенные домейны
 
vadim801,
Не знаю, насколько это решение будет "изящно", но оно работает и суть следующая:
Есть список мейлов клиентов в столбике "А". В стобике "В" есть "черный список" доменов, на мейлы которых отправлять запрещено.
На примере строчки 2 из прикрепленного файла через формулу
Код
=ЕСЛИ(ЕОШИБКА(ЕСЛИ(ВПР(ПРАВСИМВ(A2;ДЛСТР(A2)-НАЙТИ("@";A2;НАЙТИ("@";A2)));B:B;1;0)=ПРАВСИМВ(A2;ДЛСТР(A2)-НАЙТИ("@";A2;НАЙТИ("@";A2)));"";A2))=ИСТИНА;A2;"")

оно в столбике "С" "проверяет мейл на валидность" с "черным списком" доменов из столбика "В" и если оно проходит проверку - добавляет мейл в ячейку столбика "С". Если оно находит домен выбранного мейла в "черном списке" из столбика "В", то вместо мейла оно просто оставляет ячейку пустой (полностью пустой, даже без пробела).

На этом можно закончить, но(!) если нужно сделать рассылку на все "валидные" адреса, которые прошли проверку на домен, то действуем дальше:
1) вставляем макрос
Код
Function СцепитьЕсли(ByRef Диапазон As Range, ByVal Критерий As String, ByRef Диапазон_сцепления As Range, Optional Разделитель As String = " ", Optional БезПовторов As Boolean = False) As String
    Dim li As Long, sStr As String, avItem, avDateArr(), avRezArr(), lUBnd As Long
    If Диапазон.Count > 1 Then
        avDateArr = Intersect(Диапазон, Диапазон.Parent.UsedRange).Value
        avRezArr = Intersect(Диапазон_сцепления, Диапазон_сцепления.Parent.UsedRange).Value
        If Диапазон.Rows.Count = 1 Then
            avDateArr = Application.Transpose(avDateArr)
            avRezArr = Application.Transpose(avRezArr)
        End If
    Else
        ReDim avDateArr(1, 1): ReDim avRezArr(1, 1)
        avDateArr(1, 1) = Диапазон.Value
        avRezArr(1, 1) = Диапазон_сцепления.Value
    End If
    lUBnd = UBound(avDateArr, 1)
    'Определяем вхождение операторов сравнения в Критерий
    Dim objRegExp As Object, objMatches As Object
    Set objRegExp = CreateObject("VBScript.RegExp")
    objRegExp.Global = False: objRegExp.Pattern = "=|<>|=>|>=|<=|=<|>|<"
    Set objMatches = objRegExp.Execute(Критерий)
    'Если есть вхождения
    If objMatches.Count > 0 Then
        Dim sStrMatch As String
        sStrMatch = objMatches.Item(0)
        Критерий = Replace(Replace(Критерий, sStrMatch, "", 1, 1), Chr(34), "", 1, 2)
        Select Case sStrMatch
        Case "="
            For li = 1 To lUBnd
                If avDateArr(li, 1) = Критерий Then
                    If Trim(avRezArr(li, 1)) <> "" Then _
                       sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
                End If
            Next li
        Case "<>"
            For li = 1 To lUBnd
                If avDateArr(li, 1) <> Критерий Then
                    If Trim(avRezArr(li, 1)) <> "" Then _
                       sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
                End If
            Next li
        Case ">=", "=>"
            For li = 1 To lUBnd
                If avDateArr(li, 1) >= Критерий Then
                    If Trim(avRezArr(li, 1)) <> "" Then _
                       sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
                End If
            Next li
        Case "<=", "=<"
            For li = 1 To lUBnd
                If avDateArr(li, 1) <= Критерий Then
                    If Trim(avRezArr(li, 1)) <> "" Then _
                       sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
                End If
            Next li
        Case ">"
            For li = 1 To lUBnd
                If avDateArr(li, 1) > Критерий Then
                    If Trim(avRezArr(li, 1)) <> "" Then _
                       sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
                End If
            Next li
        Case "<"
            For li = 1 To lUBnd
                If avDateArr(li, 1) < Критерий Then
                    If Trim(avRezArr(li, 1)) <> "" Then _
                       sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
                End If
            Next li
        End Select
    Else    'Если нет вхождения
        For li = 1 To lUBnd
            If avDateArr(li, 1) Like Критерий Then
                If Trim(avRezArr(li, 1)) <> "" Then _
                   sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
            End If
        Next li
    End If
    
    If БезПовторов Then
        Dim oDict As Object, sTmpStr
        Set oDict = CreateObject("Scripting.Dictionary")
        sTmpStr = Split(sStr, Разделитель)
        On Error Resume Next
        For li = LBound(sTmpStr) To UBound(sTmpStr)
            oDict.Add sTmpStr(li), sTmpStr(li)
        Next li
        sStr = ""
        sTmpStr = oDict.keys
        For li = LBound(sTmpStr) To UBound(sTmpStr)
            sStr = sStr & IIf(sStr <> "", Разделитель, "") & sTmpStr(li)
        Next li
    End If
    СцепитьЕсли = sStr
End Function

2) Для рассылки нам нужна одна строчка со всеми собранными адресами из столбика "С" через запятую без учета пустых ячеек.
Для этого (на примере файла из прикрепленных) в ячейке "D1" пишем формулу (работает только при вышеуказанном макросе):
Код
=СцепитьЕсли(C$2:C$1048576;"<>0";C$2:C$1048576;", ";1)

Где
- первые C$2:C$1048576 - диапазон для поиска условия без ячейки с заглавием столбика;
- "<>0" - условие "непустых" ячеек;
- вторые C$2:C$1048576 - диапазон, для выборки значений для сцепки без ячейки с заглавием столбика;
- ", " - разделитель между сцепленными значениями (не забывайте, что для списка мейлов для рассылки, чтоб потом его можно было просто вставить в графу "получатель" в Вашем почтовом ящике нужно указывать разделитель ", " с пробелом);
- 1 - критерий, определяющий "сцепку" только для уникальных значений, то есть в данном случае один и тот же мейл в ячейке-сцепке дважды не повторится.

В результате, в ячейке "D1" мы получили список рассылки через запятую по мейлам, которые прошли проверку на "черный список" доменов (по которым отправлять запрещено).

Всем спасибо. Надеюсь осилили и оно будет Вам полезно.
Изменено: msdoser - 06.09.2017 17:26:14
Динамический отсев вводимых значений с учетом возможного частичного совпадения с раннее внесенными данными, Оптимизация работы с БД
 
Решение, которое я так долго искал:
http://www.excelworld.ru/forum/2-10223-1
Человек на форуме предоставил эксель в котором есть 2 макроса, которые выполняют именно то что нужно, да еще и вычитают сам источник поиска из анализируемого диапазона.
Единственное "но": макрос сравнения схожести при большом кол-ве строк начинает чуть "проседать" в быстродействии.
Кому интересна тема "неточного поиска" и методы его реализации: поищите посты и видео Игоря Бокалова и, в том числе, обратите внимание на программу keycollector (это конечно не эксель, но программа крайне продуктивно работает с фильтрацией и отсевом "неточных дублей" в пределах одного и того же списка). Прошу не воспринимать как рекламу, эти материалы действительно были полезны в планировании дальнейшей работы над моей БД.
Спасибо форуму, администрации и всем, кто отвечал в этой теме.
Тему сохраняю себе на комп. Надеюсь кому-то также будет полезна.
Формула вывода адресов ячеек, которые соответствуют критерию, формула =ячейка
 
Sanja,
Спасибо от всей души. Наверно круто быть Вами.
Формула вывода адресов ячеек, которые соответствуют критерию, формула =ячейка
 
raitnax,
Спасибо, пробую.
Формула вывода адресов ячеек, которые соответствуют критерию, формула =ячейка
 
Sanja, а если меняется диапазон с названиями? В макросе нужно будет менять? или достаточно скорректировать вводимую формулу?

Еще вопрос: если в другой таблице будет использован этот же макрос, но там значения указаны в "%", как сделать отображение в конечной ячейке в скобках в "%"?
Изменено: msdoser - 05.09.2017 11:42:27
Формула вывода адресов ячеек, которые соответствуют критерию, формула =ячейка
 
Sanja,
Мой нижайший поклон. Благодарю. Добра Вам.
Формула вывода адресов ячеек, которые соответствуют критерию, формула =ячейка
 
Есть табличка
н п/пАB
1324Молоко
2400Творог
375Сыр
4120Кефир
5122Ряжанка
6300Сливки
7450Сгущенка
8600Ирис
9330Концентрат
10450Сухое молоко
11Вывод ссылок на ячейки
Пожалуйста, подскажите формулу, через которую в ячейку "А11" можно вывести адреса всех ячеек диапазона "А1:А10" через запятую в порядке убывания по структуре "Ссылка на ячейку из диапазона А1:А10" "(Значение из ячейки диапазона А1:А10)" "Название из диапазона В1:В10", которые больше (но не равны) "300" ?
То есть, в ячейке "А11" должно получится:  А8 (600) Ирис, А7 (450) Сгущенка, А10 (450) Сухое молоко, А2 (400) Творог, А9 (330) Концентрат, А1 (324) Молоко.

Буду благодарен за любую информацию.
Изменено: msdoser - 05.09.2017 10:05:17
Как сразу найти все адреса эл.почты содержащие определенные домейны
 
vadim801, ее нету в этом случае.
Эта формула берет ячейку из столбца "А", берет все символы справа налево до символа "@", куда попадает домен почты, и ищет по всему столбцу "А" совпадения (без учета самой ячейки откуда был взять пример для поиска), после чего 2 варианта:
1) найдено минимум одно совпадение в столбце "А" => оно выдает сообщение "Есть домен";
2) оно не находит повторов по домену в столбце "А" => выдает сообщение "Нету домена".

Фактически, оно в реальном времени проверяет наличие повтора домена почты без наличия словаря.
Вопрос может быть в другом: насколько тебе важно иметь отдельный столбик с доменами? У меня подозрения что они вбиваются руками, как следствие - могут быть ошибки. Если этот отдельный столбец с доменами нужен, то там также можно настроить автоматическое "вытягивание" домена, допустим, в ячейку "С1" после ввода мейла в ячейку "А1" и так по каждой строчке.
Изменено: msdoser - 06.09.2017 11:05:07
Как сразу найти все адреса эл.почты содержащие определенные домейны
 
vadim801,
можно еще так
Код
=ЕСЛИ(СЧЁТЕСЛИ(A:A;"*"&ПРАВСИМВ(A2;ДЛСТР(A2)-НАЙТИ("@";A2;НАЙТИ("@";A2)))&"*")-1>0;"Есть домен";"Нет домена")

Это если нужно работать без столбика доменов.
Изменено: msdoser - 06.09.2017 11:03:59
Динамический отсев вводимых значений с учетом возможного частичного совпадения с раннее внесенными данными, Оптимизация работы с БД
 
Есть файл с макросом. Он показывает коэфициент "схожести" двух ячеек в % (в прикрепленных).
Можно ли используя данный макрос в моем случае, сделать отдельный столбик, где указывались бы адреса ячейки(-ек) с которыми у этого названия наибольший процент совпадения без учета ячейки из которой было взято само значение для поиска?
Код
Option Explicit
Option Base 1

Public Function TextSimilarity(text1 As Variant, text2 As Variant) As Double
' Метрика сходства текстовых строк (0-1)
Dim i As Integer, k As Integer, m As Integer
Dim profile() As Integer
Dim dupVect() As String * 2
Dim txt As String
Dim txtNum As Integer

    ReDim profile(2, Len(text1) + Len(text2) - 2 + 4)
    ReDim dupVect(Len(text1) + Len(text2) - 2 + 4)
    m = 0
    
    txt = " " & text1 & " "
    For txtNum = 1 To 2
        For i = Len(txt) - 1 To 1 Step -1
            For k = 1 To m
                If StrComp(dupVect(k), Mid(txt, i, 2), 1) = 0 Then Exit For '>>>
            Next k
            If k > m Then 'Not found
                m = k 'm + 1
                dupVect(k) = Mid(txt, i, 2)
            End If
            If profile(txtNum, k) = 0 Then
                profile(txtNum, k) = 1
                'profile(txtNum, k) = 2
                'Различия в количестве одинаковых последовательностей
                'в 2 раза менее значимы, чем в их наличии/отсутствии.
            Else
                profile(txtNum, k) = profile(txtNum, k) + 1
            End If
        Next i
    txt = " " & text2 & " "
    Next txtNum
    
Dim sumMax As Integer, sumDif As Integer
    For k = 1 To m
        sumDif = sumDif + Abs(profile(1, k) - profile(2, k))
        If profile(1, k) < profile(2, k) Then
            sumMax = sumMax + profile(2, k)
        Else
            sumMax = sumMax + profile(1, k)
        End If
    Next k
    TextSimilarity = 1 - sumDif / sumMax
    
End Function
Пожалуйста, помогите!
Страницы: 1 2 След.
Наверх