Conflit entre 2 macros

OOLIVE

XLDnaute Occasionnel
Bonjour à tous..

Je voulais savoir s'il existait une solution à mon problème.

J'ai deux private sub qui s'exécutent sur un fichier excel. La première va chercher des informations dans un autre onglet en fonction de la valeur d'une cellule (rechercheV),

et la deuxième fait également une rechercheV dans un autre classeur que l'utilisateur sélectionne lui-même (via un Getopenfilename).

Cependant, il se peut que la deuxième rechercheV ne donne pas de résultat.. Et j'aurais voulu à ce moment là, dans la macro 2, que les informations apportées par la première macro s'efface et n'apparaisse plus sur mon fichier... mais la macro1 s'exécute toujours et refait apparaître les valeurs.

QUESTION (on y vient :)): est-il possible de gérer ce conflit d'intérêt entre les deux private sub ?


Merci à tous.


Vu l'heure, je vous souhaite également bon appétit !
 

Misange

XLDnaute Barbatruc
Re : Conflit entre 2 macros

Bonjour

oui bien sur c'est possible mais sans voir la structure des macros telles que tu les as écrites (on n'a PAS besoin de toutes les données ni de tous les détails !) je vois mal comment on peut t'aider...
 

OOLIVE

XLDnaute Occasionnel
Re : Conflit entre 2 macros

Bonjour,

Ci-joint le code.
La partie est gras est celle concernée dans la macro1.


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim l As Integer
Dim J As Integer
Dim I As Integer
Dim K As Integer

If Target.Address = "$G$8" Then
UserForm1.Show
End If

For l = 20 To 25
Cells(l, 4).Clear
Cells(l, 7).Clear

Next

Sheets("REFERENCE").Activate
I = Range("A" & Rows.Count).End(xlUp).row
Sheets("MODELE_FACTURE").Activate
For J = 1 To I
If Cells(16, 3).Value = Sheets("REFERENCE").Cells(J, 1).Value Then
Cells(20 + K, 4).Value = Sheets("REFERENCE").Cells(J, 2)
Cells(20 + K, 6).Value = "=IF(ISNONTEXT(RC[-2]),"""",""jours, à un taux de journalier de "")"
Cells(20 + K, 7).Value = Sheets("REFERENCE").Cells(J, 3)
Cells(20 + K, 8).Value = "=IF(ISNONTEXT(RC[-4]),"""",""pour un montant total de "")"
Cells(20 + K, 9).Value = "=IF(ISNONTEXT(RC[-5]),"""",PRODUCT(RC[-4],RC[-2]))"
K = K + 1


End If


Next

End Sub


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Not Application.Intersect(Target, Range("E19:E25")) Is Nothing Then

' Sélection du classeur source à partir d'une fenêtre

cheminfichier = Application.GetOpenFilename("Fichiers Excels (*.xl*), *.xl*")

' Si on clique sur Annuler dans la fenêtre, on sort de la boucle

If cheminfichier = False Then
Exit Sub

End If
'Ouverture du classeur source
Workbooks.Open cheminfichier
nom = ActiveWorkbook.Name

'Sélection du nombre de jours passés par le consultant sur la mission
'ActiveCell.Select
Workbooks("Facturation.xlsm").Activate
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(R16C3,'[" & nom & "]Timesheet'!R5C2:R47C3,2,FALSE)"
ActiveCell.Select

Cancel = True

'Dans la deuxième, je n'ai toujours pas mis le code.. mais grossomodo, cela se résumerait à
'si cellule active = 0 alors.

'row(activecell;row).select
'selection.clearcontents

Workbooks(nom).Close False
End If


End Sub
 

Misange

XLDnaute Barbatruc
Re : Conflit entre 2 macros

Je ne comprends pas du tout ce que tu veux faire et encore moins la logique de ta macro.
Poser sa question clairement c'est en général la résoudre au moins à moitié :) Fais un effort.
PLutot que d'utiliser une macro pour mettre une formule dans une cellule il est en règle générale préférable de faire le calcul (la formule) dans la macro et de ne porter que le résultat.
ceci est vrai pour ce que j'ai préfacé par '***********
Dans ces 3 cellules, à quelle cellule, de quelle feuille fais tu référence ? Ce n'est pas clair. Plutot que d'écrire dans ces cellules une formule qui fait un test, fais le test dans la macro et écrit le résultat.

merci d'utiliser les balises de code en allant en mode avancé cela facilite la lecture.

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'sur quelle feuille est-on là ?
Dim l As Integer
Dim J As Integer
Dim I As Integer
Dim K As Integer

If Target.Address = "$G$8" Then
UserForm1.Show
End If

'Que fait ce formulaire ? A quoi sert-il ?

For l = 20 To 25
Cells(l, 4).Clear
Cells(l, 7).Clear

Next

' il n'est pas besoin d'aller sur une feuille (la sélectionner ou l'activer) pour récupérer sa valeur !
'Sheets("REFERENCE").Activate
'I = Range("A" & Rows.Count).End(xlUp).row [COLOR=#ff0000]'à quoi sert le calcul de ce I ?
I = sheets("reference").range....[/COLOR]
Sheets("MODELE_FACTURE").Activate
with sheets "reference"
For J = 1 To I
    If Cells(16, 3).Value = .Cells(J, 1).Value Then
      Cells(20 + K, 4).Value = .Cells(J, 2)  
'************
      Cells(20 + K, 6).Value ="=IF(ISNONTEXT(RC[-2]),"""",""jours, à un taux de journalier de "")"
      Cells(20 + K, 7).Value = Sheets("REFERENCE").Cells(J, 3)
'************
      Cells(20 + K, 8).Value = "=IF(ISNONTEXT(RC[-4]),"""",""pour un montant total de "")"
'***************
      Cells(20 + K, 9).Value = "=IF(ISNONTEXT(RC[-5]),"""",PRODUCT(RC[-4],RC[-2]))"
      K = K + 1
  End If
Next J
   end with 
End Sub
   
    
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Not Application.Intersect(Target, Range("E19:E25")) Is Nothing Then
   
' Sélection du classeur source à partir d'une fenêtre
    
    cheminfichier = Application.GetOpenFilename("Fichiers Excels (*.xl*), *.xl*")
                
' Si on clique sur Annuler dans la fenêtre, on sort de la boucle
        
    If cheminfichier = False Then
        Exit Sub
      
        End If
 'Ouverture du classeur source
        Workbooks.Open cheminfichier
         nom = ActiveWorkbook.Name

 'Sélection du nombre de jours passés par le consultant sur la mission
    'ActiveCell.Select
    Workbooks("Facturation.xlsm").Activate
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(R16C3,'[" & nom & "]Timesheet'!R5C2:R47C3,2,FALSE)"
    ActiveCell.Select
    
    Cancel = True
 
[I]'Dans la deuxième, je n'ai toujours pas mis le code.. mais grossomodo, cela se résumerait à 
'si cellule active = 0 alors.

'row(activecell;row).select
'selection.clearcontents[/I]
    Workbooks(nom).Close False
End If


End Sub
 
Dernière édition:

OOLIVE

XLDnaute Occasionnel
Re : Conflit entre 2 macros

Misange,


Le userform1 est utilisé ici par faire une extraction de données sur un autre fichier.

Je te joins un fichier pour plus de compréhension.

Pour faire simple, la macro va chercher dans le fichier référence le nom des personnes étant associés à la mission.

Cependant, il se peut que sur un mois, une des personnes n'est pas travaillé sur la mission en question. De ce fait, j'aimerais pouvoir effacer le nom de cette personne sans qu'il réapparaisse !

Je sais pas si j'ai fais plus simple là ;)!

Merci à toi en tout cas !
 

Pièces jointes

  • FactTest.xlsm
    123.7 KB · Affichages: 49
  • FactTest.xlsm
    123.7 KB · Affichages: 57
  • FactTest.xlsm
    123.7 KB · Affichages: 61

Misange

XLDnaute Barbatruc
Re : Conflit entre 2 macros

Bonjour

je t'avais mis tout un baratin mais j'ai été interrompue, la "marque de sécurité a été perdue" et j'ai moi tout perdu !
je recommence mais en plus light

1) ANONYMISE impérativement tes classeurs en enlevant toute référence à des noms de personnes, d'entreprises d'adresses. Même si tu penses que ces données sont publiques, les entreprises ou personnes citées n'ont pas donné leur accord pour ça.

