simplification d'une macro

niacniac

Nouveau membre
Bonjour,

Je viens de découvrir cet agréable forum dans le but initial de trouver une solution un problème de macro, que j'ai réussi à bidouiller pour que ça marche.

Le problème, c'est qu'avec avec ma bidouille, je ne peux pas faire transparaitre ma formule au niveau de ma feuille de résultat. Il y a trop de guillemet et il comprend rien.

Donc, existe-il une autre possibilité de sélectionner les cellules dans différentes pages sans passer par sheet("benza").cell(valeurvariable,valeurfix) afin de faire sauter tous les guillemets.

Voici mon code:


For nbcalcul = 1 To nombrecase

Cells(2, nbcalcul + 9).Select
Cells(2, nbcalcul + 9) = Sheets("benza").Cells(nbcalcul + 14, 3).Value

Cells(3, nbcalcul + 9).Select
ActiveCell.FormulaR1C1 = (Sheets("Benza").Cells(nbcalcul + 14, 9) / (Sheets("Benza").Cells(nbcalcul + 14, 9) + Sheets("ethylcya").Cells(nbcalcul + 14, 9) + Sheets("produit").Cells(nbcalcul + 14, 9) + Sheets("produit").Cells(nbcalcul + 14, 9) / Sheets("produit").Cells(7, 9) * 18) * (Cells(12, 2) + Cells(13, 2))) / Cells(12, 4)

Cells(4, nbcalcul + 9).Select
ActiveCell.FormulaR1C1 = (Sheets("ethylcya").Cells(nbcalcul + 14, 9) / (Sheets("benza").Cells(nbcalcul + 14, 9) + Sheets("ethylcya").Cells(nbcalcul + 14, 9) + Sheets("produit").Cells(nbcalcul + 14, 9) + Sheets("produit").Cells(nbcalcul + 14, 9) / Sheets("produit").Cells(7, 9) * 18) * (Cells(12, 2) + Cells(13, 2))) / Cells(12, 4)

Cells(5, nbcalcul + 9).Select
ActiveCell.FormulaR1C1 = (Sheets("produit").Cells(nbcalcul + 14, 9) / (Sheets("benza").Cells(nbcalcul + 14, 9) + Sheets("ethylcya").Cells(nbcalcul + 14, 9) + Sheets("produit").Cells(nbcalcul + 14, 9) + Sheets("produit").Cells(nbcalcul + 14, 9) / Sheets("produit").Cells(7, 9) * 18) * (Cells(12, 2) + Cells(13, 2))) / Cells(12, 4)

Cells(6, nbcalcul + 9).Select
Cells(6, nbcalcul + 9) = Cells(5, nbcalcul + 9).Value

Cells(7, nbcalcul + 9).Select
ActiveCell.FormulaR1C1 = Cells(3, nbcalcul + 9) * Cells(12, 4) + Cells(4, nbcalcul + 9) * Cells(13, 4) + Cells(5, nbcalcul + 9) * Cells(12, 10) + Cells(6, nbcalcul + 9) * 18

Cells(8, nbcalcul + 9).Select
ActiveCell.FormulaR1C1 = Cells(3, nbcalcul + 9) + Cells(4, nbcalcul + 9) + Cells(5, nbcalcul + 9) + Cells(6, nbcalcul + 9)


Next

Merci
 

niacniac

Nouveau membre
désolé pour la mauvaise mise en page. Voici la version corrigé:

