Re : aide sur code vba (recherche onglet)
Bonjour
je ne comprend pas pourquoi je peut rajouter des onglets sans problème , mais si je fait la moindre modif d un existant ça plante....
Reprends le code ci-dessous, j'ai intégré deux modifications
If flag = 0 Then MsgBox ("La feuille n'existe pas, Faire les modif nécessaires"): Application.EnableEvents = True: Exit Sub
Dans le programme, il y a deux boucles
La première (For each cel in plage) lit les noms de feuilles dans la plage B6:B100 de la feuille Base
Pour chaque feuille identifiée de cette plage, une deuxième boucle (For Each sh In ActiveWorkbook.Sheets)
Celle-ci lit les onglets du fichier et les compare à chaque nom lu dans la plage B6:B100.
Flag est un pointeur(une variable) : il prend la valeur 0 à chaque lecture d'un nom de feuille dans la plage B6:B100 (au début de la première boucle)
Si, dans la deuxième boucle, je trouve un onglet du même nom, je donne la valeur 1 à flag et je sors de la boucle puisque j'ai trouvé la feuille
A la sortie de la boucle, je teste la valeur de flag : si elle est restée à 0 c'est que je n'ai pas trouvé l'onglet correspondant et je sors avec le message
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$D$3" Then Exit Sub
Application.EnableEvents = False
tx = [D3]
lig = 8
[C8:H200].ClearContents
'Stop
Set plage = Sheets("base").Range("B6:B100")
For Each cel In plage
flag = 0
k = cel.Value
If k = "" Then Application.EnableEvents = True: Exit Sub
'Stop
For Each sh In ActiveWorkbook.Sheets
If sh.Name = k Then a = sh.Name: flag = 1: Exit For
Next sh
If flag = 0 Then MsgBox ("La feuille " & k & " n'existe pas, Faire les modif nécessaires"): Application.EnableEvents = True: Exit Sub
With Sheets(k).[A3:A27]
Set c = .Find(tx, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
Cells(lig, 3) = Sheets(k).Name
Cells(lig, 4) = Sheets(k).Cells(c.Row, 2)
Cells(lig, 5) = Sheets(k).Cells(c.Row, 3)
lig = lig + 1
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
'End If
Next
Application.EnableEvents = True
End Sub
Attention à l'instruction : Application.EnableEvents = False
En cas de plantage avant la fin du programme qui remet la valeur à True , la procédure événementielle ne fonctionne plus
Il faut la réactiver avec un petit programme du style :
Sub evenmt()
Application.EnableEvents = True
End Sub