Contrôle de type de données dans Excel

Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012 - 29 juin 2012 à 12:59
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012 - 18 juil. 2012 à 17:07
Bonjour,

je souhaite procéder à un contrôle de type de données dans un tableau Excel.

je pensais utiliser "VarType" ou "TypeName".

Cela pose un problème car quand un utilisateur tappe un chiffre entier (exemple 132), VBA me retourne le type "Double" au lieu de Int.

Je balaie donc ma colonne avec un boucle
(exemple : for i=1 to Lignes / if cells(i,1)=...)
Je fais un test pour chaque cellule pour savoir si ma valeur est entière ou pas.

Le problème est que ceci prend trop de temps de traitement.

J'ai essayé de copié la plage de cellule (la colonne) directement dans un tableau en me disant que si une valeur n'est pas de type Integer, une erreur est retournée. Seulement VBA ne veux pas copier la plage dans un tableau de type Integer :

Cela ne fonctionne pas :
Dim Col_01() As Integer
Col_01 = Range(Cells(2, 1), Cells(NbLignes, 1)).Value

Ça fonctionne avec :
Dim Col_01() As Integer
Mais alors je perds mon contrôle de type... :(

Si vous avez une idée sur comment contrôler rapidement le type de données d'une colonne.

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
Col...

16 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 13:25
Bonjour,
Le type d'une variable est son type. Celui dans lequel elle a été déclarée.
Ne pas confondre, donc, la vérification de ce qu'une valeur de variable peut correspondre à un type (être transposée dans ce type) avec le type déclaré pour cette variable.
Lorsque tu formates une cellule, un type lui est attribué (celui qui correspond au formatage de la cellule). Si une variable se réfère à cette cellule, elle aura le type de cette cellule, sauf si tu déclares cette variable dans un autre type (encore faut-il, bien évidemment, que le contenu de cette cellule soit compatible avec le type donnée à la variable).
Nous sommes-là à la base de chez base : les variables, leur déclaration (et donc leur type), le nouveau type de "transformation" qui peut accepter la valeur de cette variable). Ce sont des choses totalement distinctes.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 13:28
Si, maintenant, ta question ne concernait pas ce que tu appelles un "type", mais autre, par exemple :
Comment savoir si un nombre (single ou double, peut importe) est un nombre entier, reformule-la donc (car ni typename ni typeof, pour résoudre cette "difficulté") !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 juin 2012 à 13:54
Salut,

je souhaite procéder à un contrôle de type de données dans un tableau Excel.


Autrement dit la valeur dans la cellule, pas dans une variable !

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


Donc à mon tour de rappeler qu'il existe une méthode appeler "validation" qui permet de définir le type de valeur attendu dans une ou plusieurs cellules.

Cela ce trouve dans le menu : Données, Validation...

A+
0
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
29 juin 2012 à 14:34
Effectivement, il y a une différence entre le type d'une variable et le type d'une valeur (une valeur peut-elle d’ailleurs être typée ?)...

Bref, je connais bien la fonctionnalité de "Validation" mais elle ne me convient pas :

