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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 29 След.
Сохранение значения UDF
 
Еще раз прошу прощения, просто как то, в одном из обсуждений меня немного упрекнули на некоторую как выразились "многобуквенность", вот я постарался, в меру своих возможностей, написать лапидарно
Сохранение значения UDF
 
Дмитрий, спасибо за ответ, буду изучать. А что качается логики моей задумки, то не стал грузить форумчан, посчитал ненужным подробное объяснение. А было оно таким: Для проверки запускать ли заново нумерацию я применил словарь dicNum, если есть ключ - нумерация продолжается, если нет - добавить ключ (сформированный в цикле) + сбросить значение до 1. А вот как победить стремление функции сбрасывать значение на 0 я и задал главный вопрос, мне казалось тогда, что как-то по аналогии со Static можно это соорудить. Еще раз спасибо.
Присвоение уникального значения, Нужна формула для присвоение уникального значения
 
Цитата
написал:
Спасибо! а как пользоваться?)
Ну не знаю 8-0 , этот кусок кода выдает верное значение I (в данном примере =3), а что дальше это вам решать.  
Изменено: OlegO - 27.02.2025 13:17:07
Присвоение уникального значения, Нужна формула для присвоение уникального значения
 
Тогда вот файл. Обратите внимание, что код проверяет на пропущенные номера (например удалили что-либо) и предлагает сначала их
Сохранение значения UDF
 
Прошу прощения, Дмитрий, но нет. dicNum в реальном файле у меня объявлен как Private, а вот в примере не указал, каюсь. Но, еще раз извиняюсь, дело не в этом, как мне кажется. Когда я прохожу код пошагово, я получаю при первой итерации верное значение n. Далее изменяется i, заново отрабатывается функция и я сразу вижу, что значение  Calc_NR = 0. Естественно функция дает ответ 1, при этом словарь dicNum, как ему и положено содержит первый ключ. Ваш код (я скопировал его без изменений) приводит к аналогичному результату. А что касается второго вопроса, то дело в том, что я встречал код в котором проверялось значение функции типа If функция>0 then, именно функции, а не переменной принимающей ее значение. Вот по аналогии, я и хотел бы не рассчитывать значение n, а напрямую указывать функцию как один из аргументов.
Присвоение уникального значения, Нужна формула для присвоение уникального значения
 
kse-solo1, вам необходимо именно формулой, а как сделать макросом вы в курсе или все-равно? Макросом очень похожее решение у меня есть
Сохранение значения UDF
 
Доброго времени суток, уважаемые форумчане. Вновь обращаюсь к вам за помощью в написании кода, ситуация такая: имеется код наполнения словаря:  
Код
 For i = 1 To UBound(xF)
    n = Calc_NR(dicNum, xF(i, 1) & "|" & xF(i, 4))
    dicData.Item(Join(Array(n, xF(i, 6), xF(i, 3)), "|")) = xF(i, 2)
 Next i
в силу определенных обстоятельств, мне требуется расчет для нумерации по строкам (n) для каждого расходного документа, делать я это попытался с помощью функции пользователя:
Код
Function Calc_NR(dicNum As Object, key As String) As Long 'расчет нумерации реестра
    If dicNum.Exists(key) Then
        Calc_NR = Calc_NR + 1
    Else
        dicNum.Item(key) = 1: Calc_NR = 1
    End If
