Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 L'addition SVP !!

Gok73

XLDnaute Nouveau
Bonjour,

Help !

Je crise sur une formule ultra simple en VBA…ma demande d’aide a pour but de voir mon erreur de programmation, vu que je suis débutant, pour que je les cerne plus facilement. Sinon je comprendrai que les calculs se fassent le plus simplement avec l’automatisation… mon but ici est plus pour cerner la programmation qu’autre chose.

j'essaie de faire une simple addition (Prix HT + TVA) j'ai beau essayer de voir mais à chaque fois c'est la ligne "nblignes" qui pose problème me dit le Debogueur...

Merci d’avance de votre aide

Sub Prix_TTC()

Range("A1").Select 'Je commence en A1

Do Until ActiveCell.Value = "Prix TTC" 'Je recherche la case Prix TTC
ActiveCell.Offset(0, 1).Select 'je passe à la cellule d’après si je n’ai pas trouvé Prix TT
Loop 'Je refais l’opération jusqu’à trouver Prix TTC

nblignes = ActiveCell.CurrentRegion.Rows.Count - 1 'Je vais à la cellule d’en dessous de l’en-tête1
For i = 1 To nblignes

ActiveCell.Value = ActiveCell.Offset(0, -2).Value + ActiveCell.Offset(0 - 1).Value 'Prix TTC + TVA
ActiveCell.Offset(1, 0).Select 'Je continue sur la cellule d’en-dessous

Next 'etc.

Range("A1").Select 'Je retourne en A1

End Sub


ça bloque à nblignes...pourquoi ????
 

Pièces jointes

  • CalculTTC.xlsm
    15.1 KB · Affichages: 13
Solution
bonjour
Sur ta proposition qui est loin d'être optimisée
j'ai rajouté un
ActiveCell.Offset(1, 0).Select
après la première boucle
et il manquait la virgule dans
ActiveCell.Offset(0, -1)

VB:
Sub Prix_TTC()

Range("A1").Select 'Je commence en A1

Do Until ActiveCell.Value = "Prix TTC" 'Je recherche la case Prix TTC
ActiveCell.Offset(0, 1).Select 'je passe ˆ la cellule dÕaprs si je nÕai pas trouvŽ Prix TT
Loop 'Je refais lÕopŽration jusquÕˆ trouver Prix TTC

nblignes = ActiveCell.CurrentRegion.Rows.Count - 1 'Je vais ˆ la cellule dÕen dessous de lÕen-tte1
ActiveCell.Offset(1, 0).Select
For i = 1 To nblignes

ActiveCell.Value = ActiveCell.Offset(0, -2).Value + ActiveCell.Offset(0, -1).Value  'Prix TTC + TVA
ActiveCell.Offset(1, 0).Select 'Je...

JM27

XLDnaute Barbatruc
bonjour
Sur ta proposition qui est loin d'être optimisée
j'ai rajouté un
ActiveCell.Offset(1, 0).Select
après la première boucle
et il manquait la virgule dans
ActiveCell.Offset(0, -1)

VB:
Sub Prix_TTC()

Range("A1").Select 'Je commence en A1

Do Until ActiveCell.Value = "Prix TTC" 'Je recherche la case Prix TTC
ActiveCell.Offset(0, 1).Select 'je passe ˆ la cellule dÕaprs si je nÕai pas trouvŽ Prix TT
Loop 'Je refais lÕopŽration jusquÕˆ trouver Prix TTC

nblignes = ActiveCell.CurrentRegion.Rows.Count - 1 'Je vais ˆ la cellule dÕen dessous de lÕen-tte1
ActiveCell.Offset(1, 0).Select
For i = 1 To nblignes

ActiveCell.Value = ActiveCell.Offset(0, -2).Value + ActiveCell.Offset(0, -1).Value  'Prix TTC + TVA
ActiveCell.Offset(1, 0).Select 'Je continue sur la cellule dÕen-dessous

Next 'etc.

Range("A1").Select 'Je retourne en A1

End Sub

ma proposition :
Il n'est pas nécessaire de sélectionner la cellule pour effectuer des actions dessus ( pas de sélect ou activate)
Code:
Sub jm()
    'déclaration de variable
    Dim cell As Range
    'Pour chaque cellule comprise enttre la cellule A2 et la dernière cellule occupée de la colonne A
    For Each cell In Range("A2:A" & Range("A1000").End(xlUp).Row)
       'j 'effectue l'addition
        cell.Offset(0, 2) = cell + cell.Offset(0, 1)
        ' je passe à la ligne suivante
    Next
End Sub
 
Dernière édition:

Gok73

XLDnaute Nouveau
Merci pour ton aide JM27
Je sors juste d'une semaine de formation VBA...et c'est très court une semaine !!!
Le formateur a beaucoup insisté sur les activecell (qu'il maîtrise très bien d'ailleurs) donc automatiquement j'essaie d'appliquer ce qu'il m'a enseigné. Les révisions vont être longues
 

JM27

XLDnaute Barbatruc
bonjour
désolé mais ton formateur a tout faux.(dans ce cas)
Si tu fais des gros traitements avec des activecell , tu vas avoir des temps de traitement très longs.
de plus tu peux travailler aussi sur des feuilles sans les sélectionner , mais en les nommant uniquement!!
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@Gok73

c'est moi qui régale, alors voici ton fichier en retour.

VB:
Sub Prix_TTC()
  Dim HT%, lig&: lig = 2: Application.ScreenUpdating = 0
  Do
    With Cells(lig, 1)
      HT = .Value: If HT = 0 Then Exit Sub
      .Offset(, 2) = HT + .Offset(, 1)
      lig = lig + 1
    End With
  Loop
End Sub

c'est pour ton exemple avec des prix entiers.

si ensuite tu utilises des prix avec des centimes, mets : Dim HT@, lig&
au lieu de : Dim HT%, lig&.

ou éventuellement : Dim HT#, lig&



quelques caractères de déclaration de type :

% : Integer
@ : Currency
# : Double

ainsi, Dim HT@ est équivalent à : Dim HT As Currency



cela dit, pourquoi faire une macro là où une simple formule suffirait ?
surtout dans un tableau structuré !
formule en C2 :

=Tableau1[[#Cette ligne];[Prix HT]]+Tableau1[[#Cette ligne];[TVA]]

(formule qui est recopiée automatiquement en dessous)

soan
 

Pièces jointes

  • CalculTTC.xlsm
    15.1 KB · Affichages: 5
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Gok73, JM27, soan (tu ne te refuses rien),

Bien d'accord JM27 mais le formateur a peut-être sa pédagogie à lui

En VBA les boucles avec modifications des cellules prennent beaucoup de temps s'il y a beaucoup de lignes.

Il faut donc les éviter, en plus c'est très facile sur un tableau structuré :
VB:
Sub Prix_TTC()
Cells.Find("Prix TTC", , xlValues).Offset(1) = "=@[Prix HT]+@[TVA]"
End Sub
A+
 

Pièces jointes

  • CalculTTC(1).xlsm
    15 KB · Affichages: 1

job75

XLDnaute Barbatruc
Mais la solution précédente nécessite que la colonne du tableau soit vide pour que la formule se propage.

Donc utilisez ceci qui fonctionnera dans tous les cas :
VB:
Sub Prix_TTC()
With [Tableau1[Prix TTC]]
    .Formula = "=@[Prix HT]+@[TVA]"
    .Value = .Value 'supprime les formules
End With
End Sub
 

Pièces jointes

  • CalculTTC(2).xlsm
    15.8 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Bonjour job75,

tu as écrit : « soan (tu ne te refuses rien) »

tu as pas vu le nom du restaurant ? c'est : « LE SWANN » !

alors c'est mon propre restaurant, à moi soan !

donc j'ai rien à payer : c'est moi qui encaisse !

(si seulement ça pouvait être vrai ! )

soan
 

Gok73

XLDnaute Nouveau
Merci pour ton aide JM27
Je sors juste d'une semaine de formation VBA...et c'est très court une semaine !!!
Le formateur a beaucoup insisté sur les activecell (qu'il maîtrise très bien d'ailleurs) donc automatiquement j'essaie d'appliquer ce qu'il m'a enseigné. Les révisions vont être longues

Merci à tous pour votre aide !
Je viens de découvrir 4 programmes différents en l'espace de 3 mails pour le même résultat !! Dingue !
Je crois que je vais des cures de Doliprane pour les semaines à venir !
Dans tous les cas, il faudra bien qu'à un moment je commence à entrer dans les détails...pour l'instant, je me concentre sur la base et je prends note de toutes vos lignes !!

Merci encore !!
 

Discussions similaires

Réponses
2
Affichages
699
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…