Re : Contrôle de type de données dans Excel
[Résolu]
Aors après avoir galéré pas mal sur les paramètres internationaux (séparateur décimal et de groupe de milliers). J'ai eu des tas de comportement non désirés. Je voulais que si on attend un nombre, alors le contrôle comprenne le point ou la virgule comme séparateur décimal, pour tout transformer en virgule sans soucis avec les %age.. (donc comprend 12.12% , 12,12% , 12.12 , 12,12 ...). Je fais :
Columns(Colonne).TextToColumns Destination:=Cells(1, Colonne), DecimalSeparator:=","
Columns(Colonne).NumberFormat = FormatColonne
Columns(Colonne).TextToColumns Destination:=Cells(1, Colonne), DecimalSeparator:="."
Columns(Colonne).NumberFormat = FormatColonne
Voici le code final :
'transforme tout en valeur
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("A2").Select
For Colonne = 1 To NbColonnes
Columns(Colonne).TextToColumns Destination:=Cells(1, Colonne), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True, DecimalSeparator:=",", ThousandsSeparator:=" "
Sheets("DataTypes").Select
Type_a_Integrer = Cells(1 + Colonne, 2)
Donnee_Max = Cells(1 + Colonne, 3)
Sheets("Matrice").Select
Select Case Type_a_Integrer
Case "string"
'MsgBox ("string")
For Ligne = 4 To NbLignes
'test du type > AUCUN TEST CAR TOUT SE TRANSFORME EN STRING
'test du max
If (Len(CStr(Cells(Ligne, Colonne).Value)) > Donnee_Max) Then
Cells(Ligne, Colonne).Select
MsgBox ("Erreur Texte trop long" & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
Next Ligne
Case "int"
'MsgBox ("int")
Donnee_Max = 10 ^ Donnee_Max
'Range(Cells(4, Colonne), Cells(NbLignes, Colonne)).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
For Ligne = 4 To NbLignes
'test du type
If (IsNumeric(Cells(Ligne, Colonne))) Or ((Cells(Ligne, Colonne)) = "") Then
If Int(Cells(Ligne, Colonne).Value) <> Cells(Ligne, Colonne).Value Then
Cells(Ligne, Colonne).Select
MsgBox ("Erreur 'Non-Entier' Détecté " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
Else
Cells(Ligne, Colonne).Select
MsgBox ("Erreur 'Non-Entier' Détecté " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
'test du max
If Cells(Ligne, Colonne).Value > (Donnee_Max) Then
Cells(Ligne, Colonne).Select
MsgBox ("Erreur Maximum autorisé dépassé " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
Next Ligne
Case "decimal"
'MsgBox ("decimal")
Entier_Max = 10 ^ Int(Donnee_Max)
Nb_Decimal = Int(Right(Donnee_Max, 1))
FormatColonne = "0." & Right("00000000000000", Nb_Decimal)
Columns(Colonne).TextToColumns Destination:=Cells(1, Colonne), DecimalSeparator:=","
Columns(Colonne).NumberFormat = FormatColonne
Columns(Colonne).TextToColumns Destination:=Cells(1, Colonne), DecimalSeparator:="."
Columns(Colonne).NumberFormat = FormatColonne
'Range(Cells(4, Colonne), Cells(NbLignes, Colonne)).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
For Ligne = 4 To NbLignes
'test du type
If (Cells(Ligne, Colonne) = "") Then
Else
If (IsNumeric(Cells(Ligne, Colonne))) Then
'Cells(Ligne, Colonne).Select
'MsgBox (Cells(Ligne, Colonne).Value)
'MsgBox (Round(Cells(Ligne, Colonne).Value, Nb_Decimal))
Cells(Ligne, Colonne).Value = Round(Cells(Ligne, Colonne).Value, Nb_Decimal)
Else
Cells(Ligne, Colonne).Select
MsgBox ("Erreur 'Non-Décimal' Détecté " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
'test du max
If Int(Cells(Ligne, Colonne).Value) > (Entier_Max) Then
Cells(Ligne, Colonne).Select
MsgBox ("Erreur Maximum autorisé dépassé " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
End If
Next Ligne
Case "bit"
'MsgBox ("bit")
For Ligne = 4 To NbLignes
'test du type
If (Cells(Ligne, Colonne).Value <> 1) And (Cells(Ligne, Colonne).Value <> 0) And (Cells(Ligne, Colonne).Value <> "") Then
Cells(Ligne, Colonne).Select
MsgBox ("Erreur booléen (1 ou 0) attendu " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
Next Ligne
Case "date"
'MsgBox ("date")
For Ligne = 4 To NbLignes
If (Cells(Ligne, Colonne) = "") Then
Else
'test du type
If IsDate(Cells(Ligne, Colonne)) Then
Else
Cells(Ligne, Colonne).Select
MsgBox ("Erreur Format date attendu " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne)
Exit Sub
End If
End If
Next Ligne
Case Else
For Ligne = 4 To NbLignes
'si rien.. ?
Next Ligne
End Select
Next Colonne