2) utilise les tableaux excel Ce lien n'existe plus dès que tu peux. Outre la clarté cela génère des noms dynamiques dans utilsier decaler et ça évite de faire ce que tu fais : travailler sur des colonnes entières. Avec excel 2010 c'est très très pénalisant en terme de temps et de mémoire de travailler sur des colonnes ou lignes entières.
A partir de ces tableaux j'ai défini quelques noms très simples comme tu verras/

3) les formules dans mon exemple sont directement dans la feuille. Soit tu les mets dans la feuille, soit tu fais le calcul en VBA et tu injectes le résultat dans la feuille mais tu n'injectes pas une formule, ça n'a aucun intérêt.
Dans tes formules, il est plus simple je trouve d'écrire = A1*A2 que d'écrire = produit(A1;A2) non ?
Inutile aussi d'ajouter un + dans une formule du genre =+B1-A2 =B1-A2 suffit (le + est par défaut)

4) au lieu d'utiliser une macro pour aller chercher le nom de l'entreprise, une liste de validation est bien plus simple (regarde en G8).
J'ai une très très nette préférence pour la combinaison index et equiv en lieu et place de rechercheV. Tu verras quelques exemples dans la feuille.
 

Pièces jointes

  • Copie de FactTest-2.xlsm
    103.6 KB · Affichages: 63

OOLIVE

XLDnaute Occasionnel
Re : Conflit entre 2 macros

Bonjour,

Merci de t'être penché sur mon problème Misange, mais je n'ai toujours pas de réponses à ma question initiale.

Grossomodo, dans ton fichier, si un des mecs n'a pas bossé (Valeur =0), est-il possible de nettoyer les valeurs apportées par la macro1 sans qu'elle les refasse apparaître juste après ?

Bien à toi !
 

Misange

XLDnaute Barbatruc
Re : Conflit entre 2 macros

Si tu essayais de te mettre à la place de celui qui essaie de comprendre ton classeur et ta macro tu aurais des réponses plus adaptées.
Moi le "si un des mecs n'a pas bossé (Valeur =0)" je ne comprends pas.
Je ne sais pas où je lis cette valeur 0, dans quelle cellule

le
nettoyer les valeurs apportées par la macro1 sans qu'elle les refasse apparaître juste après
n'est pas plus compréhensible.
Donc sans explications claires de ta part je n'irai pas plus loin.
 

OOLIVE

XLDnaute Occasionnel
Re : Conflit entre 2 macros

Par rapport au fichier que tu m'as renvoyé!

Il se peut que la valeur en E19 soit égale à 0 (nombre de jours travaillés)...

De ce fait, lorsque cette cellule est égale à 0, j'aimerais que les valeurs dans inscrites dans les autres cellules de cette ligne (donc ici, ligne 19) soit supprimées.

OR, si, de toi-même, tu vas sur D19 et que tu appuies sur ta touche "Suppr", tu verras que la valeur va être supprimée, et réapparaître juste après !
 

Misange

XLDnaute Barbatruc
Re : Conflit entre 2 macros

la première chose à faire c'est de taiter ce problème en amont.
N'ayant pas toutes les données, j'ai créé moi même la feuille de temps. Le plus simple dans une feuille de temps c'est quand même de NE PAS saisir de ligne dans le tableau quand une personne n'a pas travaillé sur un projet. Donc ne jamais avoir de Olive : 0.
Sinon, tu le traites dans la macro :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim k As Integer
Dim c As Range

Range("D19:D24").Clear
With Sheets("reference")
k = 19
For Each c In .Range("mission")
    If c = Sheets("modele_facture").Range("C16") And _
    WorksheetFunction.Index(Sheets("reference").Range("Tableau3[temps passé]"), WorksheetFunction.Match(c.Offset(0, 1), Sheets("reference").Range("Tableau3[consultant]"), 0)) <> 0 _
     Then
        Sheets("modele_facture").Range("D" & k) = c.Offset(0, 1)
        k = k + 1
    End If
Next c
   End With

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 716
Messages
2 091 312
Membres
104 858
dernier inscrit
mohamed farhane