2015-05-26 1 views
0

Я разработал UserForm для облегчения ввода данных в один из моих проектов. В этом UF есть текстовый блок , предназначенный для численного значения.VBA UserForm - лучший способ использовать TextBox как десятичный цифровой ввод, независимо от региональных настроек?

Я использую этот код, чтобы избежать текстовых записей:

Private Sub TextBox1_Change() 
    If Right(Me.TextBox1.Value, 1) = "." Or Right(Me.TextBox1.Value, 1) = "," Or _ 
     Right(Me.TextBox1.Value, 2) = ".0" Or Right(Me.TextBox1.Value, 2) = ",0" Then 

    Else 
     Me.TextBox1.Value = Val(Me.TextBox1.Value) 
    End If 
End Sub 

Мой вопрос:

В США региональные настройки, это почти работает: я могу ввести десятичное число с десятичный разделитель ., но каждый раз, когда я вводил нуль после первой цифры справа от разделителя, число усекается до целого числа.

Во французских региональных настройках, я просто не может ввести любой десятичной, это всегда целое число. Я могу отображать ., .0, , или ,0 в конце, но когда я иду дальше, он получает стирание каждый раз, когда он усекается до целого числа.

Я видел, что мы можем использовать CDbl() или такие функции тоже, но когда я пытаюсь, я получаю сообщение об ошибке каждый раз, когда вводится письмо. Может быть, CDbl() с обработчиком ошибок с использованием Val() было бы достаточно, но я не уверен, и я не могу найти способ сделать это правильно!

ответ

1

Я использую это для числового Textbox с одним знаком после запятой (см чек на него If KeyAscii = 46)

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 
    Select Case KeyAscii 
     Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _ 
     vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab 
      '~~> Check to see if there is already a decimal 
      If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0 
     Case Else 
      KeyAscii = 0 
      Beep 
    End Select 
End Sub 

Пожалуйста, изменить его в соответствии с вашими потребностями.

Для ,, KeyAscii является 44. Вы можете добавить это в приведенный выше код.

Редактировать

Вы можете использовать Application.International(xlCountrySetting) для проверки настройки страны, а затем использовать KeyAscii 44 или KeyAscii 46. Вы также можете использовать API GetLocaleInfo для получения региональных настроек.

Если я не ошибаюсь, то xlCountrySetting для Франции 33 и США является 1

Так что ваш код может быть записан в виде (Непроверено)

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 
    Select Case KeyAscii 
     Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _ 
     vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab 
      If Application.International(xlCountrySetting) = 1 Then 
       If KeyAscii = 46 Then If InStr(1, TextBox1.Text, ".") Then KeyAscii = 0 
      ElseIf Application.International(xlCountrySetting) = 33 Then 
       If KeyAscii = 44 Then If InStr(1, TextBox1.Text, ",") Then KeyAscii = 0 
      End If 
     Case Else 
      KeyAscii = 0 
      Beep 
    End Select 
End Sub 
+0

Thx мат, это было действительно полезно есть еще один подход к работе! У меня просто небольшая проблема, поскольку я обнаружил, что некоторые персонажи могут иметь один и тот же ключ ... '$ 36 vbKeyHome',' & 38 vbKeyUp', ''39 vbKeyRight' и' (40 vbKeyDown'. Любая идея о том, как avoif this? – R3uK

+0

Какие символы вы имеете в виду? –

+0

Четыре упомянутых мною, $ и Home имеют тот же ключ (36). Я надеялся использовать Right(), но символ еще не введен в поле, поэтому я не знаю, как это избежать! – R3uK