Code:
For nbcalcul = 1 To nombrecase 
     
    Cells(2, nbcalcul + 9).Select 
    Cells(2, nbcalcul + 9) = Sheets("benza" ).Cells(nbcalcul + 14, 3).Value 
    
    Cells(3, nbcalcul + 9).Select 
    ActiveCell.FormulaR1C1 = (Sheets("Benza" ).Cells(nbcalcul + 14, 9) / (Sheets("Benza" ).Cells(nbcalcul + 14, 9) + Sheets("ethylcya" ).Cells(nbcalcul + 14, 9) + Sheets("produit" ).Cells(nbcalcul + 14, 9) + Sheets("produit" ).Cells(nbcalcul + 14, 9) / Sheets("produit" ).Cells(7, 9) * 18) * (Cells(12, 2) + Cells(13, 2))) / Cells(12, 4) 
     
    Cells(4, nbcalcul + 9).Select 
    ActiveCell.FormulaR1C1 = (Sheets("ethylcya" ).Cells(nbcalcul + 14, 9) / (Sheets("benza" ).Cells(nbcalcul + 14, 9) + Sheets("ethylcya" ).Cells(nbcalcul + 14, 9) + Sheets("produit" ).Cells(nbcalcul + 14, 9) + Sheets("produit" ).Cells(nbcalcul + 14, 9) / Sheets("produit" ).Cells(7, 9) * 18) * (Cells(12, 2) + Cells(13, 2))) / Cells(12, 4) 
 
    Cells(5, nbcalcul + 9).Select 
    ActiveCell.FormulaR1C1 = (Sheets("produit" ).Cells(nbcalcul + 14, 9) / (Sheets("benza" ).Cells(nbcalcul + 14, 9) + Sheets("ethylcya" ).Cells(nbcalcul + 14, 9) + Sheets("produit" ).Cells(nbcalcul + 14, 9) + Sheets("produit" ).Cells(nbcalcul + 14, 9) / Sheets("produit" ).Cells(7, 9) * 18) * (Cells(12, 2) + Cells(13, 2))) / Cells(12, 4) 
 
    Cells(6, nbcalcul + 9).Select 
    Cells(6, nbcalcul + 9) = Cells(5, nbcalcul + 9).Value 
     
    Cells(7, nbcalcul + 9).Select 
    ActiveCell.FormulaR1C1 = Cells(3, nbcalcul + 9) * Cells(12, 4) + Cells(4, nbcalcul + 9) * Cells(13, 4) + Cells(5, nbcalcul + 9) * Cells(12, 10) + Cells(6, nbcalcul + 9) * 18 
     
    Cells(8, nbcalcul + 9).Select 
    ActiveCell.FormulaR1C1 = Cells(3, nbcalcul + 9) + Cells(4, nbcalcul + 9) + Cells(5, nbcalcul + 9) + Cells(6, nbcalcul + 9) 
     
        
Next
 

zeb

Modérateur
Merci d'avoir pris en compte le fait que tu pouvais modifier ton premier post. (cf. message privé) :sarcastic:
____________________________________

Pourquoi faire autant de Select ??????
Select permet de sélectionner et d'activer une cellule. As-tu besoin de ça ?
Au vu de ton code : NON. Alors ne le fais pas, ça augmente le code inutilement, et surtout ça consomme énormément de ressources.

Et pourquoi utiliser la propriété FormulaR1C1 ??
La propriété Formula ne suffit-elle pas ?

