begin process at 2013 05 25 15:37:28
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Langages dérivés

 > 

VBA

 > 

Contrôle de type de données dans Excel


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Contrôle de type de données dans Excel

vendredi 29 juin 2012 à 12:59:11 | Contrôle de type de données dans Excel

Spirolini

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



vendredi 29 juin 2012 à 13:25:06 | Re : Contrôle de type de données dans Excel

ucfoutu

Membre Club
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
vendredi 29 juin 2012 à 13:28:43 | Re : Contrôle de type de données dans Excel

ucfoutu

Membre Club
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
vendredi 29 juin 2012 à 13:54:35 | Re : Contrôle de type de données dans Excel

bigfish_le vrai

Membre Club
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+
vendredi 29 juin 2012 à 14:34:56 | Re : Contrôle de type de données dans Excel

Spirolini

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 ... :)
vendredi 29 juin 2012 à 14:55:54 | Re : Contrôle de type de données dans Excel

Spirolini

Code Visual Basic :
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
vendredi 29 juin 2012 à 14:56:30 | Re : Contrôle de type de données dans Excel

ucfoutu

Membre Club
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
vendredi 29 juin 2012 à 15:52:53 | Re : Contrôle de type de données dans Excel

Spirolini

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 )
vendredi 29 juin 2012 à 16:04:01 | Re : Contrôle de type de données dans Excel

Spirolini

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)

vendredi 29 juin 2012 à 17:52:33 | Re : Contrôle de type de données dans Excel

ucfoutu

Membre Club
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

1 2

Cette discussion est classée dans : données, type, contrôle, colonne, integer


Répondre à ce message

Sujets en rapport avec ce message

conversion type [ par putch ] bonjour à tous !g un petit souci de conversion de types de données.en effet dans ma base de données access g une colonne de type oui/nonje pensai qu'i HELP ! Remplir une colonne d'un contrôle type MSFlexGrid [ par VinyDev ] Bonjour à tous,Voilà, je souhaiterai remplir une contrôle type MSFlexGrid ou ListView, mais colonne par colonne (et non ligne par ligne).En fait, les Connaitre le type de colonne [ par drouault ] Bonjour Je souhaiterais à l'aide de la méthode OpenSchema connaitre également le type de données d'une colonne. Actuellement, j'arrive à connaitre l VB6 Voir le données du Listview au démarage [ par JeffC1977 ] Salut...Petite question que j ene réussi pas à saisir pourquoi ca ne fonctionne pas...Je veux que lorsque je démarre mon programme je vois dans mon li visualisation de structures de données sur un fichier [ par hela_bouks ] Salut, la dernière fois ou j'ai posé mon problème, les réponses que j'ai reçues m'ont vraiment super aidées, c'est pour cela que je retente ma chance. Sélection d'une colonne dans un flexgrid ? [ par Stephan ] Hello,Je cherche à selectionner en une fois toutes les données contenue dans un colonne d'un MSFlexgrid sous VB6 pour les insérer dans une variable.L' requete d'insertion [ par saadatou ] Bonjour tout le mondeVoila j'ai écris une requête d'insertion qui quand je saisi les données et que je valide ,m'affiche :type de donnée incompatible. Base de données [ par kevin16 ] Bonjours a tous ! Voila je suis étudiant en et on nous a données un projet à réalisé en VB qui à un moment fait appel a une base de données de type ac Recuperer colonne listview [ par SEB73460 ] Bonjour,Comment peut on faire pour recuperer les données contenues dans une colonne de listview et les mettre dans un combobox sur une autre feuille ? URGENT : type de données d'une table attachée [ par Fianchetto ] Bonjour à tous, j'ai un grave problème actuellement que je souhaiterai vous exposer. Ma base de données est constitué de tables Excel attachées. Ces f


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,493 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales