2013-04-12 1 views
1

J'essaie de valider les types de données de toutes les cellules dans une plage sélectionnée par l'utilisateur sont les mêmes, en utilisant une fonction VBA. Je le code suivant (simplifié), qui fonctionne pour la plupart:Vérification des types de données dans une plage

Dim vTempRange As Variant 
Dim vCell As Variant 

    vTempRange = DataRange.Value 

    For Each vCell In vTempRange 
     If Len(vCell) > 0 Then 
      'Use TypeName(vCell) 
      'Complete validation here 
     End If 
    Next vCell 

Parfois, un utilisateur peut sélectionner une colonne de pourcentages, parfois une colonne de valeurs décimales, et parfois une valeur de temps (non associée à une rendez-vous amoureux). VBA semble voir tous les trois comme Double, ce qui n'est techniquement pas incorrect. Le problème est que le format de la sélection sera utilisé comme partie de la sortie finale, donc 12:00:00 devrait s'afficher comme tel, et non 0.50, ce qui est actuellement le cas.

Je regardai en utilisant quelque chose comme ceci en conjonction:

Dim vCell As Variant 

    For Each vCell In DataRange 
     If Len(vCell) > 0 Then 
      'Use vCell.NumberFormat 
      'Complete validation here 
     End If 
    Next vCell 

Mais le NumberFormat est pas conforme. par exemple, un utilisateur peut avoir un pourcentage listé comme 0% par rapport à 0.000% ou une durée h:m:s par rapport à hh:mm:ss, donc je considère qu'il est difficile de capturer correctement cette valeur.

Existe-t-il un moyen de déterminer avec précision sans intervention de l'utilisateur lorsqu'une heure est sélectionnée par rapport à l'un des autres types? La détermination d'une valeur en pourcentage par rapport à une valeur décimale 0<x<1 serait également utile, mais pas obligatoire. J'ai d'autres options à ma disposition, comme ignorer le formatage dans la sortie finale (vraiment pas souhaitable) ou demander explicitement à l'utilisateur d'identifier le type (mais ce n'est ni aussi propre ni automatique que je le voudrais).

+0

Avez-vous envisagé d'utiliser des expressions régulières analyser le texte de la cellule, puis forcer un format spécifique basé sur le résultat? –

+0

@RossMcConeghy Je n'avais pas; Je pense qu'il devrait y avoir une solution plus simple avec VBA. – Gaffi

Répondre

3

Essayez ceci. Collez ceci dans un module. Vous pouvez ensuite l'utiliser comme une formule de feuille de calcul.

J'ai eu ce code dans ma base de données qui a été ramassé de here et je l'ai modifié pour répondre à vos besoins.

Public Function CellType(c) 
    Application.Volatile 
    Select Case True 
     Case IsEmpty(c): CellType = "Blank" 
     Case Application.IsText(c): CellType = "Text" 
     Case Application.IsLogical(c): CellType = "Logical" 
     Case Application.IsErr(c): CellType = "Error" 
     Case IsDate(c): CellType = "Date" 
     Case InStr(1, c.Text, ":") <> 0: CellType = "Time" 
     Case InStr(1, c.Text, "%") <> 0: CellType = "Percentage" 
     Case IsNumeric(c): CellType = "Value" 
    End Select 
End Function 

ScreenShot

enter image description here

Vous pouvez encore modifier pour ajouter une clause IF à l'intérieur Case IsNumeric(c): CellType = "Value" pour vérifier les décimales, la notation scientifique etc utilisant INSTR

+0

Cela peut avoir fait l'affaire. Je dois m'assurer que tous mes cas sont couverts, d'abord, mais merci! – Gaffi

+0

Non seulement couvrir les cas est important, mais en veillant à ce qu'ils soient dans une séquence particulière. Par exemple, ne cherchez pas Case IsNumeric (c): CellType = "Number" 'Avant de vérifier la date/heure /% else, vous obtiendrez' number' pour tout;) –

+0

Right! Je suis en train de lier ceci à un 'Enum', donc certains types que vous avez listés ne sont pas utilisés. Je vais toujours les garder pour la raison que vous avez indiquée, mais pour ces cas, j'ajoute un élément «invalide» à la liste pour ces cas. – Gaffi

1

Declare vCell as Range puis faites votre chèque:

TypeName(vCell.Value)

qui va attraper avec précision vos dates. Vous aurez probablement besoin d'ajouter une logique si/alors pour capturer des "pourcentages" puisque ce sont des valeurs de type double - la partie "%" est simplement une mise en forme de cellule, vous pouvez donc simplement vérifier Right(vCell.NumberFormat,1) = "%".

Questions connexes