Страницы: Пред. 1 2 3 4 5 6 7 След.
RSS
Подборка функций пользователя
 
БМВ, компилятор напомнит

понятно, что это дело вкуса,но я, если все решение не поместиться в 20-30 строк, предпочитаю разбить процесс на основные процедуры:
- получить данные
- проверить данные
- вычислить результат
- выложить результаты на подготовленное место
получится 4 простых, коротких понятных и легко читаемых процедуры
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
БМВ написал:
в случае переноса, не пропустить чего.
Option Explicit реально рулит.
Слегка похвастаю: актуально - не писать нового, потому что новое нужно тестировать.
Благодаря ТС улучшил свой репозиторий порегуляркам хорошими артефактами. Любой их может использовать в других проектах.
А код ТС (вполне рабочий) использовать - проблематично. Он сложный.
Сравнение прайсов, таблиц - без настроек
 
Ігор Гончаренко, Inexsu,  Напомнит, или не напомнит - не важно. Главное, что при переносе одной функции, не надо ползать. по модулю или модулям, и копировать процедуры дочерние. (про поиск я знаю) .  Ну может про 20-30 строк это перебор (хотя все знают, что мой лимит 10 :-) ), но то что и отлаживать и потом разбираться в такой блочной структуре проще - неоспоримо.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Главное, что при переносе одной функции, не надо ползать. по модулю или модулям, и копировать процедуры дочерние.
Проблема надуманная, но решаемая.
Цитата
БМВ написал:
20-30 строк это перебор (хотя все знают, что мой лимит 10
Число строк - индусский неподходящий ориентир. Мне нравится термин "нулевая сложность".
Есть артефакт:
Код
CreateObject("VBScript.RegExp").Execute
у него нулевая сложность - нечего убрать.
А чтобы он сработал нужен примерно такой декоратор:
Скрытый текст

И у него нулевая сложность (надеюсь) - он чуть направляет  .Execute в нужную сторону.
А чтобы RegExp_Get не имел возможности ошибиться, предлагаю отдельный декоратор:
Скрытый текст

И у него нулевая сложность - не смотря на количество строк, он запускает нужный минимум и возвращает минимум. Надеюсь, тоже нечего отнять(отсечь) в коде?

А те, кто не сталкивался со сложностью сложных проектов, предложат коды двух артефактов соединить в одну процедуру. Они ещё не насытились проблемами преждевременной оптимизации.
Сравнение прайсов, таблиц - без настроек
 
Inexsu, Что вы подразумеваете под Артефакт?
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Что вы подразумеваете под Артефакт?
Подразумеваю процедуру: понятную, надёжную, простую, отлаженную, скромную - готовую к повторному использованию в других цепочках методов, делающую что-то только одно.
Мечта разработчика.
Сравнение прайсов, таблиц - без настроек
 
Inexsu, Типа от значения любой созданный искусственно человеком объект. Скажем так, не совсем привычно мне в этом смысле это слово.
По вопросам из тем форума, личку не читаю.
 
Цитата
Inexsu написал:
код ТС (вполне рабочий) использовать - проблематично. Он сложный.

В чём сложность кода и почему использовать проблематично? Не вижу ни каких проблем, функция работает и выдаёт тот результат, который от неё требуется.
Подредактировал паттерны в связи с возможным окружением извлекаемых конструкций. Конечно все варианты предусмотреть сложно, но в большинстве случаев функция вычисляет верно.
Видоизменил и протестировал код, работает без ошибок. Можно добавить функцию в подборку.

Код
Public Function ExtractUniqueRegExp(DataRange As Range, Optional k As Byte = 1)
'   k: 1 - email; 2 - telephon; 3 - car number; 4 - IP-address; 5 - URL
    Dim Cell As Range, Text As String, Pattern As String, Coll As New Collection, _
        tmp As String, i As Long, j As Long, n As Long, nc As Long, nr As Long
    nr = Application.Caller.Rows.Count: nc = Application.Caller.Columns.Count
    For Each Cell In DataRange
        Text = Text & " " & Cell
    Next Cell
    Text = Replace(Text, Chr(10), " ")
    Select Case k
        Case 1: Pattern = "\b[-\w.%+]+@(?:[-A-Z0-9]+\.)+[A-Z]{2,6}\b"
        Case 2: Pattern = "[^\d+](\+7|8)[- ]?\(?9\d{2}\)?([- ]?\d){7}\b"
        Case 3: Pattern = "[-\s\[\(\/,:;][АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2}([17]?\d{2}|2(77|99))\b"
        Case 4: Pattern = "\b((25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})([,:;\)\]\s]|$)"
        Case 5: Pattern = "\b(https?|ftp):\/\/(\w*:\w*@)?[-\w.]+(:\d+)?(\/([-\w.\/]*(\?\S+)?)?)?"
    End Select
    With CreateObject("VBScript.RegExp")
        .Pattern = Pattern
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        If .Test(Text) Then
            On Error Resume Next
            If nr > 1 Then n = nr Else n = nc
            ReDim uniArr(0 To n - 1, 0 To 0) As String
            For i = 0 To .Execute(Text).Count - 1
                tmp = .Execute(Text)(i)
                Select Case k
                    Case 2: tmp = Replace(Replace(Replace(Replace(Replace(Replace _
                            (tmp, Left(tmp, 1), ""), "+7", "8"), "(", ""), ")", ""), "-", ""), " ", "")
                    Case 3: tmp = Replace(tmp, Left(tmp, 1), "")
                    Case 4: tmp = Replace(Replace(Replace(Replace(Replace(Replace _
                            (tmp, ",", ""), ":", ""), ";", ""), ")", ""), "]", ""), " ", "")
                End Select
                Coll.Add tmp, CStr(tmp)
                If Not IsEmpty(tmp) And Err = 0 Then uniArr(j, 0) = tmp: j = j + 1 Else Err.Clear
            Next i
            If nr > 1 Then ExtractUniqueRegExp = uniArr Else ExtractUniqueRegExp = Application.Transpose(uniArr)
        Else
            ExtractUniqueRegExp = ""
        End If
    End With
End Function
 
Подборка пользовательских функций теперь в архиве.
 
Цитата
Evgenyy написал:
но в большинстве случаев функция вычисляет верно
эта фраза отлично характеризует функцию
представьте, Вы прочитаете в описании функции SIN: в большинстве случаев функция возвращает синус угла, но иногда какую-то фигню
в программировании не бывает "в большинстве случаев" в программировании или да или нет (или 1 или 0), все что не соответстсвует этому принципу не пригодно к эксплуатации
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, Вы опять всё не так поняли, не надо выдёргивать фразы из текста.
Функция работает отлично и выдаёт правильный результат. На результат может повлиять текстовое окружение извлекаемых конструкций, вариантов очень много. Создайте свои идеальные регулярные выражения, вставьте их в функцию, тогда и делайте выводы.
Мой совет: прежде, чем делать такие выводы, читайте Джеффри Фридла!
Изменено: Evgenyy - 09.08.2019 18:17:52
 
Цитата
Evgenyy написал:
В чём сложность кода
Он умный и много делает.
Об этом написано в сообщении 64
Цитата
Evgenyy написал:
Ігор Гончаренко , Вы опять всё не так поняли
А по моим наблюдениям, Ігор Гончаренко, часто понимает лучше меня.
Сравнение прайсов, таблиц - без настроек
 
Цитата
Inexsu написал:
 Ігор Гончаренко , часто понимает лучше меня

Это сарказм, я так понимаю.
 
Evgenyy,
извините, но я не изучал Ваш код, тем более не анализировал его и не мог сделать о нем никаких выводов. не потому что Ваш код плохой, а потому что я с паталогической подозрительностью отношусь к сложному. коду. если простой код можно посмотреть и понять, то сложный нужно сначала понять, а потом еще протестировать правильно-ли я все понял.
я лишь поделился своим соображением, что тем, что  "в большинстве случаев" возвращает правильное значения нельзя пользоваться ни при каких обстоятельствах
то что "в большинстве случаев" считает правильно с точки зрения программирования считает УЖЕ не правильно
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Evgenyy, Думаю Inexsu, хочет декомпозировать, а Ігор Гончаренко получить из строки телефон даже в том случае, когда его там нет :-).
Как уже писал выше, разбить на мелкие функции узкого назначения имеет смысл или в большом коде, или когда эта функция часть библиотеки.
А по поводу работоспособности  - Помню был такой закон из (области Мерфи) Всегда найдется СD Disk который не прочтется СD приводом и всегда найдется СD привод, который не прочтет СD. Так и тут.
Так что мой голос отдаю в поддержку функции. Evgenyy, несмотря на мою критику форматирования примеров :-) продолжайте, полезное дело.
По вопросам из тем форума, личку не читаю.
 
Ігор Гончаренко, я не правильно выразил свои мысли, ну а Вы не так поняли. Теперь я думаю дискуссию по этому поводу можно закончить. Если есть желание, потестируйте функцию и сделайте выводы. Мнение специалиста всегда интересно.
 
БМВ, благодарю за отклик и критику. Критика оппонентов всегда подстёгивает к движению вперёд и совершенству.
 
Цитата
БМВ написал:
продолжайте, полезное дело

Написал две регулярки: одна для извлечения почтовых адресов с индексами; другая для извлечения дат (период с 01.01.1600 по 31.12.2999, месяцы как числом так и текстом). Обе регулярки теперь в функции "ExtractUniqueRegExp". Итого семь конструкций для извлечения в обновлённой пользовательской функции и сама функция в архиве.
 
Архив с последними обновлениями.
 
Привет!

Обратно спасибо.

Не нашёл: сравнение двух столбцов (в разных книгах) с раскраской.
Сравнение прайсов, таблиц - без настроек
 
Цитата
Inexsu написал:
Не нашёл: сравнение двух столбцов (в разных книгах) с раскраской.
Добрый день!
Не понял. Можно по подробней? В каких конкретно книгах и какое сравнение?
Изменено: Evgenyy - 19.08.2019 12:56:46
 
Цитата
Evgenyy написал:
В каких конкретно книгах
в любых
Цитата
Evgenyy написал:
какое сравнение?
например: если ячейки из диапазона 1 нет в диапазоне 2, то покрасить красным.

Может этого у Вас и нет ...
Сравнение прайсов, таблиц - без настроек
 
Цитата
Inexsu написал:
если ячейки из диапазона 1 нет в диапазоне 2, то покрасить красным.
Это конкретно про функцию ExtractUniqueRegExp? Если не трудно представьте свой вариант, как Вы это видите.
 
В этом посте представляю ещё одну пользовательскую функцию: расчёт поправочного коэффициента объёма VCF (Volume Correction Factor, дословно - Фактор Поправки на Объём), в соответствии со стандартом ASTM D 1250.
VCF применяется для подсчёта объёма и веса нефти и нефтепродуктов в береговых резервуарах и танках нефтеналивных судов.
У функции четыре аргумента: первый (Dens) - плотность нефтепродукта при 15 гр.Цельсия в кг/м3 или в кг/л; второй (Temp) - наблюдаемая температура нефтепродукта при замерах в гр.Цельсия; третий (Kind) - вид нефтепродукта (1 - сырая нефть, 2 - бензины, 3 - диз. топливо, авиационный керосин, нафта и др., 4 - мазут, 5 - смазочные масла), опционально = 1; четвёртый (Rank) - точность округления VCF, опционально = 5.
 
Красиво оформлено и разложено по модулям.
 
Цитата
Evgenyy написал:
для подсчёта объёма и веса нефти и нефтепродуктов в береговых резервуарах и танках нефтеналивных судов
молю бога дать возможность применить эту функцию в личных целях :)  
 
Evgenyy,  круто!!! спасибо.
Не бойтесь совершенства. Вам его не достичь.
 
Наполняем подборку функциями.
UDF: Поиск последнего значения в диапазоне
Первый аргумент - диапазон с данными (DataRange), второй аргумент - вид поиска: по столбцам = 1; по строкам = 2; по столбцам и строкам = 3 (SearchOrder), третий аргумент - игнорирование формул, значение которых равны пустой строке: опционально = True (PrEmpForm).
Плюс в обновлённом архиве ещё 3 пользовательских функции: Lotto2, Encrypt, Decrypt.
 
Обновлённый архив (70 функций пользователя):
 
Обновление. Добавлена функция FindFactors - поиск множителей для произведения. Аргументы: DataRange - диапазон с числами-множителями; Prod - значение произведения.
Смотрите в архиве функция с примером.
Страницы: Пред. 1 2 3 4 5 6 7 След.
Наверх