Accueil > Forum > > > > Contrôle de type de données dans Excel
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
|
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
|
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
|
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
|
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
|
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
|
|
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
Livres en rapport
|
Derniers Blogs
ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0 par Philess
L'extensibilité du Team Web Access
Le Web Access (site d'équipe) de Team Foundation Server a été complètement réécrit dans la version 2012 avec pas moins de 400.000 lignes de JavaScript. Ce nouveau modèle a été pensé pour offrir de grandes...
Cliquez pour lire la suite de l'article par Philess SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
RE : CALENDRIERRE : CALENDRIER par acive
Cliquez pour lire la suite par acive
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|