Macro sans bouton - VB/VBA/VBS - Programmation
Marsh Posté le 16-03-2006 à 18:22:22
Salut zaina,
zaina a écrit : Je voudrai faire une macro avec woorksheet_change qui à chaque fois qu'une valeur est saisie dans une cellule a elle calcule la cellule b et vise versa. |
Worksheet_change est effectivement le bon endroit pour celà.
Mais, ton code ici :
Code :
|
me fais penser à une simple multiplication. Pourquoi n'utilises-tu pas les formules directement dans ta feuille excel. exemple en G18: '=E18*L18'
Si vraiment tu veux utiliser une macro plutôt que des formule ok.
Tu peux toujours essayer d'ajouter un a après le next si c'est pas ça essaye de mieux définir ce que tu cherches à faire :
1- quelles plages de cellules ont une influence sur le resultat limiter le target evite de bonnes lenteurs
2- pourquoi un test de valeur vide sur la colonne 4
3- faut-il vraiment que tu recalcules toutes les lignes de 18 à 39 à chaque changement?
@+
Edit : tu trouvera ici un exemple de sub worksheet_change qui te montrear comment limiter les plages.
Marsh Posté le 16-03-2006 à 18:34:09
Merci pour ta reponse watashi.
je ne veux pas mettre de formule dans les cellules car les deux colonnes 5 et 7 sont liés. Si je met une formule elle sera ecrasé quand je saisierai un chiffre. Exemple si je met une valeur dans la colonne 5, la formule dans la colonne 7 me donnera les valeurs de la 7. Par contre si je met une valeur dans la colonne 7 celle ci ecrasera ma formule et ne me calculera pas la valeur de la colonne 5. delà, la macro reste mon seul recours.
J'ai mis un test de valeur vide sur la colonne 4 pour effectivement ne pas effectuer le calcul sur toutes les lignes de 18 à 39 mais juste sur celle ayant une de valeur.
Est ce que tu pense que ce que je veux faire est faisable.
Merci for help
Marsh Posté le 17-03-2006 à 09:52:37
Salut zaina,
ce que tu veux faire est totu a fait faisable quoi que surement un peu plus complexe qu tu ne le pensais au départ
tu trouveras ci dessous un code commenté qui te fais ce que j'ai compris de ton enonncé :
à savoir :
1- si tu saisis en colonne 5 alors en colonne 7 tu as colonne 5*colonne 12
2- si tu saisis en colonne 7 alors en colonne 5 tu as colonne 7 * colonne 12
Il faut noter 2 choses : a chaque fois que tu change 1 cellule dans ta feuille la sub worksheet_change tourne. donc si tu modifie la colonne 7 par macro ta sub tourne et tu risque d'avoir une boucle infinie de cacul. il y a donc à se méfier. Par ailleurs si tu change ta colonne 12 ton résultat change.
Code :
|
A toi de voir si tu arrives a formaliser grâce à celà ton problème exact.
@+
Marsh Posté le 24-03-2006 à 12:07:47
Salut Watashi
Merci pour ta réponse j'ai beaucoup avancé grace à toi. j'ai remodifié le code de tel sorte à ce que ca s'adapte à ma requete.
et ca donne ça:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim result As Long
If Target.Row >= 19 And Target.Row <= 39 Then
If Cells(Target.Row, 12).Value = 0 Then
End If
If Cells(Target.Row, 12).Value = "na" Then
End If
If Cells(Target.Row, 12).Value <> 0 Then
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
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 Target.Column = 12 Then
If Cells(Target.Row, 12).Value = Cells(Target.Row, 7).Value * Cells(Target.Row, 5).Value Then
End If
If Cells(Target.Row, 12).Value <> Cells(Target.Row, 5).Value * Cells(Target.Row, 7).Value Then
Cells(Target.Row, 5).Value = Cells(Target.Row, 7).Value * Cells(Target.Row, 12).Value
End If
End If
End If
End If
End Sub
la ce qui me gene c'est lorsque je tente de supprimer toute les valeur dans les cellules en question ( colonne 5 et 7) j'ai un message d'erreur car il n' y a plus de valeur dedans.
Est ce que tu aurais une petite idée pour eviter ce message d'erreur?
Pourquoi VBA n'arrive pas à reconnaitre le "na".
Meci d'avance
Zaina
Marsh Posté le 24-03-2006 à 12:17:55
Salut zaina,
Je vais regarder un peu plus tard ton code mais ouurais-tu éditer ton message avec les balise de code s'il te plait c'est vraiment dur à lire ainsi.
Petite question : le na dont tu parle c'est celui d'excel (renvoyé en cas d'erreur) ou c'est toi qui le saisi ?
Quel message d'erreur as-tu quand tu vide les cellules ?
@+
Marsh Posté le 24-03-2006 à 12:23:58
Excuse moi pour les balises de code recommencerai pas.
Pour le na c'est moi qui le met. c'est la valeur de la cellule ( x,12) si jamais la cellule ( x,4) = " Moyenne" ou " Equivalent".
le message d'erreur que je recois : " run time error 13 mistake ùmatch".
Merci d'avance
Marsh Posté le 24-03-2006 à 13:53:11
zaina a écrit : If Cells(Target.Row, 12).Value = 0 Then |
Salut zaina,
tes 2 tests ici ne sont pas pris en compte et je pense que c'est ce qui te fais bugger sur le 0 ou le "na".
essaye en enlevant les 2 end if pour les placer juste avant le end sub
@+
Marsh Posté le 24-03-2006 à 14:20:25
Voilà j'ai trouvé une solution pour mon probleme de "na". J'ai mit en place une colonne dédié au calcul et qui à chaque choix que la cellule (x,12) contient na moi j'ai 0.
et ca marche
C'est chouette
Reste le premier beug....
Merci muchos muchos
Marsh Posté le 24-03-2006 à 14:28:15
Re zaina
Je pense avoir une idée
Ton calcul en fait tu ne dois le faire que si cells(#,12) est différent de vide, 0 ou na ?
si oui essayes avec ce code :
Code :
|
@+
Marsh Posté le 24-03-2006 à 14:39:57
zaina a écrit : Voilà j'ai trouvé une solution pour mon probleme de "na". J'ai mit en place une colonne dédié au calcul et qui à chaque choix que la cellule (x,12) contient na moi j'ai 0. |
Je viens de relire e pensant à ton premier bug...
Code :
|
@+
Marsh Posté le 29-03-2006 à 17:28:28
J'ai trouvé la solution mais maintenant, ma macro ne sais pas reconnaitre le #N/A d'excel
Tu n'aurais pas une idée de génie?......
Marsh Posté le 29-03-2006 à 17:54:22
Gnarf, tu m'avais dis que c'était toi qui le mettait...
j'ai jamais eu à gérer avec le #N/A, prends une cellule ou tu as ce retour et demande la valeur que VBA te renvois, en fonction tu pourras ajouter un critère. Sinon quelqu'un d'autre pourra peut être t'aider en faisant un nouveau post
@+
Marsh Posté le 29-03-2006 à 18:03:28
Merci c'est gentil de repondre aussi vite.
En fait il y a deux na , le mien et celui d'excel. Au debut je pensais gerer juste le mien mais maintenant il va valoir les gerer les deux.
Ma macro qui marche la voici si ca peut aider d'autre personne.
Spoiler : [Private Sub Worksheet_Change(ByVal Target As Range) |
Dans tout les cas merci pour les reponse rapide. dès que je trouve une solution au na excel je vous tiendrai au courant.
NB: Je ne sais pas mettre le code en blanc
Zaina
Marsh Posté le 29-03-2006 à 18:37:07
Pour mettre un bloc de code en fixe, clique sur le bouton Fixe, et non "Spoiler"
Bref...
Pour en revenir à ton problème de #N/A : en fait, une cellule affiche #N/A lorsque la fonction qui est associée n'est pas réalisable. Ce #N/A n'est pas la valeur contenue dans la cellule, mais c'est Excel qui affiche ceci pour avertir l'utilisateur.
Ainsi, si tu essayes de rentrer la valeur de cette cellule dans une variable numérale ou de l'utiliser en tant que nombre, Excel te fera une erreur.
Une solution simple consiste à tester en tout premier lieu si la valeur de la cellule est de type numérique grâce à la fonction IsNumeric()
Exemple :
If IsNumeric(Cells(1, 1).Value) = True Then |
Dans ton cas, si la fonction IsNumeric() renvoie True, tu exécutes tes instructions de calcul. Sinon, tu sors de la macro, ou tu avertis l'utilisateur (à toi de voir).
Marsh Posté le 04-04-2006 à 16:26:35
Bonjour
j'ai un petit probleme avec ma macro. elle marche à laperfection le problème est que lorseque je supprime la place de la colone 5 à 7 et que je refait un return back pour reprendre ou j'etais avant, j'ai un message d'erreur qui s'affiche
" Run-time error 13
type mismatch"
Mon code est:
NB: en rouge l'emplacement de l'erreur
Private Sub Worksheet_Change(ByVal Target As Range) |
Est ce que quelqu'un aurai une petite idée?
Marsh Posté le 04-04-2006 à 17:01:02
Soit j'ai pb de vue, soit de navigateur, mais je vois pas le rouge.
Mais l'erreur 13 est celle dont je t'ai parlé sur ton autre post (sur le As); il s'agit d'une incompatibilité de type (type mismatch error en anglais).
Si tu me précises la ligne je devrais trouver le pb
Marsh Posté le 04-04-2006 à 17:06:27
Exacte j'ai oublié de mettre en rouge, désolé
l'erreur se situe au niveau entre les deux [b]
If Target.Column = 5 Then |
Merci
Marsh Posté le 04-04-2006 à 17:23:13
Quand tu obtiens ton erreur, un bouton te permet de passer en debogage.
Une ligne jaune s'affiche et tu peux voir le contenu d'une variable en la survolant avec le pointeur de souris (désolé si tu connais bien déjà).
Peux-tu nous dire la valeur de Target.value ?
Es-tu sûr qu'aucun espace n'existe dans cette cellule, car à ce moment VBA interpréterait la zone comme une chaîne.
Si c'est une valeur décimale, le séparateur décimal est-il le bon par rapport au paramétrage Excel/Windows ?
Marsh Posté le 04-04-2006 à 17:40:37
En fait la valeur de la cellule est celle de la cellule (5,19) dans ce cas 30.
J'ai verifier les decimals pas de prob pas d'espace et j'utilise la "," pour separer...
Est ce qu'il y a possibilité de te montrer un fichier exemple pour que tu puisse voir la manoeuvre?
Merci
Marsh Posté le 04-04-2006 à 18:17:38
En plus je ne compren pas quand je supprime toute la plage et que je click sur retour en arrière ça marche mais quand je fait juste la plage j'ai un bug?!!!!!! incroyable
Marsh Posté le 04-04-2006 à 19:47:26
Je pense que le problème vient du fait que tu sélectionnes plusieurs cellules et que tu essayes de comparer la valeur de cette sélection avec ton résultat.
Hors, une sélection de plusieurs cellules ne donne pas de résultat numérique.
Il faudrait que tu affines ta sélection (donc ne traiter qu'une seule cellule).
Je suis dans le juste ?
Marsh Posté le 05-04-2006 à 10:27:26
Tout à fait juju tu es plus que dans le juste.
Comment alors lui demander de traiter toute la plage et non seulement une seule cellule? Est ce que celà veut dire que je devrai lui creer une macro qui calcule la selection directement.( Sachant que cette meme place est traité celulle par cellule sur l'autre macro)?
Gracias
Marsh Posté le 05-04-2006 à 19:01:15
Je ne sais pas trop : essaye de faire des boucles pour traiter toutes les cellules contenues dans la sélection. Ou bien tu peux traiter seulement une ou deux cellules, comme tu le fais pour toutes les autres conditions.
À toi de voir
Marsh Posté le 02-12-2006 à 23:21:43
Salut, une solution propre consisterait à faire comme ca
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
[code]
EndIf
EndSub
lorsque tu effaceras une cellule la procédure sera court circuitée
Dsl pour le retard, j'espère que ça aideras quelqu'un ..
Marsh Posté le 03-12-2006 à 12:20:42
trakto a écrit : |
là ce n'est plus du retard, c'est du déterrement de post
Marsh Posté le 16-03-2006 à 17:28:50
Bonjour,
Je débute en excel et je suis sur un projet un peu compliqué. Je voudrai faire une macro avec woorksheet_change qui à chaque fois qu'une valeur est saisie dans une cellule a elle calcule la cellule b et vise versa.
Pour celà, j'ai mis en place ce code:
Private Sub worksheet_change(ByVal target As Range)
Dim a As Integer
For a = 18 To 39
If ActiveSheet.Cells(a, 4).Value <> "" Then
If ActiveSheet.Cells(a, 5).Value <> "" Then
ActiveSheet.Cells(a, 7).Value = ActiveSheet.Cells(a, 5).Value * ActiveSheet.Cells(a, 12).Value
End If
End If
Next
End Sub
Mon problème c'est que ma macro elle marche pour une ligne mais pas pour les autre 21 lignes?
Quelqu'un pourrait il m'aider svp