2016-09-11 1 views
0

J'ai ce code et j'ai besoin de la zone de texte 9 et 10 pour être le nombre vlaues en entrant dans ma table excel une idée de comment je peux résoudre ce problème?VBA Textbox à la valeur de nombre

Sub FillRanges(ws As Worksheet, L As Long) 
With ws 
    .Range("C" & L).Value = (Now) 
    .Range("D" & L).Value = Me.TextBox2 
    .Range("E" & L).Value = Me.TextBox3 
    .Range("F" & L).Value = Me.TextBox4 
    .Range("G" & L).Value = Me.TextBox5 
    .Range("K" & L).Value = Me.ComboBox1 
    .Range("L" & L).Value = Me.ComboBox2 
    .Range("M" & L).Value = Me.ComboBox3 
    .Range("N" & L).Value = Me.TextBox9 
    .Range("O" & L).Value = Me.TextBox10 
    .Range("R" & L).Value = Me.TextBox39 
    .Range("P" & L).Value = Me.TextBox40 
End With 

End Sub

+0

Qu'est-ce que vous avez essayé jusqu'à présent? Postez votre code! Qu'est-il arrivé quand vous l'avez exécuté? Qu'espériez-vous arriver à la place? Qu'est-ce que vous avez spécifiquement des problèmes avec? – Robert

Répondre

1

je pense qu'il est préférable de valider l'entrée d'utilisateur avant d'utiliser (écriture), il

de sorte que vous pouvez écrire des sous-marins de validation d'entrée utilisateur très simple et les appeler à partir de commandes changement gestionnaire d'événements, comme suit:

Option Explicit 

Private Sub TextBox9_Change() 
    ValidateNumericInput Me.TextBox9, 0, 10.4 '<--| as soon as this control text changes, call 'ValidateNumericInput' to validate it 
End Sub 


Private Sub ValidateNumericInput(tb As MSForms.TextBox, minVal As Double, maxVal As Double) 
    Dim errMsg As String 

    With tb 
     If Len(.Text) > 0 Then '<-- proceed only if there's some text to validate! 
      Select Case True 
       Case Not IsNumeric(.value) '<--| if not a "numeric" input 
        errMsg = "please enter a number" 
       Case CDbl(.Text) < minVal Or CDbl(.Text) > maxVal '<--| if "numeric" input exceeds passed range 
        errMsg = "please enter a number within " & minVal & " and " & maxVal 
      End Select 
      If errMsg <> "" Then '<--| if error message has been written 
       MsgBox "invalid input in " & tb.name & vbCrLf & vbCrLf & errMsg, vbCritical + vbExclamation + vbOKOnly, "Invalid input" '<--| infrm the user 
       .Text = "" '<--| delete textbox input 
      End If 
     End If 
    End With 
End Sub 

où je supposais une entrée de type Double serait nécessaire, mais vous pouvez facilement l'adapter à d'autres types

, vous pouvez puis ajouter les autres sous-marins comme:

ValidateStringInput(tb As MSForms.TextBox, validStrings() as String) 

et les goûts ...

+0

C'est exactement ce dont j'avais besoin! Merci – Alex

3

Vous pouvez utiliser une fonction de conversion comme CDbl(). Ce serait quelque chose comme:

Sub FillRanges(ws As Worksheet, L As Long) 
With ws 
    .Range("C" & L).Value = (Now) 
    .Range("D" & L).Value = Me.TextBox2 
    .Range("E" & L).Value = Me.TextBox3 
    .Range("F" & L).Value = Me.TextBox4 
    .Range("G" & L).Value = Me.TextBox5 
    .Range("K" & L).Value = Me.ComboBox1 
    .Range("L" & L).Value = Me.ComboBox2 
    .Range("M" & L).Value = Me.ComboBox3 
    .Range("N" & L).Value = CDbl(Me.TextBox9) 
    .Range("O" & L).Value = CDbl(Me.TextBox10) 
    .Range("R" & L).Value = Me.TextBox39 
    .Range("P" & L).Value = Me.TextBox40 
End With 

Il existe également d'autres fonctions de conversion. CInt() (entier), CLng() (long) et CDec() (décimal).