Страницы: 1
RSS
Возврат Даты в числовом виде VBA
 
Добрый день!
Написал формулу на VBA
Код
Public Function ИзвлечьДатуДокумента(Text As String) As Date
ИзвлечьДатуДокумента = Format(CDate(MyRegex(Text, "\d{2}\.\d+\.\d+")), "DD.MM.YYYY")

'ИзвлечьДатуДокумента = Format(MyRegex(Text, "\d{2}\.\d+\.\d+"), "DD.MM.YYYY")
End Function

Данная формула извлекает дату из выбранной ячейки. Однако возникает проблема с возвратом значения.
Если возвращать дату то идет цифровое значение даты.
Если поставить String то возвращается текст и не группируются данные в месяца и года.
Может есть возможность как то это побороть без изменения числового формата????
 
Почему картинка? Приложите нормальный файл Excel на форуме по Excel. Как есть - Как надо
Согласие есть продукт при полном непротивлении сторон
 
Формат ячеек установите Дата.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Для Вашего примера можно без второй функции (MyRegex) обойтись
Код
Function Get_Data(iData)
  Get_Data = Format(Split(iData, "от")(UBound(Split(iData, "от"))), "dd.mm.yyyy")
End Function
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
Формат ячеек установите Дата.


Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Как и было сказано . Как можно исправить без изменения формата ячеек. То что можно переключить я знаю , но это делать постоянно не очень удобно.


Цитата



Для Вашего примера можно без второй функции (MyRegex) обойтись
Код
Function Get_Data(iData)
  Get_Data = Format(Split(iData, "от")(UBound(Split(iData, "от"))), "dd.mm.yyyy")
End Function
не очень понимаю как это работает и работает ли вообще.
А что касается второй раз  второй раз написан Regex это комментарий, просто я пытался различными способами вернуть дату.
Изменено: asdewq1 - 12.05.2025 12:25:26
 
Цитата
написал:
Как можно исправить без изменения формата ячеек
никак, если Вам нужна именно дата в ячейках, а не число или текст.
Если используются макросы - почему бы не использовать их для установки нужного формата? Что мешает это сделать? Например, можно в модуль листа записать такую обработку(срабатывает при каждом изменении листа):
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rc As Range
    
    On Error Resume Next
    For Each rc In Target
        If InStr(1, rc.Formula, "=ИзвлечьДатуДокумента1(", 1) > 0 Then
            rc.NumberFormat = "dd.MM.yyyy"
        End If
    Next
End Sub
Конечно, скорее всего нужны доп.проверки, чтобы лишнего не делать. Но я показал лишь пример без понимания, подойдет ли такой подход или нет.
И да, функция тогда должна выглядеть так(т.е. возвращать именно дату):
Код
Public Function ИзвлечьДатуДокумента1(Text As String) As Date
    ИзвлечьДатуДокумента1 = CDate(MyReg(Text, "\d{2}\.\d+\.\d+"))
End Function
Накидывать сюда формат через VBA.Format нет смысла. К тому же, если делать через Format, на некоторых ПК и вовсе будет ошибка, если формат даты в локализации отличается от "ДД.ММ.ГГГГ".
Изменено: Дмитрий(The_Prist) Щербаков - 12.05.2025 13:01:55
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
asdewq1 написал: и работает ли вообще
Работает. Вы не правильно скопировали текст макроса из сообщения. Нужно копировать при русской раскладке клавиатуры, т.к. в нем используются русские буквы
Цитата
asdewq1 написал: второй раз написан Regex это комментарий
Я не второй раз (который комментарий), а в принципе. Эта функция не нужна
Цитата
asdewq1 написал: Как можно исправить без изменения формата ячеек.
UDF не могут менять формат ячейки. Отслеживайте изменение(или пересчет) нужных ячеек и на лету меняйте их формат событийным макросом
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
Конечно, скорее всего нужны доп.проверки, чтобы лишнего не делать. Но я показал лишь пример без понимания, подойдет ли такой подход или нет.И да, функция тогда должна выглядеть так(т.е. возвращать именно дату):Код ? 123Public Function ИзвлечьДатуДокумента1(Text As String) As Date    ИзвлечьДатуДокумента1 = CDate(MyReg(Text, "\d{2}\.\d+\.\d+"))End FunctionНакидывать сюда формат через VBA.Format нет смысла. К тому же, если делать через Format, на некоторых ПК и вовсе будет ошибка, если формат даты в локализации отличается от "ДД.ММ.ГГГГ".
Спасибо.
Просто в данном случае я просто начал пробовать и просто увеличивал количество функций в недежде что заработает. Но увы.
А постоянная проверка на ввод формулы не нагружает процессор?




Цитата
написал:
asdewq1  написал: и работает ли вообщеРаботает. Вы не правильно скопировали текст макроса из сообщения. Нужно копировать при русской раскладке клавиатуры, т.к. в нем используются русские буквыЦитата asdewq1  написал: второй раз написан Regex это комментарийЯ не второй раз (который комментарий), а в принципе. Эта функция не нужнаЦитата asdewq1  написал: Как можно исправить без изменения формата ячеек.
ну да получается я если честно сразу не догадался что можно split сделать.
 
Цитата
написал:
ли используются макросы - почему бы не использовать их для установки нужного формата? Что мешает это сделать? Например, можно в модуль листа записать такую обработку(срабатывает при каждом изменении листа):
И такой вариант также не подходит .
Так как получается это событие отдельного листа. А тут получается сама по себе формула сохранена в личных настройках и доступна в любой из открываемых книг. А в каждой книге прописывать События объекта Worksheet вообще не вариант
 
Цитата
написал:
А в каждой книге прописывать События объекта Worksheet вообще не вариант
прописывайте в надстройке : https://www.excel-vba.ru/chto-umeet-excel/kak-otsledit-sobytienaprimer-vydelenie-yacheek-v-lyuboj-kn...
 
asdewq1, Format в коде лишнее если нужна дата, достаточно
Код
Public Function ИзвлечьДатуДокумента1(Text As String) As Date
ИзвлечьДатуДокумента1 = CDate(MyReg(Text, "\d{2}\.\d+\.\d+"))
End Function

Ну а далее в ячейке уже её форматом показывайте как хотите, вручную или макросом.
 
Цитата
написал:
написал:А в каждой книге прописывать События объекта Worksheet вообще не вариантпрописывайте в надстройке :  https://www.excel-vba.ru/chto-umeet-excel/kak-otsledit-sobytienaprimer-vydelenie-yacheek-v-lyuboj-kn....
раз пошла такая пьянка а возможно ли чтобы lambda функции написанные в одном месте были доступны во всех открываемых книгах ?





Цитата
написал:
asdewq1 , Format в коде лишнее если нужна дата, достаточноКод ? 123Public Function ИзвлечьДатуДокумента1(Text As String) As DateИзвлечьДатуДокумента1 = CDate(MyReg(Text, "\d{2}\.\d+\.\d+"))End FunctionНу а далее в ячейке уже её форматом показывайте как хотите, вручную или макросом.
Как и писал выше . Я просто пробывал различные варианты по принципу авось сработает.

Хотелось отображение как есть в excel при открытии ты видишь например формат общий и строку , но при этом ячейка в сводных таблицах ведет себя как дата . И при построении сводных таблиц появляется дополнительная группировка месяц , квартал, год .
 
Цитата
asdewq1 написал:
при открытии ты видишь например формат общий и строку , но при этом ячейка в сводных таблицах ведет себя как дата
- или строка, или дата, можете выбирать.
Когда в Экселе записана дата, то её отображение в ячейке достигается форматом ячейки. А сама дата - это число. Если с временем - дробное.
 
asdewq1, здравствуйте. Не совсем понятно, как сочетается вопрос
Цитата
написал:
возможно ли чтобы lambda функции написанные в одном месте были доступны во всех открываемых книгах ?
с
Цитата
написал:
А тут получается сама по себе формула сохранена в личных настройках и доступна в любой из открываемых книг.
?
Но как и писал ранее, прописывайте свои функции в надстройке, устанавливаете ее в Эксель и все функции доступны в любой открытой книге: https://www.excel-vba.ru/chto-umeet-excel/kak-sozdat-svoyu-nadstrojku/
 
Цитата
asdewq1 написал:
Может есть возможность как то это побороть без изменения числового формата????

А попробуйте просто из Вашего макроса убрать «As Date»

Код
Public Function ИзвлечьДатуДокумента1(Text As String)
ИзвлечьДатуДокумента1 = Format(CDate(MyRegex(Text, "\d{2}\.\d+\.\d+")), "DD.MM.YYYY")
 
'ИзвлечьДатуДокумента1 = Format(MyRegex(Text, "\d{2}\.\d+\.\d+"), "DD.MM.YYYY")
End Function
Изменено: Иван Иваныч Иванов - 14.05.2025 17:30:47
 
Но это уже будет не дата, а строка (слово).
Другое дело что иногда это приемлемо, но например в фильтре группировки по месяцу/году уже не будет.
 
Цитата
написал:
asdewq1 , здравствуйте. Не совсем понятно, как сочетается вопросЦитата написал:возможно ли чтобы lambda функции написанные в одном месте были доступны во всех открываемых книгах ?с Цитата написал:А тут получается сама по себе формула сохранена в личных настройках и доступна в любой из открываемых книг. ?Но как и писал ранее, прописывайте свои функции в надстройке, устанавливаете ее в Эксель и все функции доступны в любой открытой книге:  https://www.excel-vba.ru/chto-umeet-excel/kak-sozdat-svoyu-nadstrojku/
Криво косо , но получилось.


Прописал для теста
Код
Private WithEvents App As Application

Private Sub Workbook_Open()
    Set App = Application
End Sub




Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
If (Wb.Name = "PERSONAL.XLSB") Then
    MsgBox "Вы открыли книгу:" & Wb.Name
    Else
    ActiveWorkbook.Names.Add Name:="test", RefersToR1C1:="=LAMBDA(a,b,a+b)"
    End If
    
End Sub


Private Sub App_NewWorkbook(ByVal Wb As Workbook)
    MsgBox "Вы создали новую книгу"
    ActiveWorkbook.Names.Add Name:="test", RefersToR1C1:="=LAMBDA(a,b,a+b)"
    ActiveWorkbook.Names.Add Name:="test2", RefersToR1C1:="=LAMBDA(ad,ba,ad+ba)"

End Sub




Всем спасибо.
Сейчас у меня везде доступны будут и макросы и лямбды.
Страницы: 1
Читают тему
Наверх