Excel vba ввод только даты

Содержание

  1. Метод Application.InputBox (Excel)
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Примечания
  6. Пример
  7. Поддержка и обратная связь
  8. VBA Excel. Функции для работы с датой и временем
  9. Функция Date
  10. Функция DateAdd
  11. Функция DateDiff

Метод Application.InputBox (Excel)

Отображает диалоговое окно для данных, вводимых пользователями. Возвращает данные, введенные в диалоговом окне.

Синтаксис

expression.InputBox (Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)

выражение: переменная, представляющая объект Application.

Параметры

Имя Обязательный или необязательный Тип данных Описание
Prompt Обязательно String Сообщение, которое отображается в диалоговом окне. Это может быть строка, число, дата или логическое значение (Microsoft Excel автоматически переводит значение в тип String перед отображением). Максимальная длина сообщения составляет 255 символов, в противном случае запрос не выводится, а метод приложения сразу же возвращает ошибку 2015.
Title Необязательный Variant Название поля для ввода. Если этот аргумент пропущен, используется заголовок по умолчанию «Ввод».
Default Optional Variant Задает значение, которое будет отображаться в текстовом поле при первоначальном отображении диалогового окна. Если этот аргумент пропущен, текстовое поле остается пустым. Это значение может представлять собой объект Range объекта.
Left Необязательный Variant Указывает положение по оси x для диалогового окна по отношению к левому верхнему углу экрана в пунктах.
Top Необязательный Variant Указывает положение по оси y для диалогового окна по отношению к левому верхнему углу экрана в пунктах.
HelpFile Optional Variant Имя файла справки для этого поля ввода. При наличии аргументов HelpFile и HelpContextID, кнопка «Справка» будет отображаться в диалоговом окне.
HelpContextID Optional Variant Номер идентификатора контекста раздела справки в HelpFile.
Type Необязательный Variant Задает тип возвращаемых данных. Если этот аргумент опущен, диалоговое окно возвращает текст.

Возвращаемое значение

Примечания

В таблице ниже перечислены значения, которые можно передать в аргументе Type. Это может быть одиночное значение или сумма значений. К примеру, для поля ввода, которое допускает ввод текста и чисел, задайте для аргумента Type значение 1 + 2.

Значение Описание
0 Формула
1 Число
2 Текст (строка)
4 Логическое значение (правда или ложь)
8 Ссылка на ячейку в виде объекта Range
16 Значение ошибки, например, #N/A
64 Массив значений

Используйте InputBox для отображения простого диалогового окна, что позволит вам вводить данные, которое можно будет использоваться в макросе. Диалоговое окно имеет кнопку ОК и кнопку Отмена. При выборе кнопки ОКInputBox возвращает значение, введенное в диалоговом окне. При выборе кнопки ОтменаInputBox возвращает значение Ложь.

Если значение Type равно 0, InputBox возвращает формулу в виде текста, например, =2*PI()/360 . Если в формуле есть все ссылки, они возвращаются в качестве ссылки в стиле A1. (Используйте ConvertFormula для преобразования стиля ссылок.)

Если значение Type равно 8, InputBox возвращает объект Range. Необходимо использовать оператор Set, чтобы назначить результат для объекта Range, как показано в приведенном ниже примере.

Если не используется оператор Set, для переменной устанавливается значение в диапазоне, а не сам объект Range.

Если вы используете метод InputBox для запроса формулы у пользователя, необходимо использовать свойство FormulaLocal, чтобы назначить формулу для объекта Range. Ввод формулы будет выполняться на языке пользователя.

Метод InputBox отличается от функции InputBox тем, что он позволяет выполнять выборочную проверку вводимых пользователем значений и его можно использовать с объектами, значениями ошибок и формулами Excel. Обратите внимание, что Application.InputBox вызывает метод InputBox; InputBox без квалификатора объекта вызывает функцию InputBox.

Пример

В этом примере у пользователя запрашивается число.

В этом примере пользователю предлагается выбрать ячейку на Листе1. В примере используется аргумент Type, чтобы гарантировать. что возвращаемое значение будет допустимой ссылкой на ячейку (объект Range).

В этом примере используется метод InputBox для пользователя, чтобы выделить диапазон для передачи определяемой пользователем функции MyFunction, которая умножает три значения в диапазоне и возвращает результат.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

VBA Excel. Функции для работы с датой и временем

Функции для работы с датой и временем в VBA Excel. Синтаксис, параметры, спецсимволы, примеры. Функции, возвращающие текущие дату и время по системному таймеру.

Функция Date

Синтаксис

Пример

Функция DateAdd

Синтаксис

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее интервал времени, который требуется добавить.
number Обязательный параметр. Числовое выражение, задающее количество интервалов, которые необходимо добавить. Может быть как положительным (возвращается будущая дата), так и отрицательным (возвращается предыдущая дата).
date Обязательный параметр. Значение типа Variant/Date или литерал, представляющий дату, к которой должен быть добавлен интервал.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: три символа – y, d, w – указывают функции DateAdd на один день, который необходимо прибавить к исходной дате number раз.

Пример

Функция DateDiff

Синтаксис

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее интервал времени, количество которых (интервалов) требуется вычислить между двумя датами.
date1, date2 Обязательные параметры. Значения типа Variant/Date , представляющие две даты, между которыми вычисляется количество указанных интервалов.
firstdayofweek Необязательный параметр. Константа, задающая первый день недели. По умолчанию – воскресенье.
firstweekofyear Необязательный параметр. Константа, задающая первую неделю года. По умолчанию – неделя, в которую входит 1 января.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: в отличие от функции DateAdd , в функции DateDiff спецсимвол «w» , как и «ww» , обозначает неделю. Но расчет осуществляется по разному. Подробнее об этом на сайте разработчиков.

Параметры firstdayofweek и firstweekofyear определяют правила расчета количества недель между датами.

Таблицы констант из коллекций firstdayofweek и firstweekofyear смотрите в параграфах «Приложение 2» и «Приложение 3».

Источник

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

Здравствуйте!  
Помогите, пжл. Мозг скоро взорвётся.  
Возможно ли в TextBox из UserForm создать маску для заполнения?  
Я полазил по Нету нашёл некоторые варианты, один из которых использовал при написании для кнопки «Очистить строки», далше не увидел смысла.  
Сейчас для «Очистить строки» можно вводить дату, как набор из 6 цифр 281212, скажем. Программа значение преобразует в 28.12.2012 и очистит строку в столбце B. Но то, что пользователь будет видеть в TextBox — 281212, я считаю, будет мало информативно. В этой связи возникает вопрос:  
можно ли в TextBox создать маску ввода, чтобы при вводе значения 281212 и последующего нажатия клавиши Enter в ячейке (перед тем как выбрать «Очистку» или «Удаление») отобразилось значение 28/12/2012?  
Я понимаю, что проще, наверное, вывести MsgBox, что-нибудь «Данные за » & Date & » будут удалены.» с кнопками ОК или Cancel, но я потратил много времени на решение этой проблемы и, мне кажется, что разгадка где-то рядом.  
Помогите, пжл, очень прошу Вас.  
Спасибо!

 

Daulet

Пользователь

Сообщений: 626
Регистрация: 01.01.1970

Private Sub TextBox_SearchText_Exit(ByVal Cancel As MSForms.ReturnBoolean)  
   With TextBox_SearchText  
       Select Case Len(.Value)  
       Case 6  
           .Value = Mid(.Value, 1, 2) & «.» & Mid(.Value, 3, 2) & «.» & 20 & Mid(.Value, 5, 2)  
       Case 10  
           .Value = .Value  
       Case Else  
           .Value = «»  
       End Select  

         If .Value Like «##.##.####» = True And IsDate(.Value) = True Then  
           If Format(DateValue(.Value), «dd.mm.yyyy») = .Value Then  
               .Value = .Value  
           Else  
               .Value = «»  
           End If  
       Else  
           .Value = «»  
       End If  
   End With  
End Sub

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=iba2004}{date=22.09.2012 07:31}{thema=Заполнение TextBox в UserForm в формате дата}{post}Я понимаю, что проще, наверное, вывести MsgBox…{/post}{/quote}Проще при клике по TextBox вызывать календарь, при помощи которого заполнять TextBox — исключаем ошибки.

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 ABC  
Снова от Вас помощь!!!  
Спасибо Вам!!!  
То, что хотел!  

  2 Юрий М  
Юрий, я где-то видел похожее решение, но почему-то решил, что лучше обойдусь без него.  
Простите, а Вы не могли бы дать на него ссылку или, если у вас не займёт это много времени, подсказать здесь.  
Спасибо за помощь!

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Небольшой пример на основе календаря из стандартных элементов (автор календаря Слэн).

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 ABC  
Посмотрел, переварил, разобрался… здОрово!!!  
Спасибо, Вам ещё раз!!!

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 Юрий М  
Спасибо, буду пережевывать!!! :о))  
Ребята, я восхищён вашими знаниями и навыками!!!  
Ещё раз «СПА-СИ-БО!!!»

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 Юрий М  
Блин! Мега-мозги!  
Я не перестаю удивляться!  
Посмотрел, вник.  
Спасибо!

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Только там нужно будет добавить проверку на тот случай, если пользователь закрыл календарь крестиком. Вот в этом случае выдавать предупреждение.

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 Юрий М  
Ок! Я не так быстр в своих рассуждениях, как Вы! :о))  
На то, что Вам требуется минута, мне минимум нужен час.  
Я прислушался к Вашему совету и обязательно сделаю проверку на «крестик».  
А Вы ещё не могли бы подсказать, никак не смог найти, по умолчанию курсор попадает на «Удалить строки», а мне бы нужно на «Очистить».  
Спасибо!

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Если правильно понял вопрос: правый клик по форме — Tab Order и перемещайте контролы в нужной очерёдности. Ещё можно поменять в свойствах каждого контрола его TabIndex, но это дольше. Если нужно принудительно на какой-то операции, то НужныйКонтрол.SetFocus

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 Юрий М  
Да, именно об этом я спрашивал!!!  
Благодаря Вам всё получилось!!!  
Стотысячный раз Вам «СПАСИБО»! :о))

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

Вот! Написал симбиоз!!!  
При клике на TextForm выплывает календарь, при вводе даты в TextForm руками, обязательно нужно нажать Enter, чтобы даты, введённые как 150912 или 15.09.12 или 15092012 или 15.09.2012 превратились в нужный нам формат 15.09.2012. Если вдруг человек нечаянно вызвал календарь, а затем решил ввести дату руками, то жмём на крестик календаря. (Привет Юрию :о)))  

  Ещё раз Спасибо АВС и Юрию. Я использовал помощь обоих. Если кому нужно, не стесняйтесь, берите файл.  

  Но м.б. будут найдены какие-то недостатки.  
Буду благодарен всем, указавшим на них.  

  Удачи!  
<EM><STRONG>Файл удален</STRONG> — велик размер — [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>

 

Daulet

Пользователь

Сообщений: 626
Регистрация: 01.01.1970

попробуйте так  

  Private Sub UserForm_Activate()  
If UserForm1.TextBox_SearchText.Value = «» Then  
Call setcal(Date)  
Else  
Call setcal(CDate(UserForm1.TextBox_SearchText.Value))  
End If  
End Sub

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 ABC  
Здравствуйте.  
Я правильно понимаю, что это обрубает щупальцы спруту тогда, когда в TextBox пустота?  
Или я неправ?

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

Ещё раз выклыдываю файл, теперь в архиве. На радостях не обратил внимания, что он на 3 кило тяжелее, оговоренных Правил  
Приношу извинения.

 

Daulet

Пользователь

Сообщений: 626
Регистрация: 01.01.1970

когда ТекстБокс пуст, календарь показывает сегодняшний день  
если не пуст тогда дату ТекстБокса  
—41442—

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 ABC  
Спасибо!  
Я для тётенек эту прогу ваяю. И так уже: и в таком формате Вам дату и в сяком. :о))  
Мне кажется, что если дата не найдена, пусть пустота отстаётся. Или в этом есть какой-то смысл, который я не улавливаю?

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

1. Запретить вообще ввод с клавиатуры (раз уж используем календарь).  
2. Контролировать не TextBox, а событие выгрузки формы с календарём: если дата «нулевая» — снова показывать календарь.  
Думаю, что так будет верно.

 

iba2004

Пользователь

Сообщений: 1034
Регистрация: 22.12.2012

2 Юрий М  
Спасибо! Ваше мнение мне ценно!  
Но не хотелось бы запрещать ввод с клавиатуры, потому как, окажется, что в сентябре нужно удалить декабрьскую сделку и могут ныть начать, что назад приходится долго щёлкать, искать нужную дату небыстро. А так захотели воспользовались календарем, не захотели  — ввели в формате, какой для себя определят. Если будет сказано, что принято решение вводить в таком-то формате, остальные рубану нах… , ой, нафиг! :о))  
Осюда и с календарём ноги растут. Если вдруг нечаянно кликнули на TextBox, а потом вдруг решили закатить дату руками.  
Как мужчина с мужчиной я с Вами согласен. Привводе с календаря и контроль строже и формат уникальный. Но это ж тётеньки. :о)) Одной так будет удобнее, другой сяк. Нам их не понять. :о))  
Согласны?

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

«Шеф сказал — пусть будет уголовник» (с) :-)  
Если в следующий раз надумаете делать что-то аналогичное, но с запретом ручного ввода — можно использовать Label вместо TextBox.

 

Guest

Гость

#22

23.09.2012 15:57:25

2 Юрий М  
;о)))  
Спасибо Вам за теплое отношение и «постановку на путь истинный»!!! :о))  
Обязательно буду иметь ввиду Ваш совет!

Распознование ввода в textbox только даты или даты и времени

lFJl

Дата: Четверг, 07.07.2016, 11:31 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 236


Репутация:

6

±

Замечаний:
0% ±


Excel 2013

Доброго дня!
Ввожу в textbox данные или даты или даты+ время.
определяю это кодом: [vba]

Код

textbox  = Format(Replace(textbox.Value, «,», «.»), «dd.mm.yyyy hh:mm»)

[/vba]
Подскажите, как определить, если допустим я ввожу только дату, то используем: [vba]

Код

textbox  = Format(Replace(textbox.Value, «,», «.»), «dd.mm.yyyy»)

[/vba]
А если дату и время, тогда: [vba]

Код

textbox  = Format(Replace(textbox.Value, «,», «.»), «dd.mm.yyyy hh:mm»)

[/vba]

И так же вывод этой информации в ячейку
Сейчас я это делаю таким образом: [vba]

Код

If textbox.Text <> «» Then Cells(ActiveCell.Row, 23).Value = CDate(textbox.Text)

[/vba]
Так вывод информации только даты, а если данные введены со временем, тогда что использовать?

Сообщение отредактировал lFJlЧетверг, 07.07.2016, 11:47

 

Ответить

Manyasha

Дата: Четверг, 07.07.2016, 13:32 |
Сообщение № 2

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

lFJl, можно так попробовать:
[vba]

Код

    ‘Если не дата
    If Not IsDate(TextBox1.Value) Then
        Cells(1, 1) = «text»
    ‘Дата+время
    ElseIf CDbl(CDate(TextBox1.Value)) — Int(CDbl(CDate(TextBox1.Value))) > 0 Then
        TextBox1 = Format(Replace(TextBox1.Value, «,», «.»), «dd.mm.yyyy hh:mm»)
        With Cells(1, 1)
            .Value = CDate(TextBox1.Value)
            .NumberFormat = «dd.mm.yyyy hh:mm»
        End With
    ‘Дата
    Else
        TextBox1 = Format(Replace(TextBox1.Value, «,», «.»), «dd.mm.yyyy»)
        With Cells(1, 1)
            .Value = CDate(TextBox1.Value)
            .NumberFormat = «dd.mm.yyyy»
        End With
    End If

[/vba]

К сообщению приложен файл:

primer.xlsm
(17.2 Kb)


ЯД: 410013299366744 WM: R193491431804

 

Ответить

lFJl

Дата: Четверг, 07.07.2016, 16:23 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 236


Репутация:

6

±

Замечаний:
0% ±


Excel 2013

Manyasha, Спасибо большее, то что нужно! :)

 

