Exécuter une macro de lignes en lignes même si ligne vide
Résolu/Fermé
Maksime568
Messages postés
144
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
28 novembre 2022
-
17 avril 2015 à 10:34
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022 - 21 avril 2015 à 13:39
Maksime568 Messages postés 144 Date d'inscription mardi 15 avril 2014 Statut Membre Dernière intervention 28 novembre 2022 - 21 avril 2015 à 13:39
A voir également:
- Exécuter une macro de lignes en lignes même si ligne vide
- Partage de photos en ligne - Guide
- Site de vente en ligne particulier - Guide
- Aller à la ligne excel - Guide
- Excel trier par ordre alphabétique en gardant les lignes - Guide
- Apparaitre hors ligne instagram - Guide
4 réponses
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 avril 2015 à 16:04
17 avril 2015 à 16:04
Re,
Une des solutions consiste donc à régénérer systématiquement les formules des colonnes P, S, T, U et X chaque fois qu'une donnée est saisie.
Ajoutes ce code dans le module de la feuille :
Une des solutions consiste donc à régénérer systématiquement les formules des colonnes P, S, T, U et X chaque fois qu'une donnée est saisie.
Ajoutes ce code dans le module de la feuille :
Private Sub Worksheet_Change(ByVal Target As Range) Dim p As Long, d As Long, c As Range p = 7 d = Cells(p, "E").End(xlDown).Row If Target.Row < p Or Target.Row > d Then Exit Sub 'régénerer les formules Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False For Each c In Intersect(Columns("P"), Target.EntireRow) c.FormulaR1C1Local = "=SI(OU(LC(1)<>"""";LC(2)<>"""");SI(OU(LC(1)=""HS"";LC(2)=""HS"");""NOK"";""OK"");"""")" Next c For Each c In Intersect(Columns("S"), Target.EntireRow) c.FormulaR1C1Local = "=SI(LC(-3)<>"""";SI(OU(ET(LC(-2)>0;LC(-2)<3;LC(-1)="""");(ET(LC(-2)>0;LC(-2)<10;LC(-1)>0;LC(-1)<3)));""OK"";""NOK"");"""")" Next c For Each c In Intersect(Columns("T"), Target.EntireRow) c.FormulaR1C1Local = "=SI(ET(LC(-11)="""";LC(-10)="""";LC(-9)="""";LC(-1)=""OK"");""OK"";SI(ET(LC(-11)="""";LC(-10)="""";LC(-9)="""";LC(-1)="""");"""";""NOK""))" Next c For Each c In Intersect(Columns("U"), Target.EntireRow) c.FormulaR1C1Local = "=SI(ET(LC(-14)=""cyclage thermique"");SI(ET(LC(1)<>"""");SI(ET(LC(2)<>"""");SI(ET(LC(1)>0;LC(1)<10);SI(ET(LC(2)>0,01;LC(2)<5);""OK"";""NOK"");""NOK"");"""");""EN TEST"");"""")" Next c For Each c In Intersect(Columns("X"), Target.EntireRow) c.FormulaR1C1Local = "=SI(LC(-3)=""EN TEST"";"""";SI(ET(LC(-3)<>"""");SI(ET(LC(-3)=""OK"");SI(ET(LC(-2)>0;LC(-2)<=10);SI(ET(LC(-1)>0;LC(-1)<=5);SI(LC(-1)="""";""NOK"";""OK"");""NOK"");""NOK"");""NOK"");""""))" Next c Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
21 avril 2015 à 13:25
21 avril 2015 à 13:25
bonjour,
pour faire un retour à la ligne dans le code, à l'intérieur d'une chaine de caractères, il faut découper la chaine en morceaux et concaténer les morceaux, puis mettre les retours à l'extérieur des morceaux de chaine
Par exemple la ligne :
coupée en morceaux devient :
puis avec les retours à la ligne :
pour faire un retour à la ligne dans le code, à l'intérieur d'une chaine de caractères, il faut découper la chaine en morceaux et concaténer les morceaux, puis mettre les retours à l'extérieur des morceaux de chaine
Par exemple la ligne :
c.FormulaR1C1Local = "=SI(OU(LC(1)<>"""";LC(2)<>"""");SI(OU(LC(1)=""HS"";LC(2)=""HS"");""NOK"";""OK"");"""")"
coupée en morceaux devient :
c.FormulaR1C1Local = "=SI(OU(LC(1)<>"""";" & "LC(2)<>"""");" & "SI(OU(LC(1)=""HS"";" & "LC(2)=""HS"");""NOK"";""OK"");"""")"
puis avec les retours à la ligne :
c.FormulaR1C1Local = "=SI(OU(LC(1)<>"""";" & _ "LC(2)<>"""");" & _ "SI(OU(LC(1)=""HS"";" & _ "LC(2)=""HS"");""NOK"";""OK"");"""")"
Maksime568
Messages postés
144
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
28 novembre 2022
21 avril 2015 à 13:39
21 avril 2015 à 13:39
encore merci, c'est parfait.
J'ai rajouter ce dont j'avais besoin et tout est parfait.
merci, merci, merci!!!!
J'ai rajouter ce dont j'avais besoin et tout est parfait.
merci, merci, merci!!!!
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 avril 2015 à 11:51
17 avril 2015 à 11:51
Bonjour,
Je ne comprend pas la question, ce n'est ni clair, ni précis !
Dans ton fichier les macros existantes son liées aux formulaires AJOUTER et EMBALLAGE dont tu ne parles pas.
Mais elles n'ont aucun rapport avec les problèmes exposés !!!
Il semblerait que tes problèmes soient simplement liés aux formules de calcul Excel et n'ont rien à voir avec le VBA !
Je ne comprend pas la question, ce n'est ni clair, ni précis !
Dans ton fichier les macros existantes son liées aux formulaires AJOUTER et EMBALLAGE dont tu ne parles pas.
Mais elles n'ont aucun rapport avec les problèmes exposés !!!
Il semblerait que tes problèmes soient simplement liés aux formules de calcul Excel et n'ont rien à voir avec le VBA !
Maksime568
Messages postés
144
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
28 novembre 2022
17 avril 2015 à 12:31
17 avril 2015 à 12:31
Bonjour,
Les macros AJOUTER et EMBALLAGE n'ont pas de rapport avec mes problèmes effectivement.
Les macros à problèmes sont dans ThiwWorkbook
chacune de ces macros doit statuer sur le statut de chaque pièce lorsque je complète mon tableau, notamment dans les cellules Q et R.
Les 3 premières sont les plus utilisées (pour presque toutes les pièces), les deux dernières sont uniquement pour un prélèvement de 5% de pièces repérées par "cyclage thermique" dans la cellule G.
Les macros AJOUTER et EMBALLAGE n'ont pas de rapport avec mes problèmes effectivement.
Les macros à problèmes sont dans ThiwWorkbook
Option Explicit
Public Sub StatutFIOoknok()
Dim li1 As Long, li2 As Long, li As Long
li1 = 7
li2 = 20050
For li = li1 To li2
If Range("Q" & li).Value = "" Then
Range("P" & li).Value = ""
ElseIf Range("P" & li).Value = "HS" Then
Range("P" & li).Value = "NOK"
ElseIf IsNumeric(Range("P" & li).Value) Then
Range("P" & li).Value = "OK"
End If
Next li
End Sub
Public Sub StatutFinalDPoknok()
Dim li1 As Long, li2 As Long, li As Long
li1 = 7
li2 = 20050
For li = li1 To li2
If Range("P" & li).Value = "" Then
Range("S" & li).Value = ""
Else
If Range("Q" & li).Value > 0 And Range("Q" & li).Value < 3 And Range("R" & li).Value = "" Then
Range("S" & li).Value = "OK"
Else
If Range("Q" & li).Value > 0 And Range("Q" & li).Value < 10 And Range("R" & li).Value > 0 And Range("R" & li).Value < 3 Then
Range("S" & li).Value = "OK"
Else
Range("S" & li).Value = "NOK"
End If
End If
End If
Next li
End Sub
Public Sub StatutFinalRXetDPoknok()
Dim li1 As Long, li2 As Long, li As Long
li1 = 7
li2 = 20050
For li = li1 To li2
If Range("I" & li).Value & Range("J" & li).Value & Range("K" & li).Value = "" And Range("S" & li).Value = "OK" Then
Range("T" & li).Value = "OK"
ElseIf Range("I" & li).Value & Range("J" & li).Value & Range("K" & li).Value & Range("S" & li).Value = "" Then
Range("T" & li).Value = ""
Else: Range("T" & li).Value = "NOK"
End If
Next li
End Sub
Public Sub prestressapresCT()
Dim li1 As Long, li2 As Long, li As Long
li1 = 7
li2 = 20050
For li = li1 To li2
If Range("G" & li).Value <> "cyclage thermique" Then
Range("U" & li).Value = ""
ElseIf Range("V" & li).Value & Range("W" & li).Value = "" Then
Range("U" & li).Value = "EN TEST"
ElseIf Range("V" & li).Value > 0 And Range("V" & li).Value < 10 Then
Range("U" & li).Value = "OK"
Else: Range("U" & li).Value = "NOK"
End If
Next li
End Sub
Public Sub StatutDPapresCT()
Dim li1 As Long, li2 As Long, li As Long
li1 = 7
li2 = 20050
For li = li1 To li2
If Range("U" & li).Value = "EN TEST" Then
Range("X" & li).Value = ""
ElseIf Range("U" & li).Value = "" Then
Range("X" & li).Value = ""
ElseIf Range("V" & li).Value > 0 And Range("V" & li).Value < 3 And Range("W" & li).Value = "" Then
Range("X" & li).Value = "OK"
ElseIf Range("V" & li).Value > 0 And Range("W" & li).Value > 0 And Range("V" & li).Value < 10 And Range("W" & li).Value < 5 Then
Range("X" & li).Value = "OK"
Else: Range("X" & li).Value = "NOK"
End If
Next li
End Sub
chacune de ces macros doit statuer sur le statut de chaque pièce lorsque je complète mon tableau, notamment dans les cellules Q et R.
Les 3 premières sont les plus utilisées (pour presque toutes les pièces), les deux dernières sont uniquement pour un prélèvement de 5% de pièces repérées par "cyclage thermique" dans la cellule G.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
Modifié par Patrice33740 le 17/04/2015 à 14:15
Modifié par Patrice33740 le 17/04/2015 à 14:15
Re,
Désolé, je n'avais pas vu ces macro.
Comment ces macros sont-elles exécutée (il n'y a ni bouton ni évènement déclencheur) ?
Il y a déjà des formules et un résultat dans les cellules où ces macros agissent, quel est le but recherché, est-ce d'obtenir le même résultat que les formules ?
Si c'est le cas, le plus simple pour obtenir le même résultat est d'utiliser les mêmes conditions que dans les formules !
Mais alors, quel est l'intérêt des macros si les formules fonctionnent ?
Pour limiter le nombre de boucles tu peux utiliser :
Il faudrait aussi suspendre l'actualisation écran, les calculs et les évènements pour accélérer l'exécution
Cordialement
Patrice
Désolé, je n'avais pas vu ces macro.
Comment ces macros sont-elles exécutée (il n'y a ni bouton ni évènement déclencheur) ?
Il y a déjà des formules et un résultat dans les cellules où ces macros agissent, quel est le but recherché, est-ce d'obtenir le même résultat que les formules ?
Si c'est le cas, le plus simple pour obtenir le même résultat est d'utiliser les mêmes conditions que dans les formules !
Mais alors, quel est l'intérêt des macros si les formules fonctionnent ?
Pour limiter le nombre de boucles tu peux utiliser :
li2 = Cells(li7, "E").End(xlDown).Row
Il faudrait aussi suspendre l'actualisation écran, les calculs et les évènements pour accélérer l'exécution
Cordialement
Patrice
Maksime568
Messages postés
144
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
28 novembre 2022
17 avril 2015 à 14:50
17 avril 2015 à 14:50
Le but serait d'obtenir le même résultats que les formules.
Le problèmes est que je ne suis pas seul a travailler sur ce fichier.
Parfois des lignes sont rajoutées mais si personnes ne "tire" les formules à descendre ça pose des soucis. Car mon fichier final possède plusieurs onglet dans le même genre. Ça m'éviterait de devoir surveiller ce fichier trop souvent.
Le mieux serait d'avoir une détection du remplissage des cellules.
Le problèmes est que je ne suis pas seul a travailler sur ce fichier.
Parfois des lignes sont rajoutées mais si personnes ne "tire" les formules à descendre ça pose des soucis. Car mon fichier final possède plusieurs onglet dans le même genre. Ça m'éviterait de devoir surveiller ce fichier trop souvent.
Le mieux serait d'avoir une détection du remplissage des cellules.
17 avril 2015 à 16:10
20 avril 2015 à 14:27
alors là parfait.
Merci énormément c'est juste ce qu'il me fallait.
c'est Application.Calculation = xlCalculationAutomatic
qui permet de faire la détection automatiquement?
20 avril 2015 à 14:38
Non, c'est l'évènement Change qui lance automatiquement l'exécution de Worksheet_Change à chaque modification du contenu d'une cellule.
Application.Calculation = xlCalculationAutomatic rétablit les calculs qui avaient été arrêtés au début de la procédure par Application.Calculation = xlCalculationManual
Modifié par Maksime568 le 21/04/2015 à 13:10
Comment faire un retour à la ligne dans une formule? je n'arrive pas a utiliser ici le "_ " pour continuer une formule sur une autre ligne.