Petite curiousité sur la definition de As.... - VB/VBA/VBS - Programmation
Marsh Posté le 04-04-2006 à 13:52:51
quand tu déclare une variable, string est une chaine de caractères
long est un nombre sur 4 octets
exe:
titi as string
toto as long
titi = "je suis une chaine"
toto = 358794,56
Marsh Posté le 04-04-2006 à 13:55:10
Excuse ma stupidité mais une chaine elle peut etre aussi numérique?
Merci
Marsh Posté le 04-04-2006 à 13:59:03
tu peut bien déclarer un nombre (ex "2" ) en tant que chaine, mais tu ne pourras pas faire les memes fonctions dessus, du style division, somme ...
tu pourras que utiliser les fonctions s'applicant à des chaines de caractères (concaténation ...)
Marsh Posté le 04-04-2006 à 14:00:54
Alors je ne comprend pas pourquoi ma macro marche mieux avec as string que as long?
Private Sub Worksheet_Change(ByVal Target As Range) |
Merci
Marsh Posté le 04-04-2006 à 14:08:23
doit fonctionner en déclarant en as long.
mais je te conseille de rajouter des clng()
c'est a dire ca converti en long, a appliquer sur par exemple : Cells(Target.Row, 7).Value
Marsh Posté le 04-04-2006 à 14:33:22
Ca veut dire que lorseque je depasse les million vers des milliard dans la colonne 7 ca me fais le calcule bien et vite alors qu'en je met as long c'est un message d'erreur " overflow".
NB: mettre des clng? qu'est ce que celà signifierait
Marsh Posté le 04-04-2006 à 14:35:00
La programmation en VBA fait de la transformation de type à la volée.
Dans ta ligne de code
result = Cells(Target.Row, 7).Value / Cells(Target.Row, 12).Value |
Cells(Target.Row, 7).Value est de type variant
Cells(Target.Row, 12).Value aussi, mais Cells(Target.Row, 7).Value / Cells(Target.Row, 12).Value sera de type Integer ou Long ou Double ou Single en fonction du résultat.
Comme result est de type String, VBA finira enfin par transformer le nombre en chaîne de caractère.
Cela paraît pratique car on se soucie moins des correspondances chaine <-> nombre, mais cela peut se révéler très pervers dans du code, en induisant des comportements d'erreurs difficiles à déboguer après coup.
Une règle simple : tout ce qui doit servir à un calcul doit être typé en numérique (Integer, Long, Single, Double)
Kouest te propose de typer ta variable result en Long mais ce qui compte c'est de comparer un nombre avec un nombre et une chaîne avec une autre chaîne.
Quand tu fais
If Target.Value <> result Then |
tu compares un Variant à un String. VBA s'occupe de convertir à la volée et ça marche parceque le type Variant regroupe tous les autres. Mais si tu écris
If result = 15 Then |
là VBA ne va pas aimer du tout (erreur d'incompatibilité de type).
edit: si tes nombres sont de l'ordre de plusieurs milliards il faut utiliser le type numérique Double
Marsh Posté le 04-04-2006 à 14:44:48
Ok Merci j'ai compris pourquoi ça marche plus vite et d'une manière efficase meme avec as string. J'ai aussi mieux integrer la difference entre double integer et long.
Donc je vais mettre as double.
Merci beaucoup celà me permet de progresser et d'attaquer une autre problematique. et c'est parti
Marsh Posté le 04-04-2006 à 13:49:39
excusé moi les experts mais j'ai une petite question un peu bete je pense
Qu'elle est la différence entre
Merci de votre compréhension
Zaina