Message d'erreur dans Excel VBA

Résolu
Signaler
Messages postés
47
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
21 mai 2007
-
Messages postés
47
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
21 mai 2007
-
Bonjour;

Petit Pb tout bête dans macro ci-dessous, aprés exécution il me renvoie un message d'erreur n°6 "Dépassement de capacité" sur la ligne "Prix = Montant / Quantite"
. Je dois avoir un PB avec mes variables !

Encore un fois ça doit être un truc bête qui m'échappe !

Sub Calcule_Prix()
DerLigne = Range("E1").End(xlDown).Row
Dim Prix, Montant, Quantite As Double
For i = 2 To DerLigne
    Montant = Cells(i, 3).Value
    Quantite = Cells(i, 2).Value
    Prix = Montant / Quantite    Cells(i, 4).Value Prix: NumberFormat "#,##0.00"
Next i
End Sub

D'avance Merci

Maxou

12 réponses

Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Statut
Membre
Dernière intervention
17 février 2007

Donc, au final le code suivant devrait fonctionner :

Sub Calcule_Prix()
DerLigne = Range("E1").End(xlDown).Row
Dim Prix As Double, Montant As Double, Quantite As Double
For i = 2 To DerLigne
Montant = Cells(i, 3).Value
Quantite = Cells(i, 2).Value
If Montant > 0 And Quantite > 0 Then
Prix = Montant / Quantite
Cells(i, 4).NumberFormat = "#,##0.00"
Cells(i, 4).Value = Prix
End If
Next i
End Sub
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Euh... rajouter : Dim DerLigne As Long

Us.
Messages postés
630
Date d'inscription
samedi 15 février 2003
Statut
Modérateur
Dernière intervention
9 octobre 2011
1
Vérifie que Montant et Quantité sont différents de 0

Juste faites-le
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Statut
Membre
Dernière intervention
17 février 2007

OK avec Stephane33 et j'ajouterai qu'en VBA, la syntaxe de déclaration :

Dim Prix, Montant, Quantite As Double

veut dire que Prix et Montant sont considérés comme Variant et non comme Double, ce qui peut entraîner certaines erreurs.
Cette syntaxe est comprise en .NET mais pas dans les précédentes versions de VB. Donc, il vaut mieux déclarer comme ça :

Dim Prix As Double, Montant As Double, Quantite As Double

ou

Dim Prix As Double
Dim Montant As Double
Dim Quantite As Double
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Salut,

J'ai pas regardé en détail, mais la ligne :
    Cells(i, 4).Value Prix: NumberFormat "#,##0.00"

me parait étrange... NumberFormat s'applique à quoi ?

actuellement à rien ! c'est peut-être cela le problème...

Amicalement,
Us.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

Dolphin Boy, tu dis "Dim Prix, Montant, Quantite As Double"
Il n'y a que Quantite qui est 'Double', le reste est en 'Variant', voici la bonne syntaxe :
Dim Prix As Double, Montant As Double, Quantite As Double

@++

Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Statut
Membre
Dernière intervention
17 février 2007

Heu, Mortalino, je crois que tu confusionnes. Relis mes 2 posts ;-)
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Je me cache où ?
Bon allez, je sors...

Désolé, Dolphin, je t'offre toutes mes excuses.
(ça fait 3 jours, je dis n'importe quoi ! J'ai besoin de repos)

Je vais aller lire le règlement, ça me fera du bien ! ;-|
Messages postés
47
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
21 mai 2007

Merci Dolphin Boy;

La correction que tu m'as proposée marche au poil ! Je ne suis pas encore trés à l'aise avec les variables et leur déclaration.

Bonne journée à toi.

A+
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Mouais... et les autres ? ... sniff....


Si je peux tout de même donner encore un conseil, l'utilisation de :


"DerLigne = Range("E1").End(xlDown).Row" est porteuse d'un certain" risque"... dans le sens où si l'utilisateur supprime une ligne, il y aura un blanc, donc la dernière ligne s'arrêtera à ce blanc, et non à la fin... c'est donc à controler avant.

L'inverse est peut-être préférable, selon le cas. Ainsi partir de la dernière ligne de la feuille et remonter te donnera probablement la dernière ligne que tu recherches... Avec la déclaration de la variable, on a :
DerLigne = Range("E65536").End(xlUp).Row

Mais, le mieux serait d'utiliser UserRange (ou quelque chose qui ressemble à ça, j'ai un peu oublié le mot clé excat )

Amicalement,
Us.


 


 
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Statut
Membre
Dernière intervention
17 février 2007

N'étant pas féru de VBA, j'ai laissé passer ça. Effectivement us_30 à raison et mérite d'avoir ses réponses acceptées.
Messages postés
47
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
21 mai 2007

Merci US;

Te te remercie également pour tes propositions.

J'ai modifié la déclaration des variables comme tu l'as proposé.
En ce qui concerne la ligne "DerLigne = Range("E1").End(xlDown).Row" elle ne pose pas de PB pour cette macro. Par contre pour les autres fois j'en tiendrai compte.

Bonne journée à toi.

Maxou