End Function
Частично получилось, но возникли 2 вопроса: функция верно рассчитывает номер для первой позиции, но не сохраняет значение Calc_NR для 2-ой и последующих позиций, все они нумеруются как 1. Можно ли, и как, если можно, это исправить? и второй вопрос (с разрешения модераторов) можно ли и как, если можно, напрямую использовать функцию при формировании ключа словаря, т.е. записывать не  
Код
dicData.Item(Join(Array(n, xF(i, 6)...
а так:
Код
dicData.Item(Join(Array(Calc_NR, xF(i, 6)...
при условии конечно, что есть решение для первого вопроса, а иначе зачем?
Заранее спасибо всем откликнувшимся
Пакетная отправка файлов через CDO
 
Вроде бы разобрался, еще раз перепроверив исходный образец кода отправки. Код теперь выглядит так:
Код
                    For Each att In dicMail.Item(k)
                        .AddAttachment ThisWorkbook.Path & "\" & att
                        Kill ThisWorkbook.Path & "\" & att
                    Next att
БМВ, команда на прикрепление файла, наверное копирует файл в оперативную память или еще куда-либо, в любом случае команда на удаление отрабатывает, но ни Count прикрепленных не уменьшается, ни item-ы. Во всяком случае письмо на свой ящик ушло, файлы там есть. Всем спасибо.
Пакетная отправка файлов через CDO
 
БМВ, да, если что, я перенесу команду удаления, почему не прикрепляется-то?  
Изменено: OlegO - 16.02.2025 20:58:33
Пакетная отправка файлов через CDO
 
Доброго времени суток, уважаемые форумчане. Я уже поднимал тему отправки файлов через  CDO на нашем форуме, но вопрос возник снова. Итак, в функцию отправки письма передается словарь, ключом которого является адрес, а итемом - массив наименований документов к тому времени уже созданных. Словарь (для примера конечно) наполняется так:
Код
        For i = 1 To 2
            If Not dicMail.Exists(Key) Then
                dicMail.Item(Key) = Cells(i, 1).Value & ".pdf"
            Else:
                dicMail.Item(Key) = Array(dicMail.Item(Key), Cells(i, 1).Value & ".pdf")
            End If
        Next i
ad = Func_SendMailCDO(dicMail)
далее вызов функции, инфа по логину-паролю, разумеется левая, для примера:
Код
Function Func_SendMailCDO(dicMail As Object) 'отправка на e-mail покупателя
    Dim objCDOCnf As Object, objCDOMsg As Object, att As Variant, k As Variant
        Const CDO_Cnf = "http://schemas.microsoft.com/cdo/configuration/"
        Set objCDOCnf = CreateObject("CDO.Configuration") 'назначаем конфигурацию CDO
        
            With objCDOCnf.Fields
...
                .Item(CDO_Cnf & "sendusername") = "login@mail.ru" 'учетная запись на сервере
                .Item(CDO_Cnf & "sendpassword") = "pass" 'пароль к почтовому аккаунту
                .Update
            End With
                    
            On Error Resume Next
            For Each k In dicMail.keys
                Set objCDOMsg = CreateObject("CDO.Message") 'создаем сообщение
                With objCDOMsg
...
                    .Subject = "Копии документов" 'тема письма
Далее я пытаюсь прикрепить аттач и вот с этим у меня и возникают проблема, т.к. само письмо уходит по адресу и вообще, кроме аттача, код отрабатывает на ОК:                    
Код
For Each att In dicMail.Item(k)
         .Attachments.Add ThisWorkbook.Path & "\" & att
         Kill ThisWorkbook.Path & "\" & att
Next att
       .Send
значение att верное, файлы pdf в наличии, а значение objCDOMsg.Attachment.Count как было =0 так и остается. Повторюсь, письмо уходит, но пустое без нужного вложения. Что сейчас написано не так и как это исправить?
Заранее спасибо всем откликнувшимся.
Функция пользователя: ввод параметров
 
Ага, вона оно как :) Ясно. Спасибо большое за консультацию и терпение.
Функция пользователя: ввод параметров
 
Цитата
написал:
Ваше обучение VBA идёт странным маршрутом.
Вы бы знали каким :D . Нет так-то я и сам мог, мне хотелось иного ;) . Хотелось, чтобы при ПОПЫТКЕ ввести неверные данные как минимум с листа, Excel сразу указывал на это (MsgBox например), а в "идеальном" варианте, чтобы и по ходу применения ф-и в коде в этом случае выскакивало какое либо сообщение (я понимаю, что это уж наверное совсем нереально, но так и это не условие, а просто вопрос о возможности).  
Функция пользователя: ввод параметров
 
Дмитрий(The_Prist) Щербаков, МатросНаЗебре, спасибо за ответы. Буду думать 8-0

P.S. прочитал статью Дмитрия, подумал, многое стало понятнее. НО можно еще немного обнаглеть и  узнать еще одну вещь? Сейчас в моей ф-и это не слишком важно, но вдруг возможна иная ситуация в будущем  :oops: : можно ли как, если можно, ограничить допустимые значения для ввода параметра по аналогии с проверкой данных в ячейке? Конкретно в параметр CaseWord As Byte должны вводиться только числа от 2 до 6 и ничего иного. В ArgumentDescriptions у меня есть подсказка по этому поводу, но можно ли подстраховать корректную работу функции от неверных данных пользователя?
Изменено: OlegO - 11.02.2025 18:40:34
Функция пользователя: ввод параметров
 
Спасибо, МатросНаЗебре, вроде понял и получается, сейчас проверю в реальном коде. Подскажите на будущее, в чем разница параметров ParamArray SNP()  и SNP as Variant из заголовка функции.
Функция пользователя: ввод параметров
 
Наберусь смелости и возражу уважаемому Sanja 8). Возможно я недостаточно понятно обрисовал проблему, попробую еще раз. Измененный вариант функции правильно вызывается и отрабатывается кодом VBA, а вот как измененную ф-ю вызвать с листа неясно. Если указать в качестве аргументов диапазоны или даже диапазон (как в примере =DeclensionFIO_Arr(2;F1)), то я смогу наверное данные для ф-ии изменить на Split(SNP(0).Formula)(0), но ведь тогда данные не подойдут для варианта, вызываемого кодом, там у SNP(0) вообще нет свойства .Formula, а есть только значения. Получается, что не получится иметь вариант работающий как из-под кода так и с листа?
Функция пользователя: ввод параметров
 
Ну нельзя так, как мне захотелось, значит нельзя. Но позвольте еще один вопрос по этой функции. Чтобы вызвать ее с листа необходимо указать помимо номера падежа еще и отдельные ячейки с фамилией, именем и отчеством. Если эти данные будут в одной ячейке, то результат будет частично или полностью неверен. Если вызывать функцию кодом, то приходится сооружать примерно такую конструкцию:
Код
ad= DeclensionFIO(2, CStr(Split([F1])(0)), CStr(Split([F1])(1)), CStr(Split([F1])(2)))
немного длинновато и кстати почему приходится оборачивать Split в CStr, данные и так текстовые? (но это так, к слову, а не вопрос  ;) ). Для удобства ввода (в моем понимании) попробовал изменить параметры ф-и на следующие:
Код
Function DeclensionFIO_Arr(CaseWord As Byte, ParamArray SNP()) As String 
...
изменив, разумеется, Surname, Name и Patronymic на CStr(SNP(0)(1)), CStr(SNP(0)(2)) и CStr(SNP(0)(3)) соответственно. Ф-я работает, в коде вызываю ее :
Код
ad = DeclensionFIO_Arr(3, Split([F1]))
но не могу понять как ее запускать с листа Excel, если потребуется. Пробовал =DeclensionFIO_Arr(2;F1) - не получилось, по сути мне одновременно нужен аналог Array и Split, верно? А как это сделать формулами, если это возможно конечно?
Функция пользователя: ввод параметров
 
Цитата
написал:
Обрабатывайте каждый в отдельности, без Array()(i)
Здравствуйте, Sanja. Собственно, как вы предложили, у меня в текущем коде и работает. При склонении фамилии переменная = Mid(Surname, 1, Len(Surname)) - 1), при склонении имени соответственно Mid(Name, 1, Len(Name)) - 1) и т.д. Все ОК, просто хотелось узнать можно ли написать по иному, сэкономив строки (их разумеется не жалко, просто интересно). Просто не пойму почему не изменяется значение tmp при изменении i ?
Функция пользователя: ввод параметров
 
Просто мне хотелось, что бы при измении значения i переменная сама принимала новое значение, без доп. функций. Иначе какой смысл пытаться сократить 3 строки кода, написав отдельную функцию на n строк?  8-0  
Изменено: OlegO - 10.02.2025 20:18:05
Функция пользователя: ввод параметров
 
Здравствуйте, Hugo. Задача следующая: нашел на просторах сети функцию склонения ФИО в родительном падеже, решил "допилить" для остальных падежей, ну и модифицировать код  на более понятный и компактный с моей точки зрения. Могу выложить свое творение, если кому-то интересно, не жалко ни разу. А по поводу другой функции, это как должно выглядеть? Типа переменная tmp задается отдельной функцией, на 2 этапе (склонение имени) меняется значение i и вновь вызывается расчет tmp. Так примерно?
Функция пользователя: ввод параметров
 
Доброго времени суток, уважаемые форумчане. Пытаюсь "допилить" под себя функцию пользователя, найденную на просторах сети и вот вылезли небольшие вопросы. Скажу сразу, код работает, но хотелось бы узнать можно ли написать по-иному, с моей точки зрения красивее и правильнее. Итак, огрызок функции (в ячейке В1):
Код
Function test(CaseWord As Byte, Surname As String, Optional Name As String, Optional Patronymic As String) As String
    tmp = Mid(Array(Surname, Name, Patronymic)(i), 1, Len(Array(Surname, Name, Patronymic)(i)) - 1)
    'склонение фамилии
    t1 = tmp
    i = i + 1
    'склонение имени
    t2 = tmp & 123
