в теме "замена запятой на точку при вводе" (имелось в виду ввод даты) )http://www.excelworld.ru/forum/2-14531-1 был получен замечательный макрос
[vba]
Код
Option Explicit Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim s$ If Target.Count > 1 Then Exit Sub If InStr(1, Target.Formula, ",") = 0 Then Exit Sub s = Target.Formula If UBound(Split(s, ",")) = 2 Then s = Replace(s, ",", ".") If IsDate(s) Then Target = Format(s, "dd.mm.yyyy") End Sub
[/vba]
при вводе даты макрос: 1. вместо запятых подставляет точки (что превращает введёное значение в дату) 2. преобразует "короткую" дату в "полную" (не приходится объяснять экселу какое на дворе столетие)
Вопрос в более глубокой автоматизации. т.к. человек при вводе мыслит числом и месяцем (без года) (такова специфика ввода), то хотелось бы во избежания дополнительного напряжения/отвлечения мозга на ненужные операции сократить кол-во ошибок при вводе путем избавления человека от необходимости вводить год.
тогда от вводит всего два числа. Например, "12,12", что должно означать 12.12.2014 В таком случае данный макрос необходимо дополнить двумя ограничениями: 1. указать несколько столбцов, где вводится даты (т.к. в других столбцах вводятся цифры и точку на запятую менять не надо) 2. дополнять введённую пару чисел номером года. Что можно сделать двумя путями: 2.1. либо дополнять просто числом, прописанным в конкретной ячейке (например, $E$1) 2.2. либо дополнять текущим годом (который, очевидно, можно извлечь из встроенной формулы типа "СЕГОДНЯ()")
помогите, пожалуйста, с изменением макроса
в теме "замена запятой на точку при вводе" (имелось в виду ввод даты) )http://www.excelworld.ru/forum/2-14531-1 был получен замечательный макрос
[vba]
Код
Option Explicit Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim s$ If Target.Count > 1 Then Exit Sub If InStr(1, Target.Formula, ",") = 0 Then Exit Sub s = Target.Formula If UBound(Split(s, ",")) = 2 Then s = Replace(s, ",", ".") If IsDate(s) Then Target = Format(s, "dd.mm.yyyy") End Sub
[/vba]
при вводе даты макрос: 1. вместо запятых подставляет точки (что превращает введёное значение в дату) 2. преобразует "короткую" дату в "полную" (не приходится объяснять экселу какое на дворе столетие)
Вопрос в более глубокой автоматизации. т.к. человек при вводе мыслит числом и месяцем (без года) (такова специфика ввода), то хотелось бы во избежания дополнительного напряжения/отвлечения мозга на ненужные операции сократить кол-во ошибок при вводе путем избавления человека от необходимости вводить год.
тогда от вводит всего два числа. Например, "12,12", что должно означать 12.12.2014 В таком случае данный макрос необходимо дополнить двумя ограничениями: 1. указать несколько столбцов, где вводится даты (т.к. в других столбцах вводятся цифры и точку на запятую менять не надо) 2. дополнять введённую пару чисел номером года. Что можно сделать двумя путями: 2.1. либо дополнять просто числом, прописанным в конкретной ячейке (например, $E$1) 2.2. либо дополнять текущим годом (который, очевидно, можно извлечь из встроенной формулы типа "СЕГОДНЯ()")
помогите, пожалуйста, с изменением макросакарандаш
SLAVICK, для того чтоб не приходилось "заменять" то что неправильно, можно ведь заставить правильно вводить изначально, вы так не считаете? заставить правильно вводить можно через ограничения. Плюс при таком подходе отпадает необходимость в поиске решения второго задания, поскольку достаточно будет формата ячеек дата и ввода всего лишь двух чисел (чего и хочет ТС).
SLAVICK, для того чтоб не приходилось "заменять" то что неправильно, можно ведь заставить правильно вводить изначально, вы так не считаете? заставить правильно вводить можно через ограничения. Плюс при таком подходе отпадает необходимость в поиске решения второго задания, поскольку достаточно будет формата ячеек дата и ввода всего лишь двух чисел (чего и хочет ТС).DJ_Marker_MC
для того чтоб не приходилось "заменять" то что неправильно, можно ведь заставить правильно вводить изначально, вы так не считаете? заставить правильно вводить можно через ограничения.
Я с Вами согласен, но почитайте прошлую тему ТС Он знает, что он вводит не в таком виде как нужно, но ввиду особенностей его работы - крайне неудобно переключать раскладки, или вводить даты через слеш
для того чтоб не приходилось "заменять" то что неправильно, можно ведь заставить правильно вводить изначально, вы так не считаете? заставить правильно вводить можно через ограничения.
Я с Вами согласен, но почитайте прошлую тему ТС Он знает, что он вводит не в таком виде как нужно, но ввиду особенностей его работы - крайне неудобно переключать раскладки, или вводить даты через слеш SLAVICK
DJ_Marker_MC, "правильно" и "неправильно" вводить имеет противоположные значения для программиста и пользователя, т.к. оба человеки, а значит создания ленивые и оба хотят минимизировать телодвижения. Но ведь программисты для того и созданы, чтобы один раз "подвигать телом", чтобы потом юзеры им не двигали бесмысленно и не отвлекали своё внимание от главного - ведь там и так ошибок и опечаток хватает. Поэтому лучше потерять два часа, а потом долететь за 5 минут.
DJ_Marker_MC, "правильно" и "неправильно" вводить имеет противоположные значения для программиста и пользователя, т.к. оба человеки, а значит создания ленивые и оба хотят минимизировать телодвижения. Но ведь программисты для того и созданы, чтобы один раз "подвигать телом", чтобы потом юзеры им не двигали бесмысленно и не отвлекали своё внимание от главного - ведь там и так ошибок и опечаток хватает. Поэтому лучше потерять два часа, а потом долететь за 5 минут.карандаш
If UBound(Split(s, ",")) = 2 Then s = Replace(s, ",", ".") If IsDate(s) Then Target = Format(s, "dd.mm.yyyy")
между ними надо вставить условие проверки отсутствия символов после второй запятой и через then добавить содержимое произвольной ячейки просто не силён в бейсике. Это какие-то функции нахождения второго вхождения символа в строке и отрезания конца с проверкой длинны этого конца на ноль. наверное. может есть более красивое решение
тут что-то долно быть совсем просто:
If UBound(Split(s, ",")) = 2 Then s = Replace(s, ",", ".") If IsDate(s) Then Target = Format(s, "dd.mm.yyyy")
между ними надо вставить условие проверки отсутствия символов после второй запятой и через then добавить содержимое произвольной ячейки просто не силён в бейсике. Это какие-то функции нахождения второго вхождения символа в строке и отрезания конца с проверкой длинны этого конца на ноль. наверное. может есть более красивое решениекарандаш
SLAVICK, конечно, читал из написанно понял, что макрос написан и переписыванию не подлежит может что-то не так понял
Да, в столбце будут только даты. Но ваш пост я воспринял как отказ от дальнейшей модификации, поэтому начал искать другие пути, не указанные в ТС Поэтому предположил, что вторую запятую несложно ввести (чтобы алгоритм не переделывать) Пусть, типа, будут две запятые для идентификации вводимого текста как даты.
Получается, что есть выбор, есть два решения: 1. задавать номера столбцов и использовать одну запятую. При этом надо корректировать макрос при смещении столбца (изменении его номера), что подразумевает сопровождение (это минус) 2. использовать две запятые и не ограничивать себя столбцами (и сопровождением).
наверное, второй вариант предпочтительней. Если несложно, помогите его реализовать.
В принципе, не откажусь и от реализации первого варианта (вдруг возникнут непредвиденные сложности с вводом текста в любой ячейке)
SLAVICK, конечно, читал из написанно понял, что макрос написан и переписыванию не подлежит может что-то не так понял
Да, в столбце будут только даты. Но ваш пост я воспринял как отказ от дальнейшей модификации, поэтому начал искать другие пути, не указанные в ТС Поэтому предположил, что вторую запятую несложно ввести (чтобы алгоритм не переделывать) Пусть, типа, будут две запятые для идентификации вводимого текста как даты.
Получается, что есть выбор, есть два решения: 1. задавать номера столбцов и использовать одну запятую. При этом надо корректировать макрос при смещении столбца (изменении его номера), что подразумевает сопровождение (это минус) 2. использовать две запятые и не ограничивать себя столбцами (и сопровождением).
наверное, второй вариант предпочтительней. Если несложно, помогите его реализовать.
В принципе, не откажусь и от реализации первого варианта (вдруг возникнут непредвиденные сложности с вводом текста в любой ячейке)карандаш
Сообщение отредактировал карандаш - Среда, 03.12.2014, 16:21
SLAVICK, Большое спаибо! вопрос: могу я объединить?
If Target.Column > 2 And Target.Column < 6 Then ...
If Target.Column > 6 And Target.Column < 8 Then ...
If Target.Column > 9 And Target.Column < 11 Then ...
в одно условие как
If (Target.Column > 2 And Target.Column < 6) or (Target.Column > 6 And Target.Column < 8) or (Target.Column > 9 And Target.Column < 11) Then
а то повтор три раза одного и того же исполнительного блока - не камильфо. Если что-то надо изменить, так это надо делать три раза. А если кол-во действий большое? тут надо сгруппировать условия. Хотя бы через GOTO. Но go to тоже не камильфо)))
или есть ли бейсике проверка условия вхождения в множество? что-то типа If Target.Column=[3..5;7;10] Then
спасибо
SLAVICK, Большое спаибо! вопрос: могу я объединить?
If Target.Column > 2 And Target.Column < 6 Then ...
If Target.Column > 6 And Target.Column < 8 Then ...
If Target.Column > 9 And Target.Column < 11 Then ...
в одно условие как
If (Target.Column > 2 And Target.Column < 6) or (Target.Column > 6 And Target.Column < 8) or (Target.Column > 9 And Target.Column < 11) Then
а то повтор три раза одного и того же исполнительного блока - не камильфо. Если что-то надо изменить, так это надо делать три раза. А если кол-во действий большое? тут надо сгруппировать условия. Хотя бы через GOTO. Но go to тоже не камильфо)))
или есть ли бейсике проверка условия вхождения в множество? что-то типа If Target.Column=[3..5;7;10] Then
Сделал для ячеек. Дату можно вводить как с разделителем (любой символ, не являющийся цифрой), так и без разделителя (последовательный набор цифр). При вводе проводится проверка возможности преобразования набора символов в корректную дату. Если это возможно, вводится дата, если нет, ячейка очищается, и выводится сообщение.
Код в тело поста не поместился
Сделал для ячеек. Дату можно вводить как с разделителем (любой символ, не являющийся цифрой), так и без разделителя (последовательный набор цифр). При вводе проводится проверка возможности преобразования набора символов в корректную дату. Если это возможно, вводится дата, если нет, ячейка очищается, и выводится сообщение.