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 10900 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 2 novembre 2024 - 24 mars 2015 à 18:28
ccm81 Messages postés 10900 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 2 novembre 2024 - 24 mars 2015 à 18:28
A voir également:
- Conversion en VBA
- Find vba - Astuces et Solutions
- Conversion mb en mo ✓ - Forum Matériel & Système
- Vba attendre 1 seconde ✓ - Forum VB / VBA
- Conversion monnaie - Télécharger - Banque & Budget
- Vba récupérer valeur cellule ✓ - Forum VB / VBA
7 réponses
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
Modifié par ccm81 le 20/03/2015 à 17:32
Modifié par ccm81 le 20/03/2015 à 17:32
Bonjour à tous les deux
Et pour boucler sur plusieurs lignes
Cdlmnt
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
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
23 mars 2015 à 11:10
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?
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?
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
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?
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?
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
23 mars 2015 à 11:55
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 ...
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 ...
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
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.
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.
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
23 mars 2015 à 13:13
la macro fonctionne parfaitement en lancement manuel. ;)
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
23 mars 2015 à 15:15
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 ?
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 ?
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
23 mars 2015 à 15:33
23 mars 2015 à 15:33
en attendant, voilà ce que ça peut donner
https://www.cjoint.com/?3CxpTyQwxRW
https://www.cjoint.com/?3CxpTyQwxRW
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
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
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.
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.
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
23 mars 2015 à 16:32
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
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
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
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
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
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
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
23 mars 2015 à 17:40
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
3. Tu peux aussi te contenter de
si la colonne Q n'intervient plus
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
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
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?
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?
ccm81
Messages postés
10900
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 novembre 2024
2 425
24 mars 2015 à 14:22
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
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
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
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
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
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
20 mars 2015 à 16:54
Bonjour,
La formule "traduite" en vba donne :
Ca va calculer un fois. Tu devra relancer la macro pour refaire le calcul.
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.
23 mars 2015 à 07:57
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.