Menu

Appliquer une formule jusqu'à la derniere ligne des variables [Résolu/Fermé]

- - Dernière réponse :  yanounou - 11 janv. 2013 à 19:28
Bonjour,

Je souhaiterais avoir une petite aide car je me débrouille sur Excel 2003 mais ne sais pas utiliser VBA (donc j'utilise de temps à autre l'enregistreur).

Je souhaiterais savoir comment appliquer une formule simple via VBA mais pas jusqu'à la fin de la colonne mais à celles des variables utilisées.

Par exemple : Sur un fichier avec des nombres en colonne A, d'autres en colonne B, je voudrais appliquer la soustraction colonne A-colonne B.

Mais comment dire à VBA de faire glisser la formule soustraction sur toutes les lignes de la colonne C MAIS seulement tant qu'il y a des valeurs sur la colonne A ou la B ?

L'extract de base est assez simple, c'est un fichier comptable avec des débits (colonne A) et des crédits (colonne B) et je voudrais calculer un solde (différence entre les deux).

Je vous remercie pour votre réponse.



Afficher la suite 

9 réponses

0
Merci
Bonjour

Pourquoi passer par le VBA et pas simplement par une formule en colonne C ?

=SI(OU(A1<>0B1<>0);B1-A1;"")

Cette formule étirée le plus bas possible affiche la différence si un des nombres en A et B n'est pas nul (ou cellule vide) et rien dans le cas contraire (deux cellules vides par ex)

Me dire si ce n'est pas ça que vous vouliez
Messages postés
16904
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
14 juin 2019
3488
0
Merci
Salut,

colle ce code dans un module ou dans les propriétés d'un activex, la formule s'appliquera uniquement aux cellules renseignées en A et B

Sub FormuleSoustraction()
Dim lg, i As Long
Application.ScreenUpdating = False
With ActiveSheet.UsedRange
lg = .Row + .Rows.Count - 1
End With
For i = lg To 1 Step -1
If Cells(i, "A") <> "" And Cells(i, "B") <> "" Then
Cells(i, "C").FormulaR1C1 = "=RC[-2]-RC[-1]"
End If
Next i
Application.ScreenUpdating = True
End Sub

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
Merci mike cela fonctionne en ajoutant ton code au milieu du mien et en faisant qques modifications notamment :