End Function

имеем переменную tmp, которая принимает значение в зависимости от значения i. Используем эту переменную, далее меняем значение i, и хотелось бы, чтобы значение переменной изменилось бы при расчете склонения имени само, без дополнительной команды. Возможно ли это? Сейчас, разумеется, значение tmp просто перезаписывается отдельно.

Заранее спасибо всем откликнувшимся

Текст между скобок регулярными выражениями
 
Вроде бы дошло, что на мой последний вопрос мне уже давно ответили во 2 посте 8-0  
Текст между скобок регулярными выражениями
 
Спасибо, Kuzmich за ответ. Единственно, как мне показалось, вместо iResult = "" будет правильным написать iResult = cell. Но позвольте все-таки уточнить, ведь это новая функция, а для прежнего варианта из мо\его примера:
Код
Public Function RegExpExtract(Text As String, Pattern As String, Optional Item As Integer = 1) As String
    On Error GoTo 0
    Set v_RegExp = CreateObject("VBScript.RegExp")
        With v_RegExp
            .Pattern = Pattern
            .Global = True
            If .test(Text) Then Set v_Matches = .Execute(Text): RegExpExtract = v_Matches.Item(Item - 1): Exit Function
        End With
0:
        RegExpExtract = CStr(CVErr(xlErrValue))
End Function
можно создать универсальный паттерн или нет?
Текст между скобок регулярными выражениями
 
nilske, наверное я плохо пояснил. Ваш вариант подходит за одним исключением (сейчас еще раз проверил): для "первого" варианта ответом будет 123, а не 999. Это можно подправить? Про пустую ячейку я зря наверное упомянул. В реальном файле это должно выглядеть приблизительно так:
Код
...
q= --RegExpExtract(CStr(Arr_data(i, 15)), "нужный паттерн")
...
в Arr_data(i, 15) имеются данные (либо со скобками либо без). Предложенный вами паттерн выдаст неверный ответ, если скобки есть (число до скобок) и правильный для варианта без скобок. Если указать номер итема, то вариант со скобками будет почти правильным (скобки присутствуют, как еще одним RegExpExtract их убрать, я знаю), но вариант без скобок выдаст ошибку. Если вас не затруднит, убедитесь в этом, проверив в прилагаемом мною файле
Текст между скобок регулярными выражениями
 
nilske, спасибо за отклик, но позвольте уточнить. Логический оператор | у вас используется как раз для 2-х вариантов данных (со скобками и без), правильно? В результате, при его применении для "чистого" варианта все ОК, а вот для варианта со скобками результатом будет число ДО скобок, а если указать item=2, то во-первых 999 отображается со скобками (это я бы смог скорректировать), а во-вторых для "чистого" варианта ответом становится пустая ячейка. Можно ли это исправить?
Цитата
написал:
наверное, всё-таки не "одним" сразу из двух ячеек, а одинаковыми
согласен, не хватило слова "соответственно"
Текст между скобок регулярными выражениями
 
Доброго времени суток, уважаемые форумчане. Никак не могу разобраться с особенностями синтаксиса регуляров и поэтому вновь обращаюсь в вам за помощью в решении задачи. Итак, ситуация по идее простая: имеется текст типа 123(999), требуется извлечь данные, находящиеся между скобок, т.е. 999. Сделать это обязательно регулярами (причина требования к вопросу не относится). Казалось бы, чего сложного, паттерн "\d+" и второй item и все ОК, но нет. Дело в том, что скобок в данных может и не быть, будет любое число, а в таком случае RegExpExtract выдаст ошибку #ЗНАЧ! Любые проверки на наличие скобок, не то чтобы запрещены, но в таком случае ни о каком сокращении объема кода речь не идет, а именно это и является задачей. Итак, можно ли решить данный вопрос, т.е. извлечь одним регулярным выражением нужный текст (из ячеек А1 и В1 прилагаемого файла) и, если да, то как?

P.S. Заранее спасибо всем откликнувшимся
Изменено: OlegO - 20.11.2024 14:30:33
Pattern для регулярного выражения
 
