Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
889 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1338666
zaina
Posté le 04-04-2006 à 13:49:39  profilanswer
 

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

mood
Publicité
Posté le 04-04-2006 à 13:49:39  profilanswer
 

n°1338671
kouest
Posté le 04-04-2006 à 13:52:51  profilanswer
 

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

n°1338674
zaina
Posté le 04-04-2006 à 13:55:10  profilanswer
 

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

n°1338678
kouest
Posté le 04-04-2006 à 13:59:03  profilanswer
 

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

n°1338680
zaina
Posté le 04-04-2006 à 14:00:54  profilanswer
 

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

n°1338687
kouest
Posté le 04-04-2006 à 14:08:23  profilanswer
 

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

n°1338688
kouest
Posté le 04-04-2006 à 14:08:44  profilanswer
 

et ca veut dire quoi mieux???

n°1338747
zaina
Posté le 04-04-2006 à 14:33:22  profilanswer
 

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

n°1338749
tegu
Posté le 04-04-2006 à 14:35:00  profilanswer
 

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
n°1338760
zaina
Posté le 04-04-2006 à 14:44:48  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
Quel logiciel petite base pour problèmes techniques?Petite question comparateur
Une nouvelle petite question sur les PREGPetite question PHP/SQL
Petite question[C] Petite question sur la commande 'return'
Une petite question sur gdbpetite question pour programmer sous VB
Petite erreur d'exeptionpetite question conne (j'ai cherché ss succes la réponse) [RESOLU]
Plus de sujets relatifs à : Petite curiousité sur la definition de As....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR