activation macro si changement dans un autre classeur

charette63

XLDnaute Occasionnel
Bonjour à toutes et tous,

je cherche à activer une macro quand les cellules paires d'un Range (C4:C69) de la feuille 1 nommée "horaire" d'un classeur B sont modifiées. Ces cellules sont modifiées par liaisons à partir d'une feuille d'un classeur A.

j'ai trouvé ce code:
Code:
If Not Intersect(Target, Range("C4:C69")) Is Nothing Then
   UserForm1.Show
End If
(je ne m'occupe pas encore des cellules paires)

Je l'ai essayé dans l'evenement Worksheet Change, il fonctionne uniquement lorsque le changement dans une des cellules est éffectuée "manuellement"

Je l'ai essayé dans l'evenement Worksheet_SelectionChange, ne fonctionne pas avec le changement dans le classeur A

Je l'ai essayé dans l'evenement Worksheet_Activate et Worksheet_Calculate, là, j'ai un problème de déclaration de "target".

pouvez-vous m'aider

cordialement
thierry
 

charette63

XLDnaute Occasionnel
bonjour,

J'ai bien essayé de goupiller un p'tit quelque chose avec ces codes, en effet, le nom de la feuille est une liaison avec une des cellules de la colonne C qui sont sujettes au changement émanant du classeur A
Donc en définitive, si le nom d'une feuille change il faut que j'active mon UserForm1 et j'aimerais que se soit automatique

Code:
Private Sub Worksheet_Activate()
Dim Feuille As Worksheet
  For Each Feuille In ThisWorkbook.Worksheets
    If Feuille.Name <> "horaire" Then
    If Feuille.Name <> Feuille.Range("R1") Then Feuille.Name = Feuille.Range("R1")
   End If
  Next
 
End Sub

Private Sub Worksheet_Calculate()
Dim Feuille As Worksheet
  For Each Feuille In ThisWorkbook.Worksheets
    If Feuille.Name <> "horaire" Then
    If Feuille.Name <> Feuille.Range("R1") Then Feuille.Name = Feuille.Range("R1")
   End If
  Next
End Sub

Encore une information, ces codes se trouvent dans le VBA de la feuille1 (horaire), cette feuille s'ouvre par défaut lors de l'ouverture du classeur, mais il est peut-être plus facile de lancer la macro "UserForm1.Show" par un évènement dans "thisworkbook"

un p'tit coup de pouce?

merci

cordialement

Thierry
 
C

Compte Supprimé 979

Guest
Re : activation macro si changement dans un autre classeur

Salut Charette63

Et pourquoi vouloir activer une macro dans un classeur B
alors que l'on fait la modification dans le classeur A !?

Je n'ai pas pas bien tout compris :eek:

A+
 

job75

XLDnaute Barbatruc
Re : activation macro si changement dans un autre classeur

Bonjour charette63, Bruno,

Le mieux est de mémoriser les valeurs des cellules "paires" dans un tableau.

1) Dans un Module standard :

Code:
Public tablo(32) 'mémorise, à placer en haut de la feuille

Sub Memorise() 'cellules paires de la plage C4:C69
Dim i
With ThisWorkbook.Sheets("horaire")
  For i = 5 To 69 Step 2
    tablo((i - 5) / 2) = .Cells(i, 3)
  Next
End With
End Sub
2) Dans la feuille "horaire" :

Code:
Private Sub Worksheet_Calculate()
Dim i
For i = 5 To 69 Step 2 'C5 à C69
  If Cells(i, 3) <> tablo((i - 5) / 2) _
    Then Memorise: GoTo 1
Next
Exit Sub
1 UserForm1.Show
End Sub

3) Dans ThisWorkbook :

Code:
Private Sub Workbook_Open()
Memorise
End Sub
J'ai supposé que les cellules "paires" étaient C5 C7 C9... C69.

Si pas ça revenez, je modifierai les macros.

Edit : j'avais mémorisé dans un nom défini, c'est inutile, une variable Public suffit.

A+
 
Dernière édition:

charette63

XLDnaute Occasionnel
voilà voilà,

gestion de personnel,

dans le classeurA-- feuille1 :récapitulatif du personnel: 1 ligne par employé (nom prénom,statut,...)
Feuill2--->feuilX : feuille "personnel" de l'employé (aucune écriture possible,tout par liaison)
:1 colonne par mois (heures, congé,..) émanant du classeur (liaison)

dans le classeurB-- feuille1 : horaire "général": ecriture possible que dans un range ( ligne pour les employés, colonne pour les jours)
feuille2--->feuilX : horaire "personnel" (suivant type horaire, calcul heures, prestations particulières,...)
aucune écriture possible, tout par (de et vers) liaison de la feuille1 et ClasseurA

Le userform que j'aimerais ouvrir automatiquement est un userform qui permet de réagencer le tableau horaire "général" uniquement quant à la gestion du personnel. Gestion du personnel qui est modifier uniquement sur la feuille1 du classeurA, d'où ma demande initiale

En fouillant dans les méandres des macros liées à mon classeurB, je vois que j'ai déjà une macro qui modifie le nom des onglets si changement de nom dans le classeurA donc possibilité (peut-etre) de liés l'ouverture du userform à cette macro (CF mon second post)

Les changements s’opèrent via liaison sur ma feuille1 du classeurB, et j'ai bien essayé d'activer la userform si changement dans ces cellules. Je n'y suis pas arrivé, les changements (par liaison) s’effectuent avant l'ouverture du classeurB et je n'ai pas trouvé l'évènement adéquat. Petite remarque, lorsque j'effectue des changements sur la feuille1 du classeurA, mon classeurB s'ouvre automatiquement mais n'est pas actif puisque je travaille sur le classeurA