For i = lg To 2 Step -1 (pour qu'il n'efface pas la premiere ligne d'entete qui me sert ensuite pour un TCD)

With ActiveSheet.Range("D1:E65000") (pour qu'il selectionne que mes colonne A et B, qui sont en fait D et E dans les faits)

Je vous remercie car sans l'enregistreur de macro je saurais incapable d'expliquer à VBA ce que je veux faire.
Messages postés
22748
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
11 juin 2019
5498
0
Merci
Bonjour à tous,

ou bien (à partir de la ligne 2) :
[C2].Resize(Application.Min(Cells(Rows.Count, "A").End(xlUp).Row - 1, Cells(Rows.Count, "B").End(xlUp).Row - 1), 1).FormulaLocal = "=B2-A2"

Mais c'est vrai, autant déjà apprendre à se servir d'excel et saisir la formule directement dans la feuille en testant s'il faut afficher le résultat ou non.

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
0
Merci
Merci Eric et Mike. Je vais tester votre code. Je vais essayer de le placer dans mon code correctement et voir si ca fonctionne. Je le ferai demain car le fichier est au boulot.

VTP je vous remercie également. Sur excel je fais pas mal de chose meme si je maitrise pas tout et ai besoin parfois de revoir sur le net comment utiliser une formule non utilisée depuis un moment. Je souhaite du VBA car cette manip (entre d'autres) est répétitive donc je voudrais l'automatiser. Sur excel je sais le faire mais c'est sur VBA que je séche.

Très bonne soirée et je reviens demain avec un sourire ou des larmes suivant l'essai du code.
eriiic
Messages postés
22748
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
11 juin 2019
5498 -
je voudrais l'automatiser
Donc rempli toutes les lignes prévues (même si A ou B vide) avec la formule qui teste pour afficher ou non. Qu'elle soit prête pour les futures saisies.
Et s'il ne doit pas y avoir d'autres saisies autant mettre directement le résultat au lieu de la formule non ?

eric
Messages postés
16904
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
14 juin 2019
3488
0
Merci
Re,

si tu veux tester un exemple sur ce lien avec 3 possibilités de déclenchement

http://cjoint.com/?CAksFwZCJ6G

mais je suis tout a fait d'accord sur le fait qu'il serait préférable de traiter le problème par formule plutôt que par VBA, pourquoi faire compliqué lorsqu'il est possible de faire simple

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
Messages postés
15079
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
23 juin 2018
3573
0
Merci
Bonjour à tous,

tu as une méthode toute simple à utiliser. Si tu veux mettre ta formule solde en C2 par exemple, tu saisis :
=B2-A2

Tu te positionnes en bas à droite de C2 et tu doubles clique quand tu as la petite croix :
ta formule descend automatiquement à la fin de tes données.
0
Merci
Bonsoir,

Je vous remercie pour ces conseils. Je vais tester demain. En fait ce que j'ai demandé sur ce forum n'est qu'une partie des actions que je dois faire sur cette base de données. Effectivement en general je fais du excel pour tout (ne maitrisant pas le code).

Mais tous les mois j'envoie des extracts de contrôles budgétaires aux 10 responsables d'unité de mon périmètre. Ces extracts sortent d'un ERP et évoluent selon les mois et les périmètres choisis. Je perds 3 minutes pour faire toujours la meme choses sur un fichier (mise en forme, formules et TCD). Donc si je fais une macro je gagnerai du temps et consacrerai plus de temps à l'analyse.
0
Merci
Bonsoir,

Merci mike cela fonctionne en ajoutant ton code au milieu du mien et en faisant qques modifications notamment :

For i = lg To 2 Step -1 (pour qu'il n'efface pas la premiere ligne d'entete qui me sert ensuite pour un TCD)

With ActiveSheet.Range("D1:E65000") (pour qu'il selectionne que mes colonne A et B, qui sont en fait D et E dans les faits)

Je vous remercie tous et vous êtes doués car sans l'enregistreur de macro je saurais incapable d'expliquer à VBA ce que je veux faire.

Bonne journée et je vais tenter maintenant de demander à VBA désélectionner du TCD certaine valeurs de certains champs.
eriiic
Messages postés
22748
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
11 juin 2019
5498 -
Bonjour,

Au passage ma proposition du [post 3 http://www.commentcamarche.net/forum/affich-26873406-appliquer-une-formule-jusqu-a-la-derniere-ligne-des-variables#3] te faisait la même chose.
Ce n'est pas parce qu'il n'y a pas de boucle et une seule ligne que c''est incomplet. C'est juste plus rapide parce qu'il n'y a pas de boucle justement.

eric
0
Merci
Eric en fait j'ai essayé de remplacer le code de mike à la 2e ligne par le tien mais cela me donnait un message d'erreur. Mais je ne dis pas que ton code est faux, c'est plutot moi qui n'a pas su bien l'insérer ou pas pu trouver comment l'adapter dans mon code.

Ceci etant en modifiant un peu le code de Mike pour que ma ligne d'entete ne soit pas écrasée par la soustraction qui remonte, tout fonctionne.

En revanche j'ai essayé d'automatiser une selection de valeur de champs dans le tableau croisé dynamique et je rencontre le problème suivant :

Le code fonctionne si je lui demande de décocher ou de cocher des valeurs qui existent. mais j'ai testé le code sur une valeur qui n'est pas présente dans la base et là VBA plante. Ce qui m'embête car la base peut changer :les champs seront toujours la mais les valeurs peuvent évoluer et je voudrais faire un code générique.

C'est un extract gestion avec un champ "sous section" (qui est le service) et un champ "poste" (qui est une nature de couts). Mais suivant les périmètre et les ecritures comptables qui seront saisies, chaque mois les valeurs peuvent changer.

Concrètement : Comment dire à VBA de me cocher ou décocher tels valeurs de champs mais sans qu'il plante dans le cas où ses valeurs ne seraient pas présentes dans la base de données.

En vous remerciant