Ответить

  • Remove From My Forums
  • Question

  • Simple,

    our client want to have a date mask as

    DD/MM/YYYY mask in the text box

    I can validate if the values are fine easily.

    However is there a way to have a mask showing

    __/__/____

    so use can only input numbers on the _ ?

    Normally it works in Access vba but this seems to be nowhere to be found in Excel vba.

Answers

  • Hi
    Okol-Gui,

    You had mentioned that,»I can validate if the values are fine easily.However is there a way to have a mask showing.so use can only input numbers on the _ ?»

    I find one example from old thread and try to modify it as per your requirement.

    You can try to refer code below.

    Dim NewString, MyString, mask As String
    Dim position, pos As Variant
    
    
    
    Private Sub TextBox1_Change()
    If IsNumeric(Right(TextBox1.Text, 2)) And Len(TextBox1.Text) >= 11 Then
        TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
    Else
        position = TextBox1.SelStart
        MyString = TextBox1.Text
        pos = InStr(1, MyString, "_")
    If pos > 0 Then
        NewString = Left(MyString, pos - 1)
    Else
        NewString = MyString
    End If
    If Len(NewString) < 11 Then
        TextBox1.Text = NewString & Right(mask, Len(mask) - Len(NewString))
        TextBox1.SelStart = Len(NewString)
    End If
    End If
    If Len(TextBox1.Text) >= 11 Then
         TextBox1.Text = Left(TextBox1.Text, 10)
    End If
    
    
    End Sub
    
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim strDate As String
    strDate = Me.TextBox1
    If IsDate(strDate) Then
        strDate = Format(CDate(strDate), "DD/MM/YYYY")
        MsgBox strDate
      Else
        MsgBox "Wrong date format"
      End If
    End Sub
    
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    position = TextBox1.SelStart
    If KeyCode = 8 Then
        TextBox1.Text = mask
    End If
    End Sub
    Private Sub UserForm_Initialize()
    TextBox1.SelStart = 0
    mask = "__/__/____"
    TextBox1.Text = mask
    End Sub
    

    Output:

    Reference:

    Text Box With Input Mask

    Disclaimer: This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites;
    therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure
    that you completely understand the risk before retrieving any software from the Internet.

    Regards

    Deepak


    MSDN Community Support
    Please remember to click «Mark as Answer» the responses that resolved your issue, and to click «Unmark as Answer» if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to
    MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • Marked as answer by

      Tuesday, April 10, 2018 1:58 PM

We often use VBA userforms to enter data. These userforms contain
various types of controls such as combo boxes, textboxes, command
buttons etc. Among them textboxes are a commonly used control type in
userforms. So today I am going to explain you a cool trick you can use
in VBA textboxes. This will be very useful when you use text boxes to
input dates. we can enter dates in various formats such as
dd/mm/yyyy, mm/dd/yyyy, mm/dd/yy etc. but there are situations where
we need to tell our user to enter date in only particular format. So
how we can give this message to our users. We can do it simply
like this

When you show the form you can put date format inside the textbox. This can be done by assigning the relevant value to textbox in userform’s initialise event. Below is the code you can use for that.

Private Sub UserForm_Initialize()

txtStart.Value = «DD/MM/YYYY»

End Sub

But it will be a little difficult if user need to delete this value every time he or she want to enter a date. Then your application won’t be user friendly. So the best thing is to find a way to clear the textbox when user click on it. We can do this easily using textbox MouseDown event. Here below is the code you can use for that.

Private Sub txtStart_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If StrComp(txtStart.Value, «DD/MM/YYYY», vbTextCompare) = 0 Then

     txtStart.Value = «»

End If

End Sub

I will explain you why I have used if statement here. Sometimes user can unintentionally click on the textbox after entering the correct date. And sometimes user may need to correct a part of the date if he or she has entered it incorrectly. Because of that, we need to check the current value of the text box before clear it. So that’s why I have used a if statement before clear the value. Then it will clear the value of the textbox only if it find DD/MM/YYYY.

Like this post? Please share to your friends:
  • Excel vba ввод данных через форму
  • Excel vba ввод данных с клавиатуры
  • Excel vba ввод данных в ячейки
  • Excel vba введите число
  • Excel vba в книге с общим доступом