Conversion en VBA

Résolu/Fermé
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022 - 20 mars 2015 à 15:25
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 - 24 mars 2015 à 18:28
Bonjour,

je souhaiterais intégrer en VBA cette formule:
=SI(OU(P7<>"";Q7<>"");SI(OU(P7="HS";Q7="HS");"NOK";"OK");"")
dans la case O7.

je début en VBA, ça me permettrais de comprendre la base de départ pour ensuite me lancer dans du plus compliquer.
il y a énormément de ligne dans mon tableau, et ça m'embête à chaque création de nouvelle ligne de devoir tirer la formule vers le bas(car j'en ai d'autre des formules et ce n'est pas toujours moi qui ajoute des lignes).
j'ai tenté une vulgaire macro de copier/coller de formule mais ayant plein de formules longues, plein de lignes et plein de feuilles au finales je m'en sortais avec un fichier excel de 50Mo.....
j'espère ainsi alléger mon fichier grâce à ça.

Merci


7 réponses

ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
Modifié par ccm81 le 20/03/2015 à 17:32
Bonjour à tous les deux

Et pour boucler sur plusieurs lignes

Dim li1 As Long, li2 As Long, li As Long
li1 = 4
li2 = 15
For li = li1 To li2
  If Range("P" & li).Value & Range("Q" & li).Value = "" Then
    Range("O" & li).Value = ""
  Else
    If Range("P" & li).Value = "HS" And Range("Q" & li).Value = "HS" Then
      Range("O" & li).Value = "NOK"
    Else
      Range("O" & li).Value = "OK"
    End If
  End If
Next li

Cdlmnt
1
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
23 mars 2015 à 07:57
Merci,
créer la base ça va je m'en sors.
Mais pour faire le bouclage après sur plusieurs lignes j'ai du mal. (j'ai le bouquin prog VBA pour les nuls mais j'ai pas fini de le lire et je suis pas encore au bouclage. ^^
si je comprend bien ici, li1=4 est ma première ligne et li2=15 est ma dernière ligne?
sur mon tableau j'ai plusieurs milliers de lignes.
Qu'est ce qui est le plus simple et le moins lourd:
- mettre li2 = une très grande valeur?
- faire une macro qui voit lorsque qu'il y a une nouvelle valeur en E me rajoute cette macro précédente?
mon fichier faisant déjà 5Mo j'aimerais ne pas trop l'alourdir si c'est possible.
0
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
23 mars 2015 à 11:10
1. si je comprend bien ici, li1=4 est ma première ligne et li2=15 est ma dernière ligne?
C'est çà
2. Qu'est ce qui est le plus simple et le moins lourd:
- mettre li2 = une très grande valeur?
- faire une macro qui voit lorsque qu'il y a une nouvelle valeur en E me rajoute cette macro précédente?

Ce que je crois comprendre
2.1. Tu as un gros fichier avec beaucoup de formules, tu veux l'alléger en remplaçant les formules par leur résultat via vba
La macro le fait, elle sera exécutée une seule fois et traitera l'ensemble des lignes depuis li1 jusqu'à li2
Tu peux ajouter histoire de réduire le temps d'exécution
- en début de procedure (avant For ...)
Application.ScreenUpdating = False
pour désactiver la mise à jour de l'écran
- en fin de procedure (avant End)
Application.ScreenUpdating = True
Pour mettre à jour l'écran
2.2. Pour la suite, tu vas ajouter des lignes et tu veux que lorsque la colonne E (ligne li2+1) est remplie, une autre macro te calcule les valeurs en ligne li2+1
C'est ça?
1
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
23 mars 2015 à 11:37
en 2.1: oui j'ai un gros fichier avec beaucoup de lignes contenant chacune beaucoup de formule (ci-joint un exemple de mes formules en O, R, S T et W)
http://www.cjoint.com/confirm.php?cjoint=0CxlOQaCBUI
2.2: oui. Mais ce n'est pas forcément moi qui rajoute des lignes, j'aimerais simplifier au maximum ces étapes. à l'heure actuelle je tire les formules vers le bas en prenant de l'avance et ça va. mais c'est rébarbatif, et quand je suis en retard pour le faire on me dit "ça marche pas".

quelques questions, tu sauras peut-être me répondre:
en vba, est-ce plus simple de faire en sorte que excel repère l'ajout de nouvelle lignes et ainsi lance les formules?
sachant que la personne va rajouter des lignes puis remplir un à un les valeurs dans P et Q par exemple. La formule devrait donc rester active le temps que la personne remplisse les cellules.
Si je comprend bien tu me propose plutôt de faire en sorte de d'abord remplir les cellules et ensuite demander à la macro de calculer?
Je pourrais éventuellement faire un bouton "Calcul" afin de lancer les formules ce serait faisable, dommage j'appréciais le faite d'avoir le résultat sitôt une valeur entrée.

Je souhaiterais prochainement automatiser l'ajout de nouvelles lignes.
Maintenant, la personne doit ajouter quelques champs et ensuite tirer ces champ vers le bas afin de les copier et d'en incrémenter certains.
Je pense qu'un bouton d'ajout avec quelques champs à remplir serait-plus simple mais ça me demanderas un peu de temps.
Peut-être que, avec ta vision de programmateur, tu saurais me dire si plus tard, le fait d'ajouter un bouton rajoutant des lignes serait à coupler avec ma demande actuelle et simplifierait l'ensemble?
Je ne sais pas si ma demande est claire?
0
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
23 mars 2015 à 11:55
0. Désolé, je ne peux pas lire ton fichier, peux tu l'envoyer au format excel 2003, sans la macro
2.1. oui j'ai un gros fichier avec beaucoup de lignes contenant chacune beaucoup de formule
oui quoi ? tu veux exécuter la macro ?
Si oui, fais le (sur une copie partielle dans un premier temps bien sûr) et vérifies que tout s'est bien passé
2.2. On peut très bien automatiser la maj d'une ligne dès qu'une cellule (d'une colonne à fixer) est remplie, c'est à la procédure
Worksheet_Change(ByVal Target As Range)
de réagir à l'évènement : changement de valeur dans E26 par exemple
On peut aussi lancer cette maj via un bouton, un double-clic sur une cellule, un raccourci clavier, etc ...
1
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
23 mars 2015 à 13:09
voila au bon format: http://www.cjoint.com/confirm.php?cjoint=0CxnsH7tWxy
en 2.1: je vais tenter de la lancer déjà voir si ça fonctionne bien. ;)

en point 2.2:
si j'ajoute une valeur en E21, je n'ajouterais des valeur en P21 et Q21 que plus tard, mais par contre je souhaiterais que ma macro ne se lance donc qu'après avoir entré des valeurs en P et Q.
0
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
23 mars 2015 à 13:13
la macro fonctionne parfaitement en lancement manuel. ;)
0
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
23 mars 2015 à 15:15
Désolé, tu n'as pas pris le bon format, il me le faut en .xls

je souhaiterais que ma macro ne se lance donc qu'après avoir entré des valeurs en P et Q.
Dons lorsque P et Q sont remplies toutes les deux ?
1
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
Modifié par Maksime568 le 23/03/2015 à 15:36
désolé, je vais finir par y arriver:
http://www.cjoint.com/data/0CxpOjUuRg3.htm

Oui, en gros quand P et Q sont remplis, mais parfois Q n'est pas rempli.
Mais en fait je viens de voir que ma formule pourrais être légèrement modifiée.
On pourrait mettre O = vide si P= vide
et O = HS si P = HS.
O = OK si P contient une valeur numérique.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
23 mars 2015 à 15:33
en attendant, voilà ce que ça peut donner
https://www.cjoint.com/?3CxpTyQwxRW
1
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
Modifié par Maksime568 le 23/03/2015 à 15:57
Ah merci.
J'ai retravaillé l'ensemble d'après ce que tu m'as fait:
Option Explicit

Public Sub MAJcO()
Dim li1 As Long, li2 As Long, li As Long
li1 = 4
li2 = 15
For li = li1 To li2
If Range("P" & li).Value & Range("Q" & li).Value = "" Then
Range("O" & li).Value = ""
Else
If Range("P" & li).Value = "HS" Then
Range("O" & li).Value = "NOK"
Else
If IsNumeric(Range("P" & li).Value) Then
Range("O" & li).Value = "OK"
End If
End If
End If
Next li
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim li As Long
If Not Intersect(Target, Columns("P:Q")) Is Nothing Then
Application.EnableEvents = False
li = Target.Row
If Range("P" & li) <> "" Then
If Range("P" & li).Value = "HS" Then
Range("O" & li).Value = "NOK"
If IsNumeric(Range("P" & li).Value) Then
Range("O" & li).Value = "OK"
Else
Range("O" & li).Value = ""
End If
End If
End If
Application.EnableEvents = True
End If
End Sub