Le processus visé est le suivant :
- L'utilisateur reçoit une matrice vierge
- vient y coller ses données
( je précise qu'il colle et non qu'il saisit
la fonction "validation" d'Excel n'opère alors plus ! )
- il appuie sur un bouton "Contrôle"
qui retourne une erreur
si une valeur inattendue survient en regard des type définis
( exemple dans la colonne où on attend un entier,
l'utilisateur a collé 2,3 ou 12/11/2011 )

J'ai réussi à créer mon contrôle qui balaie chaque cellule... trop long.
15 minutes pour 80 000 ligne sur 30 Colonnes.

Ma question concerne plus une recherche d'amélioration des perfs.
Comment contrôler au plus vite mes données ?
- passer par "for each cell" est-il plus rapide que for i=0 to NBLignes
- passer par une variable tableau ?
- autre méthode ?
Par exemple, on pourrait imaginer si j’attends un entier de faire une somme des valeurs des cellules de la colonne et vérifié le résultat...

Si vous avez des idées ... :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
29 juin 2012 à 14:55
Sub 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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 14:56
Désolé, mais je comprends de moins à moins la "démarche".
Je n'interviendrai à nouveau que lorsque tu l'auras exprimé en termes techniques et en utilisant la terminologie conventionnelle.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
29 juin 2012 à 15:52
Oups désolé de ne pas être clair !

Quelle démarche ou méthode adopteriez-vous pour atteindre le processus visé suivant en optimisant le temps de traitement :

- L'utilisateur reçoit une matrice Excel vierge qui contient

- une feuille "Matrice", avec
- une ligne de tire
- un bouton "Contrôle"

- une feuille "DataTypes" qui contient un tableau :
- colonne A : le nom de la colonne dans "Matrice"
- colonne B : le type de donnée attendu (selon ma syntaxe)
string, int, decimal, date, bit (rien d'autre)
- colonne C : un nombre précisant le max :
- pour string : nb caractère (exemple 100)
- pour int : nb de digit (exemple 3 pour un max à 999)
- pour decimal : nb digit avant et aprés la virgule
(exemple 5,2 pour un max à 99999,99)

- vient y coller ses données (qui viennent d'ailleurs) :
je précise qu'il colle et non qu'il saisit
> la fonction "validation" d'Excel n'opère alors plus !
en effet, que l'utilisateur choisisse de faire un simple collage
ou un collage spécial, il peut par exemple forcer
un texte dans une cellule attendant un entier !

- il appuie sur un bouton "Contrôle"
qui retourne une erreur
si une valeur inattendue survient en regard des type définis
( exemple dans la colonne où on attend un entier,
l'utilisateur a collé 2,3 ou 12/11/2011 )
0
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
29 juin 2012 à 16:04
PS : j'essaie autant que faire se peut d'utiliser la terminologie conventionnelle : feuille, ligne, colonne, cellule, message d'erreur, valeur, fonction "validation"...

pour résumer :

- un utilisateur colle des données dans la matrice

- il appuie sur le bouton "Contrôle"

- un message d'erreur apparaît pour signaler une discordance entre la valeur collée et la valeur attendue (la valeur attendue répondant à un ensemble de contraintes : type, limite max, longueur... contraintes consignées dans une seconde feuille de la matrice vierge)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 juin 2012 à 17:52
Qu'on soit ici très clairs :
Une cellule est une variable (un objet Range). Cet objet possède des propriétés, parmi lesquelles la propriété Value. Cette Propriété, lorsque non expressément typée, est de type Variant === >>
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).

Le fait de choisir un format pour une cellule attribue un type à sa propriété Value. Excel corrige toutefois spontanément le type dans certains cas (par exemple si cellule formatée en nombre, mais dans laquelle figure une lettre)

Pour ton problème, maintenant exposé plus clairement :
Ce n'est pas le type d'une donnée reçue, que tu peux contrôler. On ne saurait contrôler un type. On le déclare !
Nous n'allons tout de même pas recommencer ici une discussion récente à ce propos.
Ce que tu dois par contre faire et peux faire : c'est contrôler si la donnée reçu peut ou non correspondre à un type attendu.
Cela se fait par code, en fonction du contrôle que tu veux faire. Un contrôle "universel" n'existe pas.
exemple : si je veux contrôlker que la donnée toto peut correspondre à une date cohérente :
If isdate(toto) then msgbox "c'est une date"
Pour un nombre, c'est avec IsNumeric
Mais maintenant : ne pas confondre type Integer avec nombre entier. Le nombre 35, par exemple, est un nombre entier et peut correspondre au type Integer. Le nombre 35.00 n'en reste pas moins un nombre entier !
Voilà donc : tes vérifications sont à faire au cas par cas, en fonction de ce que TU attends.
En appelant encore une fois l'attention (comme fait récemment dans une autre discussion) sur le fait qu'une chaîne de caractères pouvant représenter un numérique n'est pas forcément un numérique et doit dans certains cas rester en type string (cas, entre autres, d'un code identificateur de produit, code postal, etc ...)
Reviens donc, si tu as une difficulté pour un cas précis, nous l'exposer en nous montrant le code tenté de vérification de compatibilité.
Une autre fois : une vérification distincte et précise devra être faite pour chaque cas (pas de "soluce" passe-partout).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
30 juin 2012 à 09:52
Merci Ucfoutu de vous intéresser à mon cas. Je vois que vous avez compris ma demande. Vous l'avez d'ailleurs reformulée dans votre dernier post. Pourriez-vous m'aider pour m'orienter vers une solution plutôt qu'une autre.

Comment procèderiez-vous, si vous deviez contrôler si les données reçues peuvent ou non correspondre à un type attendu. Sachant que le type attendu est homogène au niveau de la colonne ?

Et surtout comment optimiser les temps de traitement ?

J'ai fait le choix d'indiquer le type attendu par colonne dans une 2ème feuille...
Puis 2 boucles :
_pour chaque colonne
____pour chaque ligne
__________contrôle
____fin pour
_fin pour

J'essaie de trouver un algo qui aille plus vite, c'est tout !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 juin 2012 à 10:42
Bé ! ...
Je crois que je te l'ai dit : pas de solution "passe-partout" !
Il va en falloir une (chaque fois différente selon le type) pour chaque type attendu
Pour le reste : c'est selon :
- en te rappelant que le formatage d'une colonne "détermine" le type
- après : ou :
--- ayant identifié une donnée comme "compatible", tu t'en contentes et donne ce type à toute cette colonne
--- ou tu n'as pas confiance et veux contrôler la compatibilité de chaque donnée à accueillir dans cette colonne, et tu n'échappes alors certes pas à un examen en boucle (forcément lent)
Question, quand même :
D'où proviennent ces données ?
- si "ramassées" quelque part sans concertation avec celui qui en est l'auteur, tu t'en vas forcément vers du "boulot de bricolage"
- si échangées en concertation, tout est alors plus simple : il suffit que l'auteur t'en indique le type.
Voilà. Je pense avoir tout dit à ce propos.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 juin 2012 à 11:06
Voilà par exemple, pour contrôler qu'une donnée peut être convertie en numérique entier :
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


Il va te falloir en faire une (de fonction de cette nature. Chaque fois différente) pour chaque type attendu !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
30 juin 2012 à 11:25
Merci. Ça correspond effectivement à ce j'ai fait en fait !
On est d'accord que ce travail semble inutile si on est certain de la source.
Mais je suis du genre à mettre ceinture ET brettelles !

Pour situer ma démarche dans un cadre plus large :

Un utilisateur extrait des données (au format slk ) d'une application web.

Il doit retravailler à la main ces données (suppression de lignes, ajout de calcul > colonnes supplémentaire). C'est ce travail manuel qui peut être source d'erreur. Tout ceci est fait dans Excel.

Ces données doivent ensuite être intégrée dans une base de données SQL Server.

J'ai choisit d'utiliser une interface Access (l'interface Access est plus simple et plus sécurisée que l'interface SQL Server) pour importer les données (fichiers Excel). Dans Access, j'ai créer des tables liées à la BdD SQL Server.

Lors d'un import dans Access, si une erreur de typage survient alors il y a un message d'erreur non détaillé. Or, je souhaite que l'utilisateur sache où est son erreur qu'il puisse la corriger. Je fais donc ce travail dans Excel (l'objet de ma demande)

voili voilou :)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 juin 2012 à 11:32
Et bien, te voilà sur la voie.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
18 juil. 2012 à 17:06
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 :D
'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
0
Spirolini Messages postés 9 Date d'inscription vendredi 22 mai 2009 Statut Membre Dernière intervention 18 juillet 2012
18 juil. 2012 à 17:07
Résolu
0
Rejoignez-nous