1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim S As Variant
Dim FindRg As Range
Dim memoSU As Boolean
'Initialisation
'En cas d'erreur, on passe à la ligne suivante sans déclencher de message
On Error Resume Next
'On pointe les cellules présente dans la selection et dans la 1ère colonne du tableau
Set FindRg = Intersect(Target, Sh.ListObjects(1).ListColumns(1).Range)
'En cas d'erreur, on bascule directemnt à la fin
On Error GoTo fin
'On mémorise la position de screenupdating
memoSU = Application.ScreenUpdating
'On ne rafraichi plus l'écran
Application.ScreenUpdating = False
'On vérifie qu'il ne s'agit pas de la feuille base de données (à adapter pour cibler que les feuilles qui doivent faire l'objet d'un import d'image)
'On regarde aussi qu'il n'y a qu'une cellule modifiée et qu'elle se trouve dans la 1ère colonne de la feuille
If Sh.CodeName <> "F_Base" And (Not FindRg Is Nothing) And Target.Count = 1 Then
'-- suppression
'On boucle sur toute les images présentes
For Each S In Sh.Shapes
'If S.Type = 13 Or S.Type = 9 Then
'On regarde si l'adresse de la cellule qui contient cette image correspond à la cellule à droite de Target, si c'est le cas, on la supprime
If S.TopLeftCell.Address = Target.Offset(0, 1).Address Then
'On supprime l'image
S.Delete
'Si target est vide, on supprime la ligne
If Target.Value = "" Then
'On faire la correspondance en terme de ligne dans le tableau structuré
With Sh.ListObjects(1)
'Avant de supprimer la ligne, on s'assure qu'il ne s'agit pas de la dernière ligne vide du tableau!
'On prend le numero de ligne contenant target et on lui soustrait le numero de ligne où se trouve l'entête du tableau
'On pointe la ligne du tableau structuré correspondante
With .ListRows(Target.Row - .HeaderRowRange.Row)
'On vérifie qu'il ne s'agit pas de la dernière ligne du tableau
If .Index < Sh.ListObjects(1).ListRows.Count Then
'On supprime la ligne
.Delete
'On quite la boucle For (Target n'existe plus)
GoTo TargetKilled
End If
End With
End With
End If
End If
'End If
Next
'Si Target est vide, on ne remet pas d'image
If Target <> "" Then
'On recheche la correspondence dans le tableau Base de donnée
Set FindRg = F_Base.ListObjects("Tab_Base").ListColumns(1).Range.Find(Target, LookAt:=xlWhole)
'On place une copie de l'image Vide
F_Base.Shapes("Img_Vide").Copy
Target.Offset(0, 1).PasteSpecial
'On s'assure qu'une correspondence à été trouvée, sinon on laisse vide
If Not FindRg Is Nothing Then
'On place en formule, le lien vers la cellule dont on veut capturer l'apparence
Selection.Formula = FindRg.Offset(0, 2).Address(External:=True)
End If
'On laisse du temps à Windows/Excel de faire le boulot
DoEvents
'On rétablie la dimenssion de l'image
With Selection.ShapeRange
.ScaleHeight 1, msoTrue
.ScaleWidth 1, msoTrue
'On affine la mise en place
.Left = Target.Offset(0, 1).Left + 7
.Top = Target.Offset(0, 1).Top + 5
'On adapte la taille de la ligne
Target.RowHeight = .Height + 10
End With
End If
TargetKilled:
'On regarde si la dernière ligne du tableau à une cellule vide, sinon, on ajoute une ligne pour bénéficier de la liste déroulante la prochaine fois
With Sh.ListObjects(1)
'On s'assure qu'il existe du contenu dans le tableau
If .ListRows.Count > 0 Then
'On vérifie si la 1ère cellule de la dernière ligne contient du text
If .ListRows(.ListRows.Count).Range(1).Value <> "" Then
'On ajoute une ligne vide
.ListRows.Add
End If
Else
'On ajoute une ligne pour que le tableau est au moins une ligne vide
.ListRows.Add
End If
End With
End If
fin:
'On rétabli la rafraichissement d'écran*
Application.ScreenUpdating = memoSU
'On affiche l'erreur si présente
If Err.Number <> 0 Then
MsgBox "L'erreur suivante est apparue" & vbCrLf & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur"
Err.Clear
Resume
End If
End Sub |
Partager