Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2016, 23:16   #1
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию Замена точки запятой сразу при вводе значения в ячейку листа

Здравствуйте Уважаемые программисты!
Подскажите пожалуйста, как кодом vba excel 2003 при вводе в ячейку точки (в любой раскладке) автоматически заменять ее на запятую?
Заранее спасибо!
ольгаг вне форума Ответить с цитированием
Старый 20.11.2016, 12:50   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Смысл в том, чтобы вводить числа? Для ячейки А1, даты тоже можно вводить (с точками)
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
  Set Target = Intersect(Target, Range("A1"))
  If Not Target Is Nothing Then
    If VarType(Target.Value2) <> vbDouble Then
      Application.EnableEvents = False
      Target.FormulaLocal = Replace(Target, ".", ",")
      Application.EnableEvents = True
    End If
  End If
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 20.11.2016, 15:41   #3
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Спасибо!
Да, нужно вводить только числа, но если ввести, например, 12.45 ,
то подстановки точки запятой не происходит, т.е. срабатывает другое событие (преобразование числа в дату), которое в итоге показывает число 16772,00.
Подскажите пожалуйста, как отменить это событие, чтобы только работало событие кода:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
  Set Target = Intersect(Target, Range("A1"))
  If Not Target Is Nothing Then
    If VarType(Target.Value2) <> vbDouble Then
      Application.EnableEvents = False
      Target.FormulaLocal = Replace(Target, ".", ",")
      Application.EnableEvents = True
    End If
  End If
End Sub
ольгаг вне форума Ответить с цитированием
Старый 20.11.2016, 16:11   #4
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Если поставить перед числом знак апострофа, то вроде бы замена числа на дату не работает. Подскажите пожалуйста, как кодом отследить событие ввода числа в ячейку и по нажатию enter (завершение ввода) добавить апостроф перед введенным числом?
Спасибо!
ольгаг вне форума Ответить с цитированием
Старый 21.11.2016, 00:04   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Обработчик события Worksheet_Change вызывается уже после того, как нажат Enter и значение преобразовано по алгоритму Excel - то есть когда "12.45" уже преобразовано в дату.
Однако, если установить ячейке текстовый формат ячейки (Ctrl+1 - Число - Текстовый), то Excel не будет преобразовывать введенный текст, и это можно сделать в обработчике:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s$
  Set Target = Intersect(Target, Range("A1"))
  If Not Target Is Nothing Then
    On Error Resume Next
    Application.EnableEvents = False
    s = Replace(Target, ".", ",")
    If IsNumeric(s) Then
      Target.Value = CDbl(s)
    Else
      Application.Undo
      MsgBox "Введено не число", vbExclamation
    End If
    Target.NumberFormat = "@" 'на всякий случай
    Application.EnableEvents = True
  End If
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 21.11.2016, 07:20   #6
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Спасибо, работает!
Только на попытку удалить значение из ячейки А1 выходит сообщение MsgBox "Введено не число", vbExclamation.
ольгаг вне форума Ответить с цитированием
Старый 21.11.2016, 11:07   #7
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Добавил проверку на пустоту
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s$
  Set Target = Intersect(Target, Range("A1"))
  If Not Target Is Nothing Then
    On Error Resume Next
    s = Replace(Target, ".", ",")
    If Len(s) Then
      Application.EnableEvents = False
      If IsNumeric(s) Then
        Target.Value = CDbl(s)
      Else
        Application.Undo
        MsgBox "Введено не число", vbExclamation
      End If
      Target.NumberFormat = "@" 'на всякий случай
      Application.EnableEvents = True
    End If
  End If
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 21.11.2016, 14:54   #8
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Спасибо большое!
ольгаг вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новой строки (снизу) при вводе значения в ячейку Z0RGE Microsoft Office Excel 2 17.04.2015 21:10
Автопереименование листа при вводе в ячейку и обратная процедура w00t Microsoft Office Excel 1 31.01.2013 13:09
Получение значения при вводе определенного значения armanmal Microsoft Office Excel 6 21.11.2011 17:30
ошибка про вводе текста через TextBox в ячейку листа alvazor Microsoft Office Excel 3 21.09.2010 12:36
При вводе значения в ячейку нужно изменить ее размер skobarka Microsoft Office Excel 2 26.09.2008 16:35