Remplacer les formules par un code VBA
Bonjour à tous,
j'aimerai solliciter votre aide svp,
je souhaite transformé des formules en macro, pour que mon fichier soit rapide, car il est volumineux actuellement,
voici les formules que je souhaite transformer:
Colonne X =ANNEE(L2)
Colonne Y =SI(GAUCHE(P2;12)="Préventif N°";SI(DROITE(GAUCHE(P2;20);1)=" ";DROITE(GAUCHE(P2;19);1);DROITE(GAUCHE(P2;20);2));"")
Colonne Z =SI(Y2="";"-";SI(D2="T";SI(Y2="1";SI(FIN.MOIS(Q2;0)-FIN.MOIS(L2;0)>1;"NOK";"OK");SI(FIN.MOIS(Q2;0)-FIN.MOIS(L2;1)>1;"NOK";"OK"));"Retard"))
je vous remercie d'avance !!
Salut,
Sans fichier modèle, ni exemples divers, ce n'est pas évident de t'aider.
J'ai tenté de trouver une macro afin de calculer les résultats attendus en X2 et Y2. Pour l'instant il faut la déclencher à l'aide du bouton en place, mais on pourrait imaginer de la déclencher automatiquement à la suite d'un évènement quelconque.
Si je ne suis complètement à côté de la plaque, fournis-moi des exemples pour ces trois formules (sur la base de tes propres formules), sinon au moins pour la dernière formule que j'ai laissé de côté pour l'instant.
A te relire.
Salut Yvouille,
je te remercie pour ton retour,
voici mon fichier si ça peut t'aider et pour plus de précision
je te remercie d'avance,
Imad.
Salut Yvouille, Imad SIO
essayer ce code :
Sub test()
drlngX = 20 'nombres de les contenant les donnes sur colonne "X" exmple=20
For j = 2 To drlngX
Cells(j, "X") = Year(Cells(j, "L"))
Next
drlngY = 20 'nombres de les contenant les donnes sur colonne "Y" exmple=20
For m = 2 To drlngY
If Left(Cells(m, "P"), 12) = "Préventif N°" Then
If Right(Left(Cells(m, "P"), 20), 1) = " " Then
Cells(m, "Y") = Right(Left(Cells(m, "P"), 19), 1)
Else
Cells(m, "Y") = Right(Left(Cells(m, "P"), 20), 2)
End If
Else
Cells(m, "Y") = ""
End If
Next
'########################"""
For i = 2 To 20
If Cells(i, "Y") = "" Then
Cells(i, "Z") = "-"
Else
If Cells(i, "D") = "T" Then
If Cells(i, "Y") = "1" Then
'---------#################---------
If Application.EoMonth(Cells(i, "Q"), 0) - Application.EoMonth(Cells(i, "L"), 0) > 1 Then
Cells(i, "Z") = "NOK"
Else
Cells(i, "Z") = "OK"
End If
'---------#################---------
Else
'---------#################---------
If Application.EoMonth(Cells(i, "Q"), 0) - Application.EoMonth(Cells(i, "L"), 1) > 1 Then
Cells(i, "Z") = "NOK"
Else
Cells(i, "Z") = "OK"
End If
'---------#################---------
End If
Else
Cells(i, "Z") = "Retard"
End If
End If
Next
End Sub
Crdlmt.
Salut amir,
le code fonctionne très bien,
mais je souhaite l'appliquer sur 1000 lignes par exemple,
quand je remplace le 20 par 1000 ça bug
merci
Salut
dit moi sur quelle ligne bug et avec quel message !?
drlgn = Cells(Rows.Count, "A").End(xlUp).Row
for i=2 to drlgn
on utilise une instruction comme ceci pour déterminer la dernière ligne non vide sur une colonne , a la place de 20 tu peux mettre "drlgn"
mais n’oublie pas de changer la lettre de colonne consternée.
Salut AMIR,
il s'arrête à la ligne 452, alors que moi je le veux jusqu'à la dernière ligne non vide.
j'ai aussi une autre macro a modifier si tu peux le faire ça serai adorable de ta part,
Merci
Imad
mais normalement lorsque il y a une erreur ,une message va apparaitre et excel te colore une ligne jaune dans l’éditeur Vba
quel est le contenu de ce message et quel ligne de code !?
j'ai aussi une autre macro a modifier si tu peux le faire ça serai adorable de ta part
OK pas de problème
Amir,
c'est bon j'ai réglé le problème,
la macro que je souhaite modifier est la suivante:
Sub MAJ_travaux_termines()
Application.ScreenUpdating = False
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim x As Integer
Dim y As Integer
Dim z As Integer
Dim A As String
Dim b As String 'nom fichier préventif
Dim c As String 'chemin accès fichier préventif
A = ""
b = "MAINTENANCE PREVENTIVE PROGRAMMEE.xlsm"
'chemin de TG
'c = "B:\TRAVAIL\SUIVI\PREVENTIF\"
'chemin de ST
c = "\\Q01EUFS1\Group\Communs\Services Techniques\Travaux\SUIVI\PREVENTIF\"
j = 0
k = 2
y = 0
i = 2
x = 4
'z = Worksheets("TRVX FINIS").Range("AF1").Value
'Comptage du nombre de lignes dans "TRVX FINIS"
Do
If Worksheets("TRVX FINIS").Cells(i, 1).Value = "" Then
j = j + 1
Else
j = 0
End If
i = i + 1
Loop Until j = 5
z = i - 5
i = 2
j = 0
'effacer ancien préventif
Worksheets("preventif").Range("A2:R300").Clear
'ouverture classeur préventif
Workbooks.Open (c & b)
c = "TRAVAUX.xlsm"
Workbooks(c).Activate
Do
If Worksheets("TRVX EN COURS").Cells(i, 4).Value = "T" And _
Not Worksheets("TRVX EN COURS").Cells(i, 17).Value = "" Then
'vérifier si préventif
If Left(Worksheets("TRVX EN COURS").Cells(i, 16).Value, 9) = "Préventif" Then
A = Mid(Worksheets("TRVX EN COURS").Cells(i, 16).Value, 13, 3)
Do
If A = Workbooks(b).Worksheets("programme global").Cells(x, 1).Value Then
Worksheets("PREVENTIF").Cells(k, 1).Value = Worksheets("TRVX EN COURS").Cells(i, 1).Value
Worksheets("PREVENTIF").Cells(k, 2).Value = A
Worksheets("PREVENTIF").Cells(k, 3).Value = Worksheets("TRVX EN COURS").Cells(i, 6).Value
If IsDate(Workbooks(b).Worksheets("programme global").Cells(x, 8).Value) Then Worksheets("PREVENTIF").Cells(k, 4).Value = Workbooks(b).Worksheets("programme global").Cells(x, 8).Value
If IsDate(Worksheets("TRVX EN COURS").Cells(i, 17).Value) Then Worksheets("PREVENTIF").Cells(k, 5).Value = Worksheets("TRVX EN COURS").Cells(i, 17).Value
Worksheets("PREVENTIF").Cells(k, 6).Value = Worksheets("PREVENTIF").Cells(k, 5).Value - Worksheets("PREVENTIF").Cells(k, 4).Value
'Workbooks(b).Worksheets("programme global").Cells(x, 12).Value = ""
If IsDate(Worksheets("TRVX EN COURS").Cells(i, 17).Value) Then Workbooks(b).Worksheets("programme global").Cells(x, 16).Value = Worksheets("TRVX EN COURS").Cells(i, 17).Value
If IsDate(Worksheets("TRVX EN COURS").Cells(i, 17).Value) Then Workbooks(b).Worksheets("programme global").Cells(x, 8).Value = Workbooks(b).Worksheets("programme global").Cells(x, 17).Value
Workbooks(b).Worksheets("programme global").Cells(x, 30).Value = 1 + Workbooks(b).Worksheets("programme global").Cells(x, 30).Value
If IsDate(Worksheets("TRVX EN COURS").Cells(i, 17).Value) Then Worksheets("PREVENTIF").Cells(k, 7).Value = Workbooks(b).Worksheets("programme global").Cells(x, 8).Text
k = k + 1
y = 1
End If
x = x + 1
Loop Until y = 1 Or x = 1000
x = 4
y = 0
End If
'couper coller la ligne
Worksheets("TRVX EN COURS").Range(Cells(i, 1), Cells(i, 21)).Copy
Worksheets("TRVX FINIS").Select
Worksheets("TRVX FINIS").Cells(z, 1).Select
'ActiveSheet.Paste
Worksheets("TRVX EN COURS").Activate
'Worksheets("TRVX EN COURS").Range(Cells(i, 1), Cells(i, 20)).Delete Shift:=xlShiftUp
i = i + 1
z = z + 1
ElseIf Worksheets("TRVX EN COURS").Cells(i, 1).Value = "" Then
j = 1
Else
i = i + 1
End If
Loop Until j = 1 Or i = 1500
Workbooks(b).Close savechanges:=True
'tri des préventifs effectués
Worksheets("PREVENTIF").Activate
Range("A2:G300").Select
ActiveWorkbook.Worksheets("PREVENTIF").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("PREVENTIF").Sort.SortFields.Add Key:=Range( _
"F2:F300"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("PREVENTIF").Sort
.SetRange Range("A1:G300")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Worksheets("TRVX EN COURS").Activate
'Worksheets("TRVX FINIS").Range("AF1").Value = z
Workbooks(c).Save
Application.ScreenUpdating = True
End Sub
le fichier qui s'appelle "TRAVAUX" contient un onglet qui s'appelle "TRVX FINIS" , mais mon fichier est lourd,
donc je veux enlever l'onglet "TRVX FINIS" , et le mettre dans un classeur tout seul qui va s'appeler "TRVX FINIS",
mais quand j'exécute la macro, je ne veux pas que ce nouveau classeur "TRVX FINIS" s'ouvre.
Merci infiniment pour ton aide.
Imad.
tu utilises l’onglet "TRVX FINIS" pour importer les données ou pour exporter les données !
il y a plusieurs opérations sur l'onglet TRVX FINIS comme c'est indiqué sur la macro
moi je souhaite avoir cet onglet dans un classeur tout seul et garder les mêmes opérations
Salut
on commence
pour quoi tu utilise ce code :
'Comptage du nombre de lignes dans "TRVX FINIS"
Do
If Worksheets("TRVX FINIS").Cells(i, 1).Value = "" Then
j = j + 1
Else
j = 0
End If
i = i + 1
Loop Until j = 5
il que de operations sur longlet "TRVX FINIS"
Worksheets("TRVX FINIS").Cells(z, 1).Select
'ActiveSheet.Paste
'Worksheets("TRVX FINIS").Range("AF1").Value = z
Salut amir,
je t'explique bien,
en faite je veux que la macro fonctionne tel qu'elle est,
sauf que je veux mettre l'onglet "TRVX FINIS" sur un autre classeur,
donc il faut déclarer le nom et chemin de ce classeur qui contient l'onglet "TRVX FINIS"
Oui , mais pourquoi tu as désactivé les deux opérations :
il que de opérations sur l’onglet "TRVX FINIS"
Worksheets("TRVX FINIS").Cells(z, 1).Select
'ActiveSheet.Paste
'Worksheets("TRVX FINIS").Range("AF1").Value = z
salut amir,
J'aimerai remplacer mes formules par du code vba, voici mes formules en dessous, et je te remercie infiniment si tu peux me les faire
ps : TRVX FINIS est un onglet
imad.
formule 1 : =NB.SI.ENS('TRVX FINIS'!$J:$J;"am";'TRVX FINIS'!$X:$X;$AI$1;'TRVX FINIS'!$M:$M;"raff spéciale";'TRVX FINIS'!$AA:$AA;$AI$2)
formule 2 : =NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"at. esters";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"at. fluides";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"usine 1 ";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"usine 1&2";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"vapeur";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"pastillage";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"bureaux";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"chateau";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"entretien";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"force";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"laboratoire";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"vestiaires";'TRVX FINIS'!AA:AA;$AI$2)
formule 3: =NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"at. concrètes";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"cuverie";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"cuverie 2020 ";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"ecaillage";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"filtration fine";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"mag 1500";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"mg 1500";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"magasins";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"malaxage";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"raff. 2";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"savonerie";'TRVX FINIS'!AA:AA;$AI$2)+NB.SI.ENS('TRVX FINIS'!J:J;"am";'TRVX FINIS'!X:X;$AI$1;'TRVX FINIS'!M:M;"usine 2";'TRVX FINIS'!AA:AA;$AI$2)
Salut Imad
Soyez le bienvenu mais :
Ton dernier message sur ce poste doit être :
" Merci comme même j’ai pu le faire tout seul a bientôt :) " et pas un autre demande après quelque jours d’absences !
Pour ton demande tu peux attendre sur l’autre poste, d’après ce que j’ai vu sur ce poste et l autre, tu veux remplacer toutes les formules mêmes les simples.
Seulement, explique que tu veux remplacer le tous par du code VBA ; enfin c’est ce que tu veux !
Crdlms
Slt amir
En fait le j’ai cru que je t’ai déjà répondu
Mais sinon oui 1000 merci
Tu m’as beaucoup aidé
je souhaite aussi coder ces formules en VBA si tu peux m’aider