Empêcher l'activation d'une macro
Bonjour à tous,
Je suis en train de bloquer depuis plusieurs jours sur une problématique qui trouvera surement réponse en quelques minutes chez vous.
Voilà je suis en train de créer un gestionnaire de planning pour des formations.
Elles sont toutes recensées dans une feuille de mon projet exemple ci-dessous :
Jusqu'à là pas de soucis, mais c'est pour contextualiser
Sur une seconde feuille, j'ai un planning sous forme calendaire qui ressemble à tout planning sous forme calendaire. Ci-dessous un aperçu :
Encore un peu de de contexte, quand je sélectionne une formation dans ma combobox, j'ai un macro qui va chercher dans ma première feuille le planning, et qui le retranscrit sous cette forme (jusqu'ici tout va toujours pour le mieux).
Voici ma problématique, j'aimerai pouvoir changer mon planning a partir de ma deuxième image et que cela modifie également dans mon planning sur ma première image. Cependant, worksheet_change est compliqué à gérer pour moi puisque lors que je sélectionne une formation dans ma combobox, de nombre case sont changer.
Donc est-il possible de faire en sorte que worksheet_change ne se déclenche pas lorsque je sélectionne une formation ?
Voici un peu de code pour vous montrez comment je rempli mon calendrier (peut-être que tout vient de cette macro qui peut-être plus efficace )
Private Sub ComboBox_sessions_Change()
Dim preligne As Long, derligne As Long, numcol As Long, feuille As String
Dim dbsession(), ldb As Long
Dim mois As Long, jour As Long, nb_jours As Long, colmois As Long
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'SUPPRIMER LES ANCIENNES DONNEES
For i = 1 To Cells(2, Columns.Count).End(xlToLeft).Column Step 3
Range(ThisWorkbook.Col_Letter(i + 1) & "4:" & ThisWorkbook.Col_Letter(i + 2) & "34").ClearContents
Next
Range("C3, F3, I3, L3,O3, R3,U3,X3,AA3,AD3,AG3,AJ3") = "FORMATEURS"
ldb = 0
'REMPLISSAGE DE DONNEES
If ComboBox_sessions.ListIndex > 0 Then
TextBox_Formateur.Value = ""
'Recherche de ma session dans les différentes feuilles
For i = 2 To Sheets("Sessions Continues").Cells(1, Columns.Count).End(xlToLeft).Column Step 5
If ComboBox_sessions.Value = Sheets("Sessions Continues").Cells(1, i).Value Then
numcol = i
feuille = "Sessions Continues"
GoTo SESSIONTROUVEE
End If
Next
For i = 2 To Sheets("Sessions Alternantes").Cells(1, Columns.Count).End(xlToLeft).Column Step 5
If ComboBox_sessions.Value = Sheets("Sessions Alternantes").Cells(1, i).Value Then
numcol = i
feuille = "Sessions Alternantes"
GoTo SESSIONTROUVEE
End If
Next
SESSIONTROUVEE:
preligne = Sheets(feuille).Cells(3, numcol).End(xlDown).Row
derligne = Sheets(feuille).Cells(Rows.Count, numcol).End(xlUp).Row
'création de ma base de données à parcourir
For i = preligne To derligne
If Sheets(feuille).Cells(i, numcol).Value <> "" Then
If Year(Sheets(feuille).Cells(i, 1)) = Label_choixdate.Caption Then
ReDim Preserve dbsession(2, ldb)
dbsession(0, ldb) = Sheets(feuille).Cells(i, 1) 'date
dbsession(1, ldb) = Sheets(feuille).Cells(i, numcol) 'module
dbsession(2, ldb) = Sheets(feuille).Cells(i, numcol + 1) 'formateur
If i <= derligne Then ldb = ldb + 1
End If
End If
Next
'parcours de mon calendrier, si j'ai une date qui correspond dans dbsession alors je remplis mon calendrier
For mois = 1 To 12
nb_jours = Day(DateSerial(annee, mois + 1, 1) - 1)
colmois = mois * 3 - 2
For jour = 1 To nb_jours
For i = 0 To ldb - 1
If Cells(jour + 3, colmois) = dbsession(0, i) Then
Cells(jour + 3, colmois + 1).Value = dbsession(1, i)
Cells(jour + 3, colmois + 2).Value = dbsession(2, i)
End If
Next
Next
Next
End If
Range("A:AJ").Columns.AutoFit
ReDim dbsession(0, 0)
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End SubMerci de m'avoir lu jusqu'ici, et au plaisir de vous lire.
Quentin
Bonjour et
Sans le fichier, le premier truc qui me vient c'est :
Pourquoi vouloir déclencher la macro avec "worksheet_change" alors que tu as une liste deroulante Formation ("Private Sub ComboBoxFormation_Change()") qui peut te servir a la lancer ?
A+
Merci,
Je ne peux pas partager le fichier, pour des raisons de confidentialité du contenue, c'est pourquoi les screens sont uniquement sur des exemples.
Je ne comprends pas bien votre réponse, ma macro Private Sub ComboBoxFormation_Change() permet de charger ma formation dans mon calendrier.
Une fois charger j'aimerai pouvoir modifier mon calendrier et que lorsque je le modifie cela modifie la bonne cellule dans ma feuille qui recense toutes les formations.
Je ne vois pas comment Private Sub ComboBoxFormation_Change() pourrait me permettre de le faire. Puisqu'une fois ma formation sélectionnée, elle n'entre plus en jeu.
Je voulais faire un worksheet_change, justement pour vérifié, que sur une plage donné (ici les cellules de mon calendrier), s'il y a un changement alors je vais copie la cellule qui vient d'être modifier et cherche la bonne cellule dans ma feuille pour la modifier également.
désolé j'ai commencé VBA il y a deux semaines. Jusqu'à là je n'avais jamais touché. Il me manques peut-être quelques notions.
Il y a surement un truc qui m'échappe,
Une idéee comme ça, tu peux bloquer le déclenchement de Worsheet_change avec:
Application.EnableEvents = False
'Fonctionnement macro auto en pause
'changement sur cellule sans déclencher worksheet_change
Application.EnableEvents = True
'Fonctionnement macro auto okSinon faire un bouton a coté de ton planning qui enclenche la mise a jour du calendrier vers la feuille 1visible seulement si "Formation n'est pas vide" (pour éviter de supprimer les donnée de Feuille 1 si Clendrier est vide).
Merci pour votre réponse,
ça a l'air de fonctionner en utilisant votre solution.
For mois = 1 To 12
nb_jours = Day(DateSerial(annee, mois + 1, 1) - 1)
colmois = mois * 3 - 2
For jour = 1 To nb_jours
For i = 0 To ldb - 1
If Cells(jour + 3, colmois) = dbsession(0, i) Then
Application.EnableEvents = False
Cells(jour + 3, colmois + 1).Value = dbsession(1, i)
Cells(jour + 3, colmois + 2).Value = dbsession(2, i)
Application.EnableEvents = True
End If
Next
Next
NextJe l'utilise lorsque je modifie mon calendrier.