j'espere avoir éclairé votre lanterne

merci

cordialement

EDIT:des messages se sont croisés..
 

charette63

XLDnaute Occasionnel
pour Job75

Code:
Re,

Je n'avais pas lu le post #2, ça n'a plus rien à voir avec le post #1

Code:
En fouillant dans les méandres des macros liées à mon classeurB, je vois que j'ai déjà une macro qui modifie le nom des onglets si changement de nom dans le classeurA donc possibilité (peut-etre) de liés l'ouverture du userform à cette macro (CF mon second post)

merci
 

charette63

XLDnaute Occasionnel
bonjour à toutes et tous

Mon cher Job75:

Code:
J'ai supposé que les cellules "paires" étaient C5 C7 C9... C69.

ben non, petit rappel: paires--->2,4,6,.....,68:rolleyes:

Mais pas de problème, j'ai su modifier ton (tes) code(s), et ça fonctionne à merveille.

avec tous mes remerciements

Thierry
 

charette63

XLDnaute Occasionnel
bonjour à toutes et tous

Je rencontre malgré tout quelques problèmes liés (il me semble) au moment d'activation de la macro

Si je comprend bien le fonctionnement des codes:
1-- à l'ouverture du classeur, la macro "memorise" est activée, et mémorise la valeur de cellules de la colonne C
2-- à l'évènement worksheet_calculate, la macro compare la mémorisation et l'état actuel de la colonne C et si changement il y a, active le user form


Les inconvénients rencontrés: l'ouverture de ma userform (avec l'activation du classeurB) s'est fait directement aprés un premier changement, ce qui m'empèche de faire un second changement éventuel. Et si je fais un second changement par la suite la macro ne s'éffectue pas. J'ai bien essayé de déclencher la macro "memorise" lors d'un autre évènement mais sans succés.

Une idée?

merci

Thierry
 

job75

XLDnaute Barbatruc
Re : activation macro si changement dans un autre classeur

Re,

En complément de mon post #10.

Si l'UserForm est mis à jour par une macro UserForm_Initialize, peut-être faut-il écrire :

Code:
1 Unload UserForm1
UserForm1.Show 0 'non modal
A+
 

charette63

XLDnaute Occasionnel
bon bon, on efface tout et on recommence,

j'ai replacer les codes comme tu me l'as dit dans ton premier post (j'ai suppléé au problème des chiffres pairs/impairs en inserant une ligne en Row4).
Apparemment, j'ai été un peu (juste un peu) présomptueux lorsque j'annonçais que j'avais réussi à modifié tes codes.

Voici maintenant ce qui se passe:

dès le changement dans le classeurA (pour rappel c'est de ce classeur que s'opèrent les modifications) le classeurB s'active et la userform apparaît. L'inconvénient est que je ne sais pas, dans la continuité, effectué un second changement. Il eut été preferable que la userform s'active lorsque J'active "manuellement" le classeurB.

Second problème, un simple clic dans n'importe quelle cellule de la feuille1 du classeurB active l'ouverture de la userform. Pour info, je l'ai testé dans l’événement "Worksheet_activate" ---> rien. Dans "Worksheet_change"-->bien que la cellule de la colonne ai changé, rien ne se passe, par contre si je modifie (donc forcément classeur actif) n'importe quelle cellule de la feuille, la userform apparait.

merci de t’intéresser à mon problème

Edit: reponse à ton post #11: non, pas de mise à jour de la userform par macro
 
Dernière édition:

charette63

XLDnaute Occasionnel
Désolé, je viens encore de remarquer un problème,

la userform qui s'active via les codes pour lesquels je demande de l'aide, permet la mise en page du tableau qui contient la colonne C. Donc, quand je lance la mise en page, les cellules se modifient et par conséquent activent cette macro qui me permet la mise en page du tableau qui par conséquent activent cette macro qui....................................

Il faudrait donc impérativement une macro en classeurA qui:

si changement dans le range (C5:C37) de la feuille1 (récapitulatif) du classeurA active le classeurB et ouvre la userform1

Encore désolé pour cette modification à la demande d'aide, je fais test sur test avec mes classeurs et je viens juste de remarquer le problème décrit plus haut

merci
 

charette63

XLDnaute Occasionnel
re tous le monde,

j'avance, j'avance, je suis arrivé à activer le classeurB suite aux modifications faites dans le classeurA

Est-il possible que excel "remarque" qu'un classeur a été activé par un code ou "manuellement"
Je m'explique, je sais qu'il est possible de lancer une macro (soit ma userform) à l'evenement workbook_open, mais voilà, si j'active "manuellement" , je n'ai pas besoin de cette userform. Y a-t-il une possibilité d'arranger ça?

merci
 

job75

XLDnaute Barbatruc
Re : activation macro si changement dans un autre classeur

Bonjour charette63, Bruno, le forum,

Il est plus logique comme le disait Bruno d'utiliser cette macro dans le classeur A :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [C5:C37]) Is Nothing Then Exit Sub
On Error Resume Next 'si le classeur B.xls n'est pas ouvert
With Workbooks("B.xls") 'nom à ajuster
  If Err Then MsgBox "Ouvrez le classeur B.xls": Exit Sub
  .Activate
  .Sheets("Feuil1").Activate 'nom à ajuster
  Application.Run "B.xls!Module1.USF"
End With
End Sub
Et dans le classeur B.xls cette macro dans Module1 :

Code:
Sub USF()
UserForm1.Show '0 'non modal
End Sub
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 333
Membres
103 188
dernier inscrit
evebar