je souhaite procéder à un contrôle de type de données dans un tableau Excel.
J'ai consigné dans une feuille annexe du classeur, le type des données attendue pour chaque colonne :
Colonne 1: Integer
Colonne 2: String
Colonne 3: Date
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionSub controle_coherence() Sheets("Matrice").Select NbLignes = ... NbColonnes = ... 'COPIE-COLLE VALEUR POUR SUPPRIMER LES FORMULES Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False 'BOUCLE SUR LES COLONNES For Colonne = 1 To NbColonnes '"CONVERTIS" LES VALEURS POUR TRANSFORMER DES NOMBRES AU FORMAT TEXTE VERS LE FORMAT NOMBRE 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:=" " 'RECUPERE LE FORMAT ATTENDU ( INDIQUé SUR LA FEUILLE "DataTypes" ) Sheets("DataTypes").Select Type_a_Integrer = Cells(1 + Colonne, 2) 'RECUPERE LA VALEUR MAXIMUM ATTENDUE DANS LA CELLULE (nbcar pour un texte, et pour un numérique j'ai mis 2 pour max=99, 3 pour max=999 ...) Donnee_Max = Cells(1 + Colonne, 3) 'SUR LA FEUILLE DES DONNEES A CONTROLER Sheets("Matrice").Select ' For Ligne = 2 To NbLignes Type_Cellule = VarType(Cells(Ligne, Colonne).Value) Select Case Type_a_Integrer Case "string" 'test du type > AUCUN TEST CAR TOUT SE TRANSFORME EN STRING :D 'test du max If (Len(CStr(Cells(Ligne, Colonne).Value)) > Donnee_Max) Then MsgBox ("Erreur Texte trop long" & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne) Exit Sub End If Case "int" 'test du type Cells(Ligne, Colonne).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False If (IsNumeric(Cells(Ligne, Colonne).Value)) Or ((Cells(Ligne, Colonne).Value) = "") Then If Int(Cells(Ligne, Colonne).Value) <> Cells(Ligne, Colonne).Value Then MsgBox ("Erreur 'Non-Entier' Détecté " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne) Exit Sub End If Else MsgBox ("Erreur 'Non-Entier' Détecté " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne) Exit Sub End If 'test du max If Cells(Ligne, Colonne).Value > (10 ^ Donnee_Max) Then MsgBox ("Erreur Maximum autorisé dépassé " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne) Exit Sub End If Case "decimal" 'test du type Cells(Ligne, Colonne).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False If (IsNumeric(Cells(Ligne, Colonne).Value)) Or ((Cells(Ligne, Colonne).Value) = "") Then Cells(Ligne, Colonne).Value = Round(Cells(Ligne, Colonne).Value, Int(Right(Donnee_Max, 1))) Else MsgBox ("Erreur 'Non-Entier' Détecté " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne) Exit Sub End If 'test du max If Int(Cells(Ligne, Colonne).Value) > (10 ^ Int(Donnee_Max)) Then MsgBox ("Erreur Maximum autorisé dépassé " & vbCr & "cellule ligne " & Ligne & " colonne " & Colonne) Exit Sub End If Case "bit" 'test du type Case "date" 'test du type Case Else 'si rien.. ? End Select Next Ligne Next Colonne End Sub
xlRangeValueDefault 10 Valeur par défaut. Si l'objet Range indiqué est vide, retourne la valeur Empty (dans ce cas, utilisez la fonction IsEmpty pour le test). Si l'objet Range contient plusieurs cellules, retourne un tableau de valeurs (dans ce cas, utilisez la fonction IsArray pour le test).
Private Sub CommandButton1_Click() Dim a As String a = "21,00" MsgBox a & " ==>> " & controle_si_numeric_entier(a) a = "21.00" MsgBox a & " ==>> " & controle_si_numeric_entier(a) a = "21,01" MsgBox a & " ==>> " & controle_si_numeric_entier(a) a = "21.01" MsgBox a & " ==>> " & controle_si_numeric_entier(a) a = "blabla" MsgBox a & " ==>> " & controle_si_numeric_entier(a) a = "21" MsgBox a & " ==>> " & controle_si_numeric_entier(a) End Sub Private Function controle_si_numeric_entier(quoi) As Boolean quoi = Replace(quoi, ".", ",") If Not IsNumeric(quoi) Then Exit Function If CInt(quoi) <> quoi Then Exit Function controle_si_numeric_entier = True End Function