voilà les modif.
par contre désolé mais je ne comprend pas le "worksheet_change..."
je l'ai modifié et je pense que ce n'était pas à faire.
Je pense que ma formule avec les conditions modifiées dans le post plus haut simplifie les choses.
C'est dingue. Des formules utilisées depuis longtemps parfois on se rend compte qu'elle sont bien simplifiable.
0
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
23 mars 2015 à 16:32
1. Tu peux simplifier un peu le code de la procédure MAJ.
RQ1. La colonne Q n'intervient plus, mais si ça te va, pas de pb

Public Sub MAJCol()
Dim li1 As Long, li2 As Long, li As Long
li1 = 4
li2 = 15
For li = li1 To li2
  If Range("P" & li).Value & Range("Q" & li).Value = "" Then
    Range("O" & li).Value = ""
  ElseIf Range("P" & li).Value = "HS" Then
     Range("O" & li).Value = "NOK"
  ElseIf IsNumeric(Range("P" & li).Value) Then
     Range("O" & li).Value = "OK"
  End If
Next li
End Sub

2. par contre désolé mais je ne comprend pas le "worksheet_change..." je l'ai modifié et je pense que ce n'était pas à faire.
Cette procédure agit uniquement sur la ligne qui vient d'être modifiée en colonnes P:Q ( li = Target.Row). Donc il faut bien la modifier
RQ2. Idem RQ1
1
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
Modifié par Maksime568 le 23/03/2015 à 17:18
mais elle sert à quoi cette procédure exactement?
j'arrive pas à comprendre comment elle tourne, notamment pour ce qui suit
If Not Intersect(Target, Columns("P:Q")) Is Nothing Then
  Application.EnableEvents = False
0
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
23 mars 2015 à 17:40
1. Cette procédure, comme son nom l'indique, réagit a tout changement dans la feuille. Toi tu ne veux faire quelque chose que si la changement se fait en colonne Q donc, si la cellule cible (target : celle qui a changée dans la feuille) est dans une des colonne P ou Q alors on fait
2. Tu peux supprimer les deux lignes
Application.EnableEvents = false  et true

3. Tu peux aussi te contenter de
If Not Intersect(Target, Columns("P")) Is Nothing Then 

si la colonne Q n'intervient plus
0
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
24 mars 2015 à 10:26
En fait là si je met uniquement la colonne P et que j'ajoute une valeur en P et bien rien ne se passe.
Sauf si je relance manuellement la macro.
Si je met tout le second bloque en commentaire la macro se déroule bien tout de même.
Est-ce normal que ces deux procédures soit dans deux sub différents?
0
ccm81 Messages postés 10862 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 30 mai 2024 2 408
24 mars 2015 à 14:22
En fait là si je met uniquement la colonne P et que j'ajoute une valeur en P et bien rien ne se passe. Sauf si je relance manuellement la macro.
De quelle macro parles tu ?
Ici la macro Wokssheet_Change déclenchée uniquement par un cahnement en colonne P
https://www.cjoint.com/?3CyoGI2RbKr
0
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022
24 mars 2015 à 15:36
http://www.cjoint.com/data/0CypU5HVB2V.htm
je ne comprend pas pourquoi cela ne fonctionne pas sur mon fichier.
il me semble pourtant que la copie est bonne mais si j'ajoute une valeur je n'ai pas automatiquement un lancement de la macro pour la ligne en question
0
eljojo_e Messages postés 1155 Date d'inscription lundi 10 mai 2010 Statut Membre Dernière intervention 14 octobre 2022 153
20 mars 2015 à 16:54
Bonjour,
La formule "traduite" en vba donne :

Sub calculs
if [P7] <> "" or [Q7] <>"" then
if [P7] = "HS" or [Q7] = "HS3 then
[O7] = "NOK"
else
[O7] = "OK"
end if
end if
end sub


Ca va calculer un fois. Tu devra relancer la macro pour refaire le calcul.
0