Petite curiousité sur la definition de As....

Petite curiousité sur la definition de As.... - VB/VBA/VBS - Programmation

Marsh Posté le 04-04-2006 à 13:49:39    

:sarcastic: excusé moi les experts mais j'ai une petite question un peu bete je pense
 
Qu'elle est la différence entre  

  • as String
  • As long


Merci de votre compréhension
 
Zaina :hello:

Reply

Marsh Posté le 04-04-2006 à 13:49:39   

Reply

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

Reply

Marsh Posté le 04-04-2006 à 13:55:10    

Excuse ma stupidité mais une chaine elle peut etre aussi numérique?
 
Merci

Reply

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

Reply

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)
Dim result As String
 
If Target.Row >= 19 And Target.Row <= 39 Then
     
    If Cells(Target.Row, 12).Value = 0 Then
        If Cells(Target.Row, 5).Value <> "" Then
        Cells(Target.Row, 5).Value = ""
        End If
        If Cells(Target.Row, 7).Value <> "" Then
        Cells(Target.Row, 7).Value = ""
        End If
    Exit Sub
    End If
       
    If Cells(Target.Row, 12).Value > 0 And Cells(Target.Row, 5).Value > 0 Or Cells(Target.Row, 7).Value > 0 Then
         
        If Target.Column = 7 Then
        result = Cells(Target.Row, 5).Value * Cells(Target.Row, 12).Value
            If Target.Value <> result Then
            Cells(Target.Row, 5).Value = Cells(Target.Row, 7).Value / Cells(Target.Row, 12).Value
            End If
        End If
         
        If Cells(Target.Row, 12).Value <> Cells(Target.Row, 7).Value / Cells(Target.Row, 5).Value Then
        Cells(Target.Row, 7).Value = Cells(Target.Row, 5).Value * Cells(Target.Row, 12).Value
        End If
             
        If Target.Column = 5 Then
        result = Cells(Target.Row, 7).Value / Cells(Target.Row, 12).Value
            If Target.Value <> result Then
            Cells(Target.Row, 7).Value = Cells(Target.Row, 5).Value * Cells(Target.Row, 12).Value
            End If
        End If
 
    End If
Exit Sub
End If


 
Merci

Reply

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

Reply

Marsh Posté le 04-04-2006 à 14:08:44    

et ca veut dire quoi mieux???

Reply

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

Reply

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


Message édité par tegu le 04-04-2006 à 14:36:52
Reply

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.
 
 :ange:  
 
Merci beaucoup celà me permet de progresser et d'attaquer une autre problematique. :pt1cable: et c'est parti

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed