Conflit entre 2 macros, besoin d'aide

Résolu/Fermé
Anais0998 Messages postés 9 Date d'inscription lundi 4 mars 2019 Statut Membre Dernière intervention 14 mars 2019 - 4 mars 2019 à 13:34
Anais0998 Messages postés 9 Date d'inscription lundi 4 mars 2019 Statut Membre Dernière intervention 14 mars 2019 - 8 mars 2019 à 12:45
Bonjour à tous,

Tout d'abord, je débute en programmation vba. Soit je me sers de l'enregistreur de macro, soit je teste et récupère des bouts de codes à droite à gauche, tout en consultant les nombreuses fiches de cours que l'on peut trouver sur le net, mais j'avoue que je m'embrouille très vite dans le domaine, à mon grand désespoir ...

Je bute depuis plusieurs jours sur un problème de conflit, à mon avis, entre 2 macro sur la même feuille, l'une avec worksheet_change ... et l'autre avec worksheet_selectionchange ...

La première fonctionne bien, la seconde, qui appelle 2 autres macros, a fonctionné lors du premier lancement, mais depuis, elle ne fonctionne plus (lorsque je sélectionne n'importe quelle cellule de ma feuille, ma sélection s'annule aussitôt pour toujours sélectionner ma cellule A1.

C'est la raison qui m'a poussée aujourd'hui à m'adresser à vous, en espérant trouver rapidement une solution car je vais avoir besoin de mon fichier mercredi.


Je ne peux pas transmettre mon fichier car il ne contient que des informations personnelles, alors si cela est possible, pourrez-vous jeter un oeil sur mes codes, au cas où ...

Dans tous les cas, je vous remercie d'avance pour tous les conseils que vous pourriez me donner, sachant que vous allez sûrement vous arracher les cheveux en découvrant mes codes ...

Je vous souhaite une belle journée.


PS : je n'arrive pas à poster tous mes codes d'un coup, je commence par celui là des fois que les erreurs y seraient cachées, encore merci d'avance



<
Dim An2010 As Worksheet, An2011 As Worksheet, An2012 As Worksheet, An2013 As Worksheet, An2014 As Worksheet, An2015 As Worksheet, _
An2016 As Worksheet, An2017 As Worksheet, An2018 As Worksheet, An2019 As Worksheet, An2020 As Worksheet, An2021 As Worksheet, An2022 As Worksheet, _
An2023 As Worksheet, An2024 As Worksheet, An2025 As Worksheet, An2026 As Worksheet, An2027 As Worksheet, An2028 As Worksheet, An2029 As Worksheet, _
An2030 As Worksheet, An2031 As Worksheet, An2032 As Worksheet, An2033 As Worksheet, An2034 As Worksheet, An2035 As Worksheet, An2036 As Worksheet, _
An2037 As Worksheet, An2038 As Worksheet, An2039 As Worksheet, An2040 As Worksheet

Dim selectionlot As Range, PlagedeRecherche As Range, ValeurTrouvee As String, AdresseTrouvee As Variant
Dim PlagedeRechercheP As Range, ValeurTrouveeP As String, AdresseTrouveeP As Variant
Dim ZoneAcopier As Range, ZoneAcoller As Range





Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
Application.EnableEvents = False

Dim WsRech As Worksheet
Dim WsResult As Worksheet
Dim selection1 As Range
Dim selection2 As Range



Set selectionlot = Range("A1")
Set WsRech = ThisWorkbook.worksheets("Formulaire")
Set WsResult = ThisWorkbook.worksheets("ListesAVB2")

Set selection2 = Sheets("Formulaire").Range("L2:AJ32")
Set selection1 = Sheets("ListesAVB2").Range("V2:AT32")


If Not Application.Intersect(selectionlot, Range(Target.Address)) Is Nothing Then
Application.DisplayAlerts = False

WsResult.Range("J2").Copy
WsRech.Range("B1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'Statut COTISATIONS

WsResult.Range("K7").Copy
WsRech.Range("B3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'Statut PROPRIETAIRE

WsResult.Range("K4").Copy 'date achat
WsRech.Range("B4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K5").Copy 'impayés
WsRech.Range("B5").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K6").Copy 'proprietaire
WsRech.Range("B7").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K8").Copy 'téléphone fixe
WsRech.Range("B8").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K9").Copy 'mobilis
WsRech.Range("B9").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K10").Copy 'courriel
WsRech.Range("B10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K12").Copy 'conjoint
WsRech.Range("B12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K13").Copy 'mobilis conj
WsRech.Range("B13").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K14").Copy 'courriel conj
WsRech.Range("B14").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K16").Copy 'adresse
WsRech.Range("B16").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K17").Copy 'code postal adresse
WsRech.Range("B17").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K18").Copy 'commune adresse
WsRech.Range("B18").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K19").Copy 'Bp
WsRech.Range("B19").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K20").Copy 'code postal BP
WsRech.Range("B20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

WsResult.Range("K21").Copy 'commune BP
WsRech.Range("B21").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'WsRech.Range("B23") = WsResult.Range("K22").Value 'commune BP

selection1.Copy
selection2.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False



End

Application.EnableEvents = True

End Sub></code>
A voir également:

2 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié le 4 mars 2019 à 21:03
Bonjour

1) A quoi servent ces beaucoup trop nombreuses variables publiques ????
Dim An2010 As Worksheet, An2011 As Worksheet, An2012 As Worksheet, An2013 As Worksheet, An2014 As Worksheet, An2015 As Worksheet ...,

2) Au lieu de
WsResult.Range("J2").Copy
WsRech.Range("B1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'Statut COTISATIONS

il est préférable d'écrire :
WsRech.Range("B1").Value = WsResult.Range("J2").Value  'Statut COTISATIONS

et idem pour les suivants
1
Anais0998 Messages postés 9 Date d'inscription lundi 4 mars 2019 Statut Membre Dernière intervention 14 mars 2019
5 mars 2019 à 04:30
Bonjour Patrice33740 et merci pour votre retour.
1) toutes ces variables sont les feuilles de mon classeur qui vont être concernées par la macro.
2) c'est ce que j'avais fait au départ, mais j'avais changé pensant alléger ma macro
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié le 5 mars 2019 à 08:51
1) Toutes ces variables privées, c'est une aberration, une ou deux variables locales suffisent (comme dans la procédure).
2) il est préférable d'éviter d'employer le presse-papier.
0
Anais0998 Messages postés 9 Date d'inscription lundi 4 mars 2019 Statut Membre Dernière intervention 14 mars 2019
5 mars 2019 à 10:02
1) je vais faire les modifications pour les variables, par contre, comment éviter d'employer le presse-papier ? car je ne sais pas en quoi cela consiste.

Merci pour votre aide et bonne journée.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié le 5 mars 2019 à 15:42
Pour éviter d'utiliser le presse papier, il faut éviter Copy suivi d'un Paste.
Donc pour copier les valeurs :
RangeDestination.Value = RangeSource.Value
et pour tout copier :
RangeSource.Copy Destination:=CellDestination
0
Anais0998 Messages postés 9 Date d'inscription lundi 4 mars 2019 Statut Membre Dernière intervention 14 mars 2019
7 mars 2019 à 07:17
Bonjour et merci encore pour vos précieux conseils.

J'ai finalement changé mes procédures car avec un worksheet change et un worksheet selectionchange sur la même feuille, c'était vraiment le bazar complet. J'ai donc refait mes codes et inséré des boutons déclencheurs pour les macros. Par contre, il y a encore un truc qui m'échappe. J'ai 2 feuilles distinctes 1 et 2. La (2) contient des MEFC, et lorsque je fais des "copié/collé" de la feuille 1 vers le feuille 2, c'est la panique dans mes MEFC. Pourtant je ne fais que coller de valeurs à la place d'autres valeurs, donc pas de rajout dans mon tableau. J'aimerais que mes MEFC ne changent pas. Je vous mets mon code actuel, si vous aviez une idée des erreurs à corriger. Je vous en remercie d'avance. de plus, je ne vois pas comment adapter ce code avec vos explications sur le copié collé ...

