Function Gras(c As Range) As Boolean
Gras = c.Characters(1, 1).Font.Bold
End Function
Sub Importer()
Dim t#, F As Worksheet, d As Object, derlig1&, tablo, i&, x$, j&, derlig&
Dim P As Range, code, coderest(), flag As Boolean
t = Timer
Set F = Feuil1 'CodeName de la feuille de destination
Set d = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
'---liste sans doublon des concaténations de A à H---
If F.FilterMode Then F.ShowAllData 'si la feuille est filtrée
derlig1 = F.Cells(F.Rows.Count, 1).End(xlUp).Row
If derlig1 > 7 Then
tablo = F.Range("A8:H" & derlig1) 'matrice, plus rapide
For i = 1 To UBound(tablo)
x = ""
For j = 1 To 8 'A à H
x = x & "#" & tablo(i, j)
Next j
If x <> "" Then d(x) = i 'repérage de la ligne
Next i
End If
F.Range("A8:K" & F.Rows.Count).Delete xlUp 'RAZ
'---copie du tableau source---
With Workbooks.Open(ThisWorkbook.Path & "\MATOS.xlsx").Sheets(1) 'feuille source
If .FilterMode Then .ShowAllData 'si la feuille est filtrée
derlig = .Cells(.Rows.Count, 1).End(xlUp).Row
If derlig > 7 Then .Range("A8:K" & derlig).Copy F.[A8]
.Parent.Close False
If derlig < 8 Then derlig = 7: GoTo 1
End With
'---suppression des lignes en gras---
F.[L:L].Insert 'insertion d'une colonne auxiliaire devant la colonne L
With F.Range("L8:L" & derlig)
.FormulaR1C1 = "=1/Gras(RC1)" 'utilise la fonction
.Value = .Value 'supprime les formules
F.Range("A8", .Cells).Sort .Cells, xlDescending, Header:=xlNo 'tri pour accélérer, les "1" sont en bas
derlig = derlig - Application.Count(.Cells)
On Error Resume Next 's'il n'y a pas de police "gras"
Intersect(.SpecialCells(xlCellTypeConstants, 1).EntireRow, F.[A:L]).Delete xlUp
End With
F.[L:L].Delete 'suppression de la colonne auxiliaire
'---repositionnement des codes colonne L---
If derlig1 > 7 And derlig > 7 Then
tablo = F.Range("A8:H" & derlig)
Set P = F.Range("L8:L" & derlig1)
code = P.Resize(, 2) 'au moins 2 éléments
ReDim coderest(1 To derlig, 1 To 2)
For i = 1 To UBound(tablo)
x = ""
For j = 1 To 8 'A à H
x = x & "#" & tablo(i, j)
Next j
If d.exists(x) Then
j = d(x)
coderest(i, 1) = code(j, 1)
If P(j).Interior.ColorIndex <> xlNone Then coderest(i, 2) = P(j).Interior.Color: flag = True
End If
Next i
F.Range("L8:L" & derlig) = coderest
'---restitution des couleurs colonne L---
If flag Then
P.Interior.ColorIndex = xlNone 'RAZ des couleurs
For i = 1 To UBound(tablo)
If coderest(i, 2) <> "" Then P(i).Interior.Color = coderest(i, 2)
Next i
End If
End If
'---finale---
F.Range("B8:L" & derlig).Borders.Weight = xlThin 'bordures
1 F.Rows(derlig + 1 & ":" & F.Rows.Count).Delete 'RAZ en dessous du tableau
With F.UsedRange: End With 'actualise la barre de défilement verticale
Application.ScreenUpdating = True
MsgBox "Durée " & Format(Timer - t, "0.00 \s"), , "Importation"
End Sub