Encore une remarque. Quand tu fais ça
Code:
Cells(..) + Cells(..)
Tu additionnes la valeur des deux cellules. C'est comme si tu écrivais :
Code:
Cells(..).Value + Cells(..).Value
Donc l'addition ne devrait pas se retrouver dans ta formule, mais le résulat de l'addition.
Dans une formule, on met plutôt quelque chose comme ça :
Code:
.Formula = "=" & (Sheets("Benza").Cells(nbcalcul + 14, 9).Address 9 + ...

Je ne comprends donc pas
Il y a trop de guillemet et il comprend rien.

Première revue:
Code:
For nbcalcul = 1 To nombrecase
    Cells(2, nbcalcul + 9) = Sheets("benza" ).Cells(nbcalcul + 14, 3).Value
    Cells(3, nbcalcul + 9).Formula = (Sheets("Benza"    ).Cells(nbcalcul + 14, 9).Value / (Sheets("Benza" ).Cells(nbcalcul + 14, 9).Value + Sheets("ethylcya" ).Cells(nbcalcul + 14, 9).Value + Sheets("produit" ).Cells(nbcalcul + 14, 9).Value + Sheets("produit" ).Cells(nbcalcul + 14, 9).Value / Sheets("produit" ).Cells(7, 9) * 18).Value * (Cells(12, 2) + Cells(13, 2).Value)) / Cells(12, 4).Value
    Cells(4, nbcalcul + 9).Formula = (Sheets("ethylcya" ).Cells(nbcalcul + 14, 9).Value / (Sheets("benza" ).Cells(nbcalcul + 14, 9).Value + Sheets("ethylcya" ).Cells(nbcalcul + 14, 9).Value + Sheets("produit" ).Cells(nbcalcul + 14, 9).Value + Sheets("produit" ).Cells(nbcalcul + 14, 9).Value / Sheets("produit" ).Cells(7, 9) * 18).Value * (Cells(12, 2) + Cells(13, 2).Value)) / Cells(12, 4).Value
    Cells(5, nbcalcul + 9).Formula = (Sheets("produit"  ).Cells(nbcalcul + 14, 9).Value / (Sheets("benza" ).Cells(nbcalcul + 14, 9).Value + Sheets("ethylcya" ).Cells(nbcalcul + 14, 9).Value + Sheets("produit" ).Cells(nbcalcul + 14, 9).Value + Sheets("produit" ).Cells(nbcalcul + 14, 9).Value / Sheets("produit" ).Cells(7, 9) * 18).Value * (Cells(12, 2) + Cells(13, 2).Value)) / Cells(12, 4).Value

    Cells(6, nbcalcul + 9).Value   = Cells(5, nbcalcul + 9).Value
    Cells(7, nbcalcul + 9).Formula = Cells(3, nbcalcul + 9) * Cells(12, 4) + Cells(4, nbcalcul + 9) * Cells(13, 4) + Cells(5, nbcalcul + 9) * _
                                     Cells(12, 10) + Cells(6, nbcalcul + 9) * 18
    Cells(8, nbcalcul + 9).Formula = Cells(3, nbcalcul + 9) + Cells(4, nbcalcul + 9) + Cells(5, nbcalcul + 9) + Cells(6, nbcalcul + 9)
Next

Bon, en regardans ton code, il me prend l'envie de factoriser un peu tout ça :
Code:
For nbcalcul = 1 To nombrecase
    Dim gros_calcul As Double

    Cells(2, nbcalcul + 9) = Sheets("benza" ).Cells(nbcalcul + 14, 3).Value

    gros_calcul = 1 / (Sheets("Benza"   ).Cells(nbcalcul + 14, 9).Value + Sheets("ethylcya" ).Cells(nbcalcul + 14, 9).Value + _
                  Sheets("produit" ).Cells(nbcalcul + 14, 9).Value + Sheets("produit" ).Cells(nbcalcul + 14, 9) / _
                  Sheets("produit" ).Cells(7, 9).Calue * 18) * (Cells(12, 2).Value + Cells(13, 2).Value)) / Cells(12, 4).Value

    Cells(3, nbcalcul + 9).Value = (Sheets("Benza"    ).Cells(nbcalcul + 14, 9).Value * gros_calcul
    Cells(4, nbcalcul + 9).Value = (Sheets("ethylcya" ).Cells(nbcalcul + 14, 9).Value * gros_calcul
    Cells(5, nbcalcul + 9).Value = (Sheets("produit"  ).Cells(nbcalcul + 14, 9).Value * gros_calcul
    Cells(6, nbcalcul + 9).Value = Cells(5, nbcalcul + 9).Value
    Cells(7, nbcalcul + 9).Value = Cells(3, nbcalcul + 9).Value * Cells(12, 4).Value + Cells(4, nbcalcul + 9).Value * _
                                   Cells(13, 4).Value + Cells(5, nbcalcul + 9).Value * Cells(12, 10).Value + _
                                   Cells(6, nbcalcul + 9).Value * 18
    Cells(8, nbcalcul + 9).Value = Cells(3, nbcalcul + 9).Value + Cells(4, nbcalcul + 9).Value + _
                                   Cells(5, nbcalcul + 9).Value + Cells(6, nbcalcul + 9).Value
Next

Ca, c'est si j'ai bien tout compris.
Sinon, toi, essaye de comprendre ma réponse :D pour mieux reposer ta question.
 

niacniac

Nouveau membre
Salut,

Pour commencer, merci d'avoir pris du temps pour répondre.

Ensuite, Au niveau des macro, je suis à un stade débutant. Disons, que je n'y connais pas grand chose. La macro a été faite aussi par un autre débutant en faisant du tatonnement.
J'ai essayé de comprendre ce qu'il fait pour pouvoir reproduire la même chose. Donc disons, que je fais des macro préhistorique...

Pour les "select", je pensais qu'il fallait activer les cases pour pouvoir faire des calculs.
Ansuite pour les formulaR1C1, D'autre calcul sont fait sur cette base dans ma macro. J'ai fait du copier collé et je ne l'ai pas modifié pour mes lignes de calcul.

Ton idée de faire une fonction Dim est très intéressante mais malheureusement elle ne me convient pas car, il me faut (pour que mon chef soit content) la formule de calcul qui apparaisse dans la case corespondante au résultat quand tu cliques sur cette case...
Malheureusement, il me faut les formules de calcul à rallonge...

Ton premier jet me semble très bien.
Le soucis, c'est que je ne comprend pas trop la différence entre:

Code:
Cells(..) + Cells(..)

et

Code:
Cells(..).Value + Cells(..).Value

A part si j'ai bien compris que c'est exactement la même chose... A moins que si il n'y a pas le ".value", il récupère le texte dans la cellule donc par exemple la formule de calcul si il y en a une au lieu de la valeur.

le fait de mettre "=" & permet d'afficher la formule de calcul sur la feuille excel?

Au début, je mettais un guillemet au début et un autre à la fin dans le but d'afficher la formule. Mais cette technique me faisait planter la formule.

Sinon, j'ai compris tout le reste. Je vais pouvoir supprimer quelques ligne de code inutile....


J'ai fait la modif suivante:

Code:
Cells(3, nbcalcul + 9).Formula = "=" & (Sheets("Benza").Cells(nbcalcul + 14, 9).value / (Sheets("Benza").Cells(nbcalcul + 14, 9).value + Sheets("ethylcya").Cells(nbcalcul + 14, 9).value + Sheets("produit").Cells(nbcalcul + 14, 9).value + Sheets("produit").Cells(nbcalcul + 14, 9).value / Sheets("produit").Cells(7, 9).value * 18) * (Cells(12, 2).value + Cells(13, 2).value)) / Cells(12, 4).value

Le soucis, c'est que le code plante. le fait de mettre "=" & fait planter le code. Est ce normal?

Ensuite pour une autre ligne:

Code:
Cells(2, nbcalcul + 9) = "=" & Sheets("benza").Cells(nbcalcul + 14, 3)

Lorsque je lance ma macro, j'ai dans ma case excel =10
J'aimerais avoir à la place =benza!C15
Comment faire...??


Merci bien
 

zeb

Modérateur
[fixed]Cells(..) + Cells(..)[/fixed] et [fixed]Cells(..).Value + Cells(..).Value[/fixed]Oui, c'est pareil. Mais justement, ça fixe les choses. Tu es débutant ? -> Fais des choses claires. ;)

A propos des Select/Selection : ;)

Ensuite, il faut faier la différence entre la valeur d'une cellule et l'adresse d'une cellule.

[fixed]Cells(2, nbcalcul + 9)[/fixed] c'est la même chose que [fixed]Cells(2, nbcalcul + 9).Value[/fixed]
Or toi, tu en veux l'adresse, pas la valeur. Donc écris [fixed]Cells(2, nbcalcul + 9).Address[/fixed]


Avant de faire [fixed]Cells(3, nbcalcul + 9).Formula = "=" & (Sheets("Benza" ).Cells(nbcalcul + 14, 9).value / (Sheets("Benza" ).Cells(nbcalcul + 14, 9).value[/fixed]regarde un peu ça :
Code:
Dim formule As String

formule = "=" & (Sheets("Benza" ).Cells(nbcalcul + 14, 9).Value / (Sheets("Benza" ).Cells(nbcalcul + 14, 9).Value
MsgBox formule
Cells(3, nbcalcul + 9).Formula = formule

formule = "=" & (Sheets("Benza" ).Cells(nbcalcul + 14, 9).Address & "/" & (Sheets("Benza" ).Cells(nbcalcul + 14, 9).Address
MsgBox formule

Cells(3, nbcalcul + 9).Formula = formule

Qu'en penses-tu ?
 

niacniac

Nouveau membre
Merci pour sur les info .value et .address

Concernant le code

Code:
Dim formule As String
formule = "=" & (Sheets("Benza" ).Cells(nbcalcul + 14, 9).Address & "/" & (Sheets("Benza" ).Cells(nbcalcul + 14, 9).Address
MsgBox formule

Cells(3, nbcalcul + 9).Formula = formule

Je n'ai pas besoin de la fonction MsgBox, sinon, j'en ai 20 au mini qui vont apparaître.

Le seul soucis de cette formule, c'est qu'elle me sélectionne l'adresse
Code:
Cells(nbcalcul + 14, 9).Address

Au lieu de l'adresse
Code:
Sheets("Benza" ).Cells(nbcalcul + 14, 9).Address

Ce qui est très embêtant...

J'ai essayé avec la fonction suivante:
Code:
Sheets("Benza" ).address.Cells(nbcalcul + 14, 9).Address

Mais ça bogue. Normal!


Sinon, sais tu où je peux trouver une liste de toutes les fonctions macro. Parce que l'aide excel est assez limité à mon goût.

Merci
 

zeb

Modérateur
>>Je n'ai pas besoin de la fonction MsgBox
Mais si. Tu es en phase de débuggage.
Donc tu en as besoin pour te rendre compte que la formule que tu veux mettre n'est pas la bonne. Cette ligne sera à virer dès que tu seras satisfait. [:spamafote]

Deuxio, tu es sur un forum public, donc tu dois vérifier tout ce qu'on te proposes. Je pourrais n'être qu'un un salaud. Je pourrais te proposer une super commande pour régler tous tes problèmes : [fixed]C:\> FORMAT C:[/fixed]Si je te dis d'utiliser la méthode Address, précipite-toi sur l'aide d'Excel. A la page Address, tu découvriras à quoi sert cette méthode (on s'en doute un peu, quand même ;) ) mais aussi tu y apprendras que cette méthode accepte 5 paramètres pour coller exactement à tes besoins.

Pour info, en VB, si tu n'as besoin que du nième paramètre de telle fonction, tu as trois façons de l'écrire. Exemple avec le 4ème paramètre de la fonction Address (par exemple ;) ) :
Dixit aide en ligne
Address, propriété
Propriété Address telle qu'elle s'applique à l'objet Range.
Cette propriété renvoie la référence de la plage dans le langage de la macro. Propriété de type String en lecture seule.

expression.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)

expression Obligatoire. Expression qui renvoie un des objets ci-dessus.

RowAbsolute Argument de type Variant facultatif. Affectez-lui la valeur True pour renvoyer la partie de ligne de la référence sous la forme d'une référence absolue. La valeur par défaut est True.

ColumnAbsolute Argument de type Variant facultatif. Affectez-lui la valeur True pour renvoyer la partie de colonne de la référence sous la forme d'une référence absolue. La valeur par défaut est True.

ReferenceStyle Argument XlReferenceStyle facultatif.

External Argument de style Variant facultatif. Affectez-lui la valeur True pour renvoyer une référence externe. Affectez-lui la valeur False pour renvoyer une référence locale. La valeur par défaut est False.

RelativeTo Argument de type Variant facultatif. Si RowAbsolute et ColumnAbsolute ont la valeur False et ReferenceStyle a la valeur xlR1C1, vous devez inclure un point de départ pour la référence relative. Cet argument est un objet Range qui définit le point de départ.

Code 1. Mettre tous les paramètres, quitte à mettre les valeurs par défaut:[fixed]MaCellule.Address True, True, xlA1, True[/fixed]
Code 2. Laisser les paramètres facultatifs à vide. Les virgules permettent de savoir quels paramètres sont renseignés :[fixed]MaCellule.Address ,,,,True[/fixed]
Code 3. Nommer explicitement les paramètres[fixed]MaCellule.Address External:=True[/fixed]



Enjoy!


(Ne compte pas sur moi pour te donner la soluce toute faite. Tu l'auras éventuellement bout par bout, et tu devras réfléchir. Ce sera alors TA soluce) ;)
 

niacniac

Nouveau membre
Au vu de tes nombreux postes sur divers sujet, je me suis dis que je pouvais avoir une certaine confiance dans tes propos...

Pour le moment, je comprenais se que tu me proposais, Même la fonction DIM.
La première fois, j'ai quand même pinailler pour comprendre se que c'était. Mais l'aide excel n'est pas très pratique à utiliser.
Tu tapes une fonction, 2x sur 3. Ca t'affiche un truc qui n'a rien à voir... ou alors, c'est moi qui n'arrive pas à me démerder...

Pour la fonction adresse, je croyais que le qu'elle étais simple...

Pour le fonction, message box, Elle ne m'est pas utile car il me suffit de sélectionner la cellule sur lequel je travaille pour voir les modification apportées.

En tout cas, mersi pour tout.
 

zeb

Modérateur
Merci de ta confiance. :merci:

Use et abuse de l'aide d'Excel. J'espère que tu n'as pas oublié d'installer l'aide de VBA/Excel.

Les fonctions sont toujours simples en VBA puisqu'elles ont plein de paramètres par défaut.

Pour la MsgBox, use et abuses-en en phase de débuggage. Tu n'auras pas toujours une cellule pour voir le résultat ;)

Il existe une autre façon de faire encore plus classe. C'est d'utiliser l'objet Debug. Par exemple, là où j'ai écrit [fixed]MsgBox formule[/fixed] mets [fixed]Debug.Print formule[/fixed]Exécute ta macro et retourne dans l'éditeur VB. Ouvre la fenêtre d'exécution ([CTRL+G]) et admire le résultat.

Encore mieux, tu peux directement y écrire du code :
[fixed]Print 1+2
3[/fixed](Tu peux écrire ? au lieu de Print)

Pour que les objets auxquels tu voudrais éventuellement accéder soient chargés, écris dans cette fenêtre après avoir mis ta macro en pause : bouton ||, instruction Stop, point d'arrêt ([F9]) ou arrêt inopiné à cause d'une erreur.

Enjoy!
 

niacniac

Nouveau membre
Pour l'aide VBA. Je suppose qu'elle est installée par défaut sur nos poste (poste entreprise). Et vu que j'en ai une d'aide VBA pas très pratique à utilise je trouve. Mais à force de pinailler, je commence à comprendre le schmilblique.

En tout cas, ça y ai, tout marche bien. C'est sûrement pas une macro d'un grand art que j'ai fais, mais elle fonctionne comme je veux.
Y aura encore quelques ajout à faire dans quelque temps, mais, normalement, il ne devrait pas y avoir de soucis..

Je te remercie pour l'aide apporté. Sans cette dernière, je serais encore dessus à me tirer les cheuveux.

 

zeb

Modérateur
Reviens quand tu veux. ;)

>>> C'est sûrement pas une macro d'un grand art que j'ai fais, mais elle fonctionne comme je veux
Quand tu nous soumettras un autre problème, quand tu proposeras un autre bout de code, compte sur moi :
■ pour tout critiquer (objectivement), :o
■ pour ne pas te donner la soluce, :non:
■ pour t'aider à trouver une soluce qui sera tienne, fruit de ta propre réflexion :sol: (en tout cas, j'essayerais...)

>>> Je te remercie pour l'aide apporté
La meilleure façon de remercier de l'aide obtenue sur un forum, c'est d'y participer. Toi aussi, aide les autres. :o
Même si un ptit merci direct est toujours très apprécié :merci:
 

niacniac

Nouveau membre
Pour l'aide apporté au forum. Je pense que se sera plutôt à partir de juillet.

J'ai une semaine de formation sur VBA. fin juin.

Pour le moment, je ne connais que la base des fonction de base... Mais il est vrai que fouiner sur le forum permet d'acquérir quelques connaissances..
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 131
Messages
6 717 958
Membres
1 586 383
Dernier membre
potofeu
Partager cette page
Haut