Option Explicit
Sub Trouvertexte()
Dim Feuil1 As Object
Dim dc As String
Dim ch As String
Dim S As String
Dim s1 As String
Dim f As String
Dim l As String
Dim T As String
Dim i As Integer
Dim p As String
Dim vp As String
Dim objShell As Object
Dim objFolder As Object
Dim trouvé As Boolean
'Variables liées à la mise en forme
Dim x As Integer
Dim y As Integer
Dim u As String
Dim c As Variant
Dim monDico As Object
Dim temp As String
Dim MyRange As Object
Dim cell As Variant
Dim dl As Integer
Application.ScreenUpdating = False
Range("A2").Select
ActiveCell.FormulaR1C1 = "Début du test"
Range("B2").Select
ActiveCell.FormulaR1C1 = "Nom de l'opérateur"
Range("C2").Select
ActiveCell.FormulaR1C1 = "Numéro de série"
Range("D2").Select
ActiveCell.FormulaR1C1 = "Référence du produit"
Range("E2").Select
ActiveCell.FormulaR1C1 = "Référence du programme"
Range("F2").Select
ActiveCell.FormulaR1C1 = "Rigidité AC entre groupes"
Range("G2").Select
ActiveCell.FormulaR1C1 = "Fin du test"
Range("H2").Select
ActiveCell.FormulaR1C1 = "TEST"
Columns("A:M").EntireColumn.AutoFit
Rows("2:2").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
' Résultat feuille avec paramètres et résultats
Set Feuil1 = Worksheets("Feuil1")
' dc = dernière colonne utlisée dans Feuil1
dc = Feuil1.Range("ZA2").End(xlToLeft).Column
Set objShell = CreateObject("Shell.Application")
'Ouvre une fenêtre Window pour sélectionner le dossier
Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
'Si l'utilisateur annule sans choisir
If objFolder Is Nothing Then
'message
MsgBox "Abandon opérateur", vbCritical, "Annulation"
'sinon
Else
'Ch = répertoire choisi
ch = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
'Pour accéder directement au dossier sans passer par le menu
' ch = répertoire dans lequel chercher les fichiers
'ch = "C:\Users\JP\Desktop\Résultats txt\"
' on cherche le dernier "\" à sa gauche on aura le chemin d'accès (répertoire)
' à sa droite le nom du fichier
S = InStr(ch, "\")
While S <> 0
s1 = InStr(S + 1, ch, "\")
' on a trouvé le dernier "\"
If s1 = 0 Then
' on sauve le répertoire
ch = Left(ch, S)
End If
S = s1
Wend
' f contient le nom du premier fichier correspondant au filtre
f = Dir(ch)
' l pointeur de ligne en cours sur Résultat
l = 2
'tant qu'il y a un fichier
While f <> ""
trouvé = False
' on ouvre le fichier
Open ch & f For Input As #1
' on écrit le nom du fichier en cours sur Résultat
'Résultat.Cells(l, 1) = f
' on charge le contenu du fichier dans t
While Not EOF(1)
Line Input #1, T
' on parcourt tous les paramètres
For i = 1 To dc
' p est le paramètre en cours
p = Feuil1.Cells(2, i)
' on cherche p dans t
S = InStr(UCase(T), UCase(p))
' on a trouvé p dans t
If S <> 0 Then
If trouvé = False Then trouvé = True: l = l + 1
vp = Mid(T, S + Len(p))
' cas spécial du numéro de série
'15 est le nombre de lettres et espace
If Left(p, 15) = "Numéro de série" Then
s1 = InStr(vp, ",")
If s1 <> 0 Then
vp = Replace(vp, Left(vp, s1), "")
End If
End If
' cas spécial du diélectrique
'100 est le nombre de lettres et espace
If Left(p, 100) = "Rigidité AC entre groupes" Then
s1 = InStr(vp, " - ")
If s1 <> 0 Then
vp = Replace(vp, Left(vp, s1), "")
End If
End If
' on met vp dans Résultat après l'avoir "nettoyé"
Feuil1.Cells(l, i) = Application.WorksheetFunction.Clean(Trim(Replace(Replace(vp, "=", ""), ":", "")))
vp = ""
Exit For
End If
Next i
Wend
Close 1
' on prend le fichier suivant qui correspond au filtre
f = Dir()
Wend
Set Feuil1 = Nothing
End If
'Déplacement colonne Référence du produit en A
Columns("D:D").Select
Selection.Cut
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
'Déplacement colonne Début du test en G
Columns("B:B").Select
Selection.Cut
Columns("G:G").Select
Selection.Insert Shift:=xlToRight
'Déplacement colonne TEST en B
Columns("H:H").Select
Selection.Cut
Columns("B:B").Select
Selection.Insert Shift:=xlToRight
'Déplacement colonne Numéro de série en B
Columns("D:D").Select
Selection.Cut
Columns("B:B").Select
Selection.Insert Shift:=xlToRight
'Déplacement colonne Rigidité AC entre groupes en D
Columns("F:F").Select
Selection.Cut
Columns("D:D").Select
Selection.Insert Shift:=xlToRight
'Efface le contenu de G2
Range("G2:H2").Select
Selection.ClearContents
'Insertion de d'une colonne avant E
Columns("E:E").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
'Application d'un filtre pour séparer "-" avec le résultat du diélectrique
Range("D2").Select
Selection.ClearContents
Columns("D:D").Select
Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
Columns("D:D").Select
Selection.Delete Shift:=xlToLeft
'Inscription "Diélectrique" en entête de la colonne D
Range("D2").Select
ActiveCell.FormulaR1C1 = "Diélectrique"
'Insertion de deux colonnes avant H
Columns("H:H").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
'Application d'un filtre pour séparer "-" avec "date" avec "heure"
'TESTER Range("G3:G" & [G65000].End(xlUp).Select)
Range("G3:G65000").Select
Application.CutCopyMode = False
Selection.TextToColumns Destination:=Range("G3"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(1, 4), Array(12, 2)), TrailingMinusNumbers:=True
'Suppression de la colonne contenent les "-"
Columns("G:G").Select
Selection.Delete Shift:=xlToLeft
'Inscription "Date du test" en entête de la colonne F
Range("G2").Select
ActiveCell.FormulaR1C1 = "Date du test"
'Reformatage des heures en hh:mm:ss en colonne H
For x = 3 To Range("H65536").End(xlUp).Row
u = Range("H" & x)
Range("H" & x) = Left(u, 2) & ":" & Mid(u, 3, 2) & ":" & Right(u, 2)
Next
'Inscription "Début du test" en entête de la colonne H
Range("H2").Select
ActiveCell.FormulaR1C1 = "Début du test"
'Format de cellule hh:mm:ss pour la colonne H
Columns("H:H").Select
Selection.NumberFormat = "h:mm:ss;@"
'Application d'un filtre pour séparer "-" avec "date" avec "heure"
'TESTER Range("I3:I" & [I65000].End(xlUp).Select)
Range("I3:I65000").Select
Selection.TextToColumns Destination:=Range("I3"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(1, 4), Array(12, 2)), TrailingMinusNumbers:=True
'Suppression de la colonne I et J
Columns("I:J").Select
Selection.Delete Shift:=xlToLeft
'Reformatage des heures en hh:mm:ss en colonne I
For y = 3 To Range("H65536").End(xlUp).Row
u = Range("I" & y)
Range("I" & y) = Left(u, 2) & ":" & Mid(u, 3, 2) & ":" & Right(u, 2)
Next
'Inscription "Fin du test" en entête de la colonne I
Range("I2").Select
ActiveCell.FormulaR1C1 = "Fin du test"
'Format de cellule hh:mm:ss pour la colonne I
Columns("I:I").Select
Selection.NumberFormat = "h:mm:ss;@"
'Inscrit en colonne J la différence entre fin du test et début du test
Intersect(ActiveSheet.UsedRange.EntireRow, [J:J]).FormulaR1C1 = "=RC[-1]-RC[-2]"
'Inscription "Durée du test" en entête de la colonne J
Range("J2").Select
ActiveCell.FormulaR1C1 = "Durée du test"
'Centrage de toutes les cellules
Columns("A:A").ColumnWidth = 18
Columns("B:B").ColumnWidth = 13
Columns("C:C").ColumnWidth = 16
Columns("D:D").ColumnWidth = 12
Columns("E:E").ColumnWidth = 10
Columns("F:F").ColumnWidth = 22
Columns("G:G").ColumnWidth = 12
Columns("H:H").ColumnWidth = 12
Columns("I:I").ColumnWidth = 12
Columns("J:J").ColumnWidth = 12
Columns("K:K").ColumnWidth = 12
Rows("2:2").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.RowHeight = 30
Columns("D:D").ColumnWidth = 12
Columns("A:M").HorizontalAlignment = xlCenter
'Fige les lignes 1 et 2
Range("A3").Select
ActiveWindow.FreezePanes = True
'Quadrillage du tableau
Columns("A:K").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
Range("K20").Select
'Tri ascendant de la colonne G avec H (Date / heure)
Sheets("Feuil1").[G3].Sort Key1:=Sheets("Feuil1").[G3], Order1:=xlAscending, _
key2:=Sheets("Feuil1").[H3], Order2:=xlAscending, Header:=xlGuess
'Tri ascendant de la colonne A avec B (Référence / N° série)
Sheets("Feuil1").[A3].Sort Key1:=Sheets("Feuil1").[A3], Order1:=xlAscending, _
key2:=Sheets("Feuil1").[B3], Order2:=xlAscending, Header:=xlGuess
'Calcule la différence entre le temps de début d'une ligne par rapport
'au temps de fin de la ligne précédente
Intersect(ActiveSheet.UsedRange.EntireRow, [K:K]).FormulaR1C1 = "=RC[-3]-R[-1]C[-2]"
'Copie la colonne K en L pour garder la valeur et effacer le calcul
Columns("K:K").Select
Selection.Copy
Columns("L:L").Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Détecte la première occurence des numéros (marquage x en colonne M
Intersect(ActiveSheet.UsedRange.EntireRow, [M:M]).FormulaR1C1 = _
"=IF(R[-1]C[-11]=RC[-11],"""",""x"")"
'Efface la cellule à gauche du marquage x
For Each c In [M3:M65000]
If c = "x" Then
c.Offset(0, -1).ClearContents
End If
Next c
'Efface les colonnes K et ensuite L
Columns("K:K").Select
Selection.Delete Shift:=xlToLeft
Columns("L:L").Select
Selection.Delete Shift:=xlToLeft
'Efface les cellules négatives de la colonne K
Range("K2").Select
Selection.ClearContents
dl = Range("K65536").End(xlUp).Row 'définit la variable x (dernière ligne remplie (colonne à adapter))
For x = dl To 1 Step -1 'boucle inversée sur toutes les lignes x
'si la cellule de la ligne x, colonne 9 ("I") est vide ou si la cellule de la ligne x
'colonne 14 ("N") est négative, supprime la ligne
If Cells(x, 11).Value < 0 Then Cells(x, 11).ClearContents
Next x 'prochaine ligne de la boucle
'Colore en orange les doublons d'une série sauf le dernier
'Colore en vert le dernier doublon de la série
Set monDico = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
i = Range("a" & Rows.Count).End(xlUp).Row
Do While i > 2
temp = Cells(i, "A") & Cells(i, "B")
If Not monDico.exists(temp) Then
monDico(temp) = ""
If temp = Cells(i - 1, "A") & Cells(i - 1, "B") Then
Rows(i).Resize(, Range("a" & i).CurrentRegion.Columns.Count). _
Interior.ColorIndex = 35 '35 = vert
End If
i = i - 1
Else
Rows(i).Resize(, Range("a" & i).CurrentRegion.Columns.Count). _
Interior.ColorIndex = 40 '40 = orange
i = i - 1
End If
Loop
'Colorie en bleu les lignes contenant "MAUVAIS" pour isoler les soucis diélectriques fantômes
For i = Range("a" & Rows.Count).End(xlUp).Row To 4 Step -1
If Range("a" & i).Offset(, 2) = "MAUVAIS" And Range("a" & i).Offset(, 3) = "MAUVAIS" Then
Range("a" & i).Resize(, Range("a" & i).CurrentRegion.Columns.Count). _
Interior.ColorIndex = 37 '37=bleu
End If
Next
'Efface le contenu des cellules non colorées de la colonne K
'Dim cell As Range
'Set MyRange = Range("K3: K65000") 'Intersect(ActiveSheet.UsedRange.EntireRow, [K:K])
'For Each cell In MyRange
'If cell.Interior.ColorIndex = xlNone Then
'cell.ClearContents
'cell.Interior.ColorIndex = xlNone
'Else
'End If
'Next
'Colore en rouge les temps > 5mn
'Format texte pour la colonne K
Columns("K:K").Select
Selection.NumberFormat = "@"
Range("K3:K65000").Select
For Each cell In Selection
'Si la valeur est supérieur à 5mn(au format texte) alors
If cell.Text > "0,00347222222222222" Then
'Colorie la couleur de la cellule en rouge
cell.Interior.ColorIndex = 3
End If
Next
'Retour au format heure de la colonne K
Columns("K:K").Select
Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"
'Inscription "Durée entre deux tests" en entête de la colonne K
Range("K2").Select
ActiveCell.FormulaR1C1 = "Durée entre deux tests"
'Ajout des boutons filtre de donnée dans les entêtes
Range("A2:K2").Select
Selection.AutoFilter
'Concacène les colonnes A et B pour lier le comptage des références et numéro de série
Range("T3").Select
Intersect(ActiveSheet.UsedRange.EntireRow, [T:T]).FormulaR1C1 = "=RC[-19]&RC[-18]"
'Place un x devant chaque occurence unique
Intersect(ActiveSheet.UsedRange.EntireRow, [U:U]).FormulaR1C1 = _
"=IF(R[-1]C[-1]=RC[-1],"""",""x"")"
'Copie les colonnes T et U pour les coller en texte pour supprimer les formules
Columns("T:U").Select
Selection.Copy
Columns("V:V").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("T:U").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
'Compte le nombre de x
Range("U2").ClearContents
Range("T2").Select
ActiveCell.FormulaR1C1 = "=COUNTIF(C[1],""x"")"
'Copie/colle le résultat du précédent calcul
Range("T2").Select
Selection.Copy
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Efface les colonnes T et U qui ont servies au calcul du nombre de tests
Columns("T:U").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
'Inscrit un x à côté des cellules rouges de la colonne K
'Dim cell As Range
Set MyRange = Range("K3: K65000") 'Intersect(ActiveSheet.UsedRange.EntireRow, [K:K])
For Each cell In MyRange
If cell.Interior.ColorIndex = 3 Then
cell.Offset(0, 1) = "x"
Else
End If
Next
'Compte le nombre de x
Range("M3").Select
ActiveCell.FormulaR1C1 = "=COUNTIF(C[-1],""x"")"
'Copie/colle le résultat du précédent calcul
Range("M3").Select
Selection.Copy
Range("C1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("L:N").Select
Selection.ClearContents
'Calcule le pourcentage de reprises "C1/A1"
Range("D1").Select
ActiveCell.FormulaR1C1 = "=RC[-1]/RC[-3]"
'Formatage cellule en pourcents
Range("D1").Select
Selection.NumberFormat = "0.00%"
'Compte le nombre de tests MAUVAIS
Range("L1").Select
ActiveCell.FormulaR1C1 = "=COUNTIF(C[-9],""MAUVAIS"")"
'Copie/colle le résultat du précédent calcul
Range("L1").Select
Selection.Copy
Range("B1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Efface la colonne L
Columns("L").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
'Ajout d'une ligne
Rows("1:1").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Mise en forme des deux premières lignes + centrage cellules
Rows("1:2").RowHeight = 30
Rows("1:2").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
'Inscription "Nombre de produits" en entête de la colonne A
Range("A1").Select
ActiveCell.FormulaR1C1 = "Nbre de produits"
'Inscription "Nombre de tests MAUVAIS" en entête de la colonne B
Range("B1").Select
ActiveCell.FormulaR1C1 = "Nbre de tests MAUVAIS"
'Inscription "Nombre de reprises" en entête de la colonne C
Range("C1").Select
ActiveCell.FormulaR1C1 = "Nbre de reprises"
'Inscription "Pourcentage reprises" en entête de la colonne D
Range("D1").Select
ActiveCell.FormulaR1C1 = "Pourcentage reprises"
'Inscription "Nbre total de tests" en entête de la colonne F
Range("F1").Select
ActiveCell.FormulaR1C1 = "Nbre total de tests"
'Calcul du nombre total de test
Range("F2").Select
ActiveCell.FormulaR1C1 = "=RC[-5]+RC[-4]+RC[-3]"
'Colore les cellules A1 à K1 en gris
Range("A1:K1").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.149998474074526
.PatternTintAndShade = 0
End With
'Colore le texte de C2 en rouge
Range("C2").Select
With Selection.Font
.color = -16776961
.TintAndShade = 0
End With
'Colore le texte de A2 en bleu
Range("A2").Select
With Selection.Font
.color = -65536
.TintAndShade = 0
End With
'Colore le texte de D2 en bleu
Range("D2").Select
With Selection.Font
.color = -65536
.TintAndShade = 0
End With
'Colore le texte de B2 en orange
Range("B2").Select
With Selection.Font
.ThemeColor = xlThemeColorAccent6
.TintAndShade = -0.249977111117893
End With
Application.ScreenUpdating = True
End Sub