Страницы: 1
RSS
Нужно перенести работу функции в макрос
 
Добрый вечер.

Такая задача встала. В приложении к теме есть файл. В нем есть функция. Нужно перенести эту функцию полностью в макрос.
Нужно что бы макрос работал именно как эта функция. Т.к работать нужно с большими объемами, а протягивать так формулами все неудобно да и это сильно нагружает файл и систему. И еще эта функция не работает с латинницей. Нужно добавить еще латинницу.

Буду очень благодарен за помощь!
Изменено: Fsociety_ - 01.04.2019 21:44:36
 
Fsociety_, в том же файле, что послужил исходником для Вашего примера, есть соответствующий макрос с нужной функцией. Сочетание клавиш ALT и F11 вызовет редактор кода   ;)  
Уж больно здесь красиво, жди беды..
 
Алиса Селезнева, вопрос был как переделать все это в работу макроса, а не как открывать код. Функцию нужно адекватно перенести в работу обычного макроса и добавить распознавание латинских символов..
 
Цитата
Fsociety_ написал: Такая задача встала....Нужно...Нужно что бы макрос работал...Нужно добавить еще латинницу.
Раз 'встала' и 'нужно' так кто мешает? Сами-то что сделали для своего 'нужно'? Что не получается?
Согласие есть продукт при полном непротивлении сторон
 
Sanja,пришел сюда что бы узнать как это сделать. но видимо проще пойти гуглить.  
 
Цитата
Fsociety_ написал: что бы узнать как это сделать
В макросе функции используются точно так же как на листе. Подставляете в нее аргументы и получаете результат
Код
Sub myExample()
With Worksheets("Лист2")
    MsgBox FuzzyVLOOKUP(.Range("A1"), .Range("$E$2:$E$26"), 0, 50) & " - " & FuzzyVLOOKUP(.Range("A1"), .Range("$E$2:$E$26"), 1, 50)
End With
End Sub
Вот примерно так это делается
Согласие есть продукт при полном непротивлении сторон
 
Sanja, это вообще не то. В вашем примере просто вызов этой функции.. еслиб мне так нужно было, я бы давно так сделал. Мне нужно, что бы не работала функция, а работал макрос. из этих функции нужно сделать макрос. Т.к эти функции тормозят. Т.е что бы все обрабатывалось как в обычном макросе. А не что бы макрос вызывал функцию которая все обрабатывает. И msgBox это совсем не то что нужно было.
 
Если я правильно понимаю, топик-стартер просит (просит ли?) помочь ему написать макрос для быстрой обработки массива данных и вывода массива результатов, имитирующих работу функции поиска нечеткого соответствия; но грозится уйти гуглить, если здесь ему не помогут...
 
Цитата
Алиса Селезнева написал:
Fsociety_ , в том же файле, что послужил исходником для Вашего примера, есть соответствующий макрос с нужной функцией.
Цитата
Fsociety_ написал:
Алиса Селезнева , вопрос был как переделать все это в работу макроса, а не как открывать код.
Цитата
Fsociety_ написал:
Sanja ,пришел сюда что бы узнать как это сделать. но видимо проще пойти гуглить.
Цитата
Sanja написал:
Сами-то что сделали для своего 'нужно'? Что не получается?
Цитата
Sanja написал:
В макросе функции используются точно так же как на листе. Подставляете в нее аргументы и получаете результат
Цитата
Fsociety_ написал:
Sanja , это вообще не то. В вашем примере просто вызов этой функции.. если б мне так нужно было, я бы давно так сделал.
fsociety

ПЕРЕВОДЫ ПОЛЬЗОВАТЕЛЕЙ: fsociety=fuck society - название общества хакеров из т/с Мистер Робот, один из вариантов перевода - нахрен общество
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Цитата
Т.к эти функции тормозят.
Неее! тормозят не функции. Тормозит запись-чтение на лист и формулы.
Считывай всё в массивы. Обрабатывай в памяти и вываливай результат на лист
Цитата
Функцию нужно адекватно ...
А адекватно ли работает функция?
При равенстве значений "похожесть" 82,42
Тимофеев   СергейТимофеев Сергей85,42%ИСТИНА
Изменено: Александр Моторин - 02.04.2019 11:54:15
 
IKor,да.
 
Не много поможет шторка экрана ..
Код
Sub FuzzyV()
    Dim rs As Range, i&, mi(), mi_
    With Application.InputBox("Адрес диапазона исходник", , , , , , , 8)
        On Error GoTo exit_
        Set rs = Application.InputBox("Адрес диапазона словарь", , , , , , , 8)
        Application.ScreenUpdating = 0
        mi = .Value: ReDim mi_(UBound(mi), 1): mi_ = mi
        For i = 1 To .Count
            mi(i, 1) = FuzzyVLOOKUP(.Item(i), rs, 0, 50)
            mi_(i, 1) = FuzzyVLOOKUP(.Item(i), rs, 1, 50)
        Next
        .Offset(, 1).Value = mi
        .Offset(, 2).Value = mi_
    End With
exit_:
    Application.ScreenUpdating = 1
End Sub
 
Маугли, то же самое что и #6 сообщение, только в профиль. да и что вы все приколпались к диалоговым окнам, они вообще не нужны. диапазоны должны быть статичны как в файл примере, какой смысл постоянно выделять диапазон для макроса, если он всегда статичен.
Изменено: Fsociety_ - 02.04.2019 13:05:16
 
Цитата
Fsociety_ написал: да и что вы все приколпались ...
Да Вы то к нам что прикопались, раз знаете что, да как!? Вот и дерзайте!
А все за Вас и с нуля, то сроки и бюджет озвучивайте в ЭТОЙ ветке
Согласие есть продукт при полном непротивлении сторон
 
