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
| Option Explicit
Dim vNew As Variant, vOld As Variant, sCell As String
Private Sub Worksheet_Change(ByVal target As Range)
If target.Column = ListObjects("Type_de_Piece").Range.Column _
Or target.Column = ListObjects("Sous_Traitance").Range.Column Then
'--- la cellule modifiée se trouve dans la 1ère colonne du tableau
sCell = target.Address
vNew = target.Value
Application.EnableEvents = False '=== no event
Application.Undo
vOld = Range(sCell).Value
Range(sCell).Value = vNew
Range(sCell).Offset(0, 1).Select
Application.EnableEvents = True '=== event
Debug.Print sCell, vOld, vNew
'---
GererOnglet "Type_de_Piece"
GererOnglet "Sous_Traitance"
Else
'--- la cellule modifiée ne se trouve pas dans la 1ère colonne du tableau
'--- ne rien faire, continuer
End If
End Sub
Private Sub GererOnglet(sTableau As String)
Dim rInts As Range, k As Long, sModele As String
Set rInts = Application.Intersect(ListObjects(sTableau).Range, Range(sCell))
If rInts Is Nothing Then
'--- la cellule n'est pas dans la ListObjects(sTableau)
Debug.Print "Hors tableau" & sTableau
Else
Debug.Print "Dans tableau" & sTableau
If vNew = "" Then
If MsgBox("Supprimer ce type de pièce", vbYesNo) = vbNo Then
Application.EnableEvents = False '=== no event
Application.Undo
Range(sCell).Value = vOld
Application.EnableEvents = True '=== event
Else
Application.DisplayAlerts = False
On Error Resume Next
Sheets(vOld).Delete '--- erreur si feuille déjà effacée
On Error GoTo 0
Application.DisplayAlerts = True
k = Range(sCell).Row - ListObjects(sTableau).HeaderRowRange.Row
Range(sCell).Select
Application.EnableEvents = False '=== no event
Range(sCell).ListObject.ListRows(k).Delete
Application.EnableEvents = True '=== event
End If
Else
On Error Resume Next '--- erreur si Sheets(vOld) n'existe pas
Sheets(vOld).Name = vNew '--- renomme l'onglet
If Err.Number = 9 Then
'--- feuille(vOld) n'existe pas, créer feuille(vNew)
On Error GoTo 0
If sTableau = "Type_de_Piece" Then sModele = "TypePiece"
If sTableau = "Sous_Traitance" Then sModele = "SousTraitance"
Sheets(sModele).Copy After:=Sheets("BOM")
Sheets(sModele & " (2)").Visible = True
Sheets(sModele & " (2)").Name = vNew
Sheets("Notice").Select
End If
On Error GoTo 0
End If
End If
End Sub
Private Sub Worksheet_Deactivate()
SupprimerLigneVide "Type_de_Piece"
SupprimerLigneVide "Sous_Traitance"
End Sub
Private Sub SupprimerLigneVide(sTableau As String)
'--- supprime l'éventuelle dernière ligne vide du tableau sTableau
'--- il est supposé qu'il n'y a que UNE ligne vide
Dim sAdr As String, kR As Long, k As Long
sAdr = ListObjects(sTableau).Range.Address
kR = InStrRev(ListObjects(sTableau).Range.Address, "$")
kR = Mid(sAdr, kR + 1)
Debug.Print "Worksheet_Deactivate", sAdr, kR
If Cells(kR, 3) = "" Then
k = kR - ListObjects(sTableau).HeaderRowRange.Row
Cells(kR, 3).ListObject.ListRows(k).Delete
End If
End Sub |
Partager