<

Sub EnregModif_proprietaires()

Application.ScreenUpdating = False

Dim wksp As Worksheet, wksf As Worksheet
Dim selectionlot As Range
Set selectionlot = ThisWorkbook.worksheets("Formulaire").Range("A1")
Set wksp = ThisWorkbook.worksheets("Proprietaires")
Set wksf = ThisWorkbook.worksheets("Formulaire")


ValeurTrouveeP = selectionlot.Value

Set PlagedeRechercheP = Sheets("Proprietaires").Columns(1)

Set AdresseTrouveeP = PlagedeRechercheP.Cells.Find(what:=ValeurTrouveeP, LookAt:=xlWhole)

If Not AdresseTrouveeP Is Nothing Then

AdresseTrouveeP = AdresseTrouveeP.Address

Application.Goto Reference:=wksp.Range(AdresseTrouveeP), scroll:=True




ActiveCell.Offset(0, 1).Select 'date achat
wksf.Range("B4").Copy
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select 'proprietaire
wksf.Range("B7").Copy
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 2).Select
wksf.Range("B23").Copy 'observations
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False



ActiveCell.Offset(0, 1).Select
wksf.Range("B12").Copy 'conjoint
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B16").Copy 'adresse
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B17").Copy 'cp adresse
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B18").Copy 'commune adresse
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B19").Copy 'bp
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B20").Copy 'cp bp
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B21").Copy 'commune bp
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 2).Select
wksf.Range("B8").Copy 'telephone fixe
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B9").Copy 'mobilis proprietaire
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B13").Copy 'mobilis conjoint
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B10").Copy 'mail proprietaire
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 1).Select
wksf.Range("B14").Copy 'mail conjoint
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False


ActiveCell.Offset(0, 5).Select
wksf.Range("B3").Copy 'conjoint
ActiveCell.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False




Application.Goto Reference:=wksp.Range(AdresseTrouveeP), scroll:=True
ActiveCell.Select



Application.ScreenUpdating = True

End With
End If
End Sub
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
7 mars 2019 à 13:40
Bonjour,

Essaies :
Option Explicit
Sub EnregistrerModifications2010()
Dim PlagedeRecherche As Range
Dim SelectionLot As Range
Dim ZoneAcopier As Range
Dim ZoneAcoller As Range
Dim AdresseTrouvee As Range
Dim ValeurTrouvee As Variant
  
  Application.ScreenUpdating = False
  With Worksheets("an2010")
    Set PlagedeRecherche = Intersect(.Columns(1), .UsedRange)
  End With
  Set SelectionLot = Worksheets("Formulaire").Range("A1")
  ValeurTrouvee = SelectionLot.Value
  Set AdresseTrouvee = PlagedeRecherche.Cells.Find(what:=ValeurTrouvee, LookAt:=xlWhole)
  If Not AdresseTrouvee Is Nothing Then
    Set ZoneAcopier = Worksheets("Formulaire").Range("L2:AJ2")
    Set ZoneAcoller = AdresseTrouvee.Offset(0, 12).Resize(1, ZoneAcopier.Columns.Count)
    ZoneAcoller.Value = ZoneAcopier.Value
    If MsgBox("Les modifications ont bien été enregistrées. Souhaitez-vous consulter la base de données ?", vbYesNo, _
              "Confirmation de l'enregistrement des modifications") = vbYes Then
      'Application.Goto Reference:=ActiveCell, scroll:=True 'ça c'est inutile !
    Else
      Application.Goto Reference:=AdresseTrouvee, scroll:=True
    End If
  End If

End Sub
 
1
Anais0998 Messages postés 9 Date d'inscription lundi 4 mars 2019 Statut Membre Dernière intervention 14 mars 2019
8 mars 2019 à 12:45
Bonjour Patrice et merci pour ce code qui fonctionne !!!

Je vais maintenant pouvoir continuer mon petit programme, en cas de besoin de reviendrai par ici.

Encore un grand merci pour ta générosité.

Belle journée.
0