Спасибо, bigorq у меня получилось похоже:
Код
r = Application.Match(IIf(Split(RegExpExtract(.RefersToLocal, "[^={}]+"), ";")(0) = ID_ten, 1, Mid(RegExpExtract(RegExpExtract(.RefersToLocal, "[^={}]+"), ":" & ID_ten & "[^:]+"), 2)), Split(RegExpExtract(.RefersToLocal, "[^={}]+"), ":"), 0)
где .RefersToLocal это искомая строка, а ID_ten - 1 из примера
Доступ к item-ам регулярного выражения
 
Спасибо за беседу, nilske. Немного неудобно бывает, когда люди предполагают, что задача, выложенная тобой на форуме глобальна важна, поясняют за то, что регулярные выражения в VBA обрезаны по могуществу и пр., а в твоей ситуации есть просто одиночный файл код для которого, тобою же написанный, и ты просто пытаешься (чисто для себя!), переписать код, оптимизировав в своем понимании этого процесса. У меня, по крайней мере сейчас, это именно так. Просто по ходу этой "оптимизации" (пишу в кавычках, т.к. возможно это с точки зрения профи - кривизна несусветная) возникла ситуация, решить которую мне показалось возможным, правильным и "красивым" именно с помощью регулярки. Что касается вопроса из этой темы, то я и сам уже кажется понял, что он не имеет решения в таком виде. Через цикл получить необходимые для меня данные я понял как, но циклом я ранее мог это сделать, не привлекая регулярку (например For i = 0 To UBound(Split(temp, ":"))), где temp - это строка с искомыми данными. Ладно, фиг с этим вопросом :oops: НО,
Цитата
написал:
а сейчас с телефона мне неудобно составлять код.
если вам будет удобно сделать это с домашнего/рабочего ПК (позже сегодня или завтра), то я все равно буду очень благодарен, как и во всех остальных случаях помощи мне на нашем сайте Задачу повторять не буду, итак много текста вышло.
Доступ к item-ам регулярного выражения
 
Цитата
написал:
Вы всё-таки не почитали про группы
Уважаемый,nilske, я и VBA только-только по слогам перестал читать, хоть немного теперь понимаю для для чего та или иная строка кода написана, а вот с регулярками совсем непонятны примеры :oops: Вот поэтому я и прошу пример решения, даже без подробного объяснения, дабы удаляя ту или иную часть паттерна (для данного вопроса) понять логику их создания. А за приведенные ссылки спасибо большое
Pattern для регулярного выражения
 
Увы, bigorq, вы правы в MS выдает ошибку
Доступ к item-ам регулярного выражения
 
Доброго времени суток, уважаемые форумчане. В предыдущей теме, поднятой мною на форуме:https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=167725&TITLE_SEO... вопрос, как мне хотелось решить не удалось. Но возникла мысль по другому варианту его решения 8-0, итак:
Код
    Dim v_RegExp As Object, s As String
        Set v_RegExp = CreateObject("VBScript.RegExp")
            s = "2;2;222;202:5;155545;25;6:3;13;13;89"
            v_RegExp.Pattern = ":"
            v_RegExp.Global = True
            f = v_RegExp.Execute(s).Item(0).FirstIndex '11
            
            ff = InStr(s, ":5;") - 1 '11
Мы имеем строку с выражением, разделенным на 3 "куска" двоеточиями (в оригинале это массив, хранящийся в диспетчере имен). Через свойства
FirstIndex мы можем получить данные о расположении паттерна (в примере 11 и 25). Теперь вопрос: можно ли и как, если можно, получить информацию о FirstIndex для всех item, сколько бы их не было (много их не будет, но 10-20 может быть), типа как в словаре обращаемся к dicData.items? По задумке, если вышенаписанное реально, то найдя в строке положение нужного мне блока символов (в примере ":5; (такой вариант будет уникальным)) я бы мог найти это значение в "коллекции значений" FirstIndex и узнать (тоже правда пока не знаю как) номер итема для этого значения и задача для меня решится.

Заранее спасибо всем откликнувшимся, а если кто нибудь, прочитав предыдущую тему, предложит решение там ,то размер моего спасибо будет не меньшим ;)  
Изменено: OlegO - 07.10.2024 17:41:05 (орфографическая ошибка)
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 29 След.
Наверх