Sanja,а смысл делать то что не нужно если просят совсем о другом.
 
Цитата
Fsociety_ написал: а смысл...
А я Вам скажу. Судя по всему Вы делаете какой-то проект, который принесет Вам какие-то дивиденды (не обязательно материальные), но вкладываться в него не хотите. Понадергали халявных решений и еще халявно пытаетесь их совместить. Бизнес по русски ;)

Да и постановка вопроса таким тоном (Задача..., Нужно... и т.п.) точно не располагает к безвозмездной помощи. Кому Вы ставите Задачу? Кому это Нужно? Здесь не бесплатная решалка хотелок пользователей.

По теме. Вы решение от Маугли, пробовали на реальных данных? В его коде достаточно вместо InputBox'ов сразу вписать готовые диапазоны и будет Вам решение. От того что Вы замените вызов функции из макроса внедрением того же кода в тело макроса время точно не уменьшиться.
Согласие есть продукт при полном непротивлении сторон
 
Sanja, Во первых, я делаю свой проект по контекстной рекламе. Во вторых, я просто хотел узнать как перенести функцию в макрос, я не требовал этого делать. кто хочет тот может помочь объяснить. т.к у меня знаний в этом маловато. В третьих, с макросом гораздо быстрее работает и мне так удобнее, тем более придется работать с большим объемом данных. А если вы заметили то даже в примере с теми 25 ячейками он уже подгружается. У меня данных будет в сотни раз больше и на кону каждая секунда сэкономленная. В примере от Маугли, все тоже самое что и в вашем, это просто обработка листа функцией.. это как раз то что мне вообще не нужно, т.к функцией все дольше работает. И опять же, для меня макросами быстрее и удобнее и как вы сами подметили это проект, у меня в нем еще много других макросов и мне нужно все это вместе заставлять работать. Эта функция выполняет одну часть из общей работы макросов. Я ее нашел на форуме и она почти идеально подходит для моих целей, только мне нужно что бы это было в виде макроса и что бы реагировало на латинницу. Если вы думаете что я пытаюсь заработать на чужих бесплатных трудах и пытаюсь вас заставить делать свою работу, то прошу в ЛС дам скайп и продемонстрирую историю проекта, который пилится еще с 2017 года и имеет кучу версий (никакой клиент не будет заказывать долгострой). Если все это так сложно реализуемо и никто не хочет помочь, пожалуйста, 400 рублей кину за перевод данной функции в макрос именно так как я писал ранее. И никакого "тона" как вы заверяете нету. Я просто конкретно описываю задачу, что бы все понимали что я хочу получить на выходе. Не стал пускать нюни что нужно подсказать и тыкнуть мордой, кто как может тот поможет. Если нужно здесь умолять что бы показали, то делать этого не буду. Я описал как есть, а кто уже как может в нужное направление направит.
Я сразу описал как я хочу получить и что я хочу получить, далее я ожидал только советы как это сделать и возможно ли это сделать и как трудно это делать, либо кто хочет пусть реализует в живой пример. Ваши варианты не подходят т.к они используют просто эту функцию.
 
Цитата
Fsociety_ написал: В третьих, с макросом гораздо быстрее работает
Да с чего Вы взяли-то? Выполнять код в цикле в теле макроса или выполнять тот-же код в цикле только вынесенный в отдельную функцию это одно и тоже. Вашу функцию можно оптимизировать, да, наверное, но это не тоже самое, что внедрить ее код в тело макроса.
Изменено: Sanja - 02.04.2019 14:18:21
Согласие есть продукт при полном непротивлении сторон
 
Sanja, сама работа макросом, проставки функции во все ячейки и ее обработка *(как в вашем примере) на 25 ячеек занимает больше времени чем если я запускаю макрос с примерно таким же функционалом на 10 тысяч ячеек. Я это вижу и замечаю на сколько быстро все работает.
 
Цитата
Fsociety_ написал:
макрос с примерно таким же функционалом
приложите, пожалуйста, посмотреть, может, сдвинемся куда
Уж больно здесь красиво, жди беды..
 
Цитата
работа макросом, проставки функции во все ячейки
Сколько раз можно повторять?! Макросом не проставлять формулы в ячейки!
Наоборот! Считать одной строчкой в массив. Обработать в массив с помощью функции
И вывалить на лист опять же одной строчкой!
 
Для объективности: иногда эффективнее наоборот (не имею в виду данный конкретный случай). Занести одной строкой формулы в диапазон; пересчитать; заменить (через специальную вставку) формулы на значения.
Как справедливо отмечено в #10, качество кода из #1 вызывает сомнения.
Владимир
 
Александр Моторин,я это же и пытаюсь всем объяснить.. только мне не нужны такие варианты как макросом вызывать эту функцию. нужно именно макросом внутри обработать и дать результат, быстро и просто, с функциями гемор и долго
Изменено: Fsociety_ - 02.04.2019 17:10:10
 
sokol92, мне нужен лишь рабочий функционал, макрос работающий на подобие данной функции.
 
Александр Моторин, сколько раз Вам нужно напоминать про культуру общения на форуме?
 
массив+функции обработки
 
Александр Моторин, уже близко, но работает все так же туго. Для такого маленького кол-ва текста слишком долго думает. Видимо придется работать с тем что есть. Попробую этот вариант как то адаптировать под свои нужды. Подскажите тогда уже как добавить в Ваш вариант распознавание и латинских символов тоже? Премного благодарен за труды.
Страницы: 1
Наверх