XL 2016 If Not xRgSel Is Nothing Then --> Ne marche pas

R3n0W

XLDnaute Nouveau
Bonjour

J'essaye de faire une macro en utilisant les modèles déjà dispo par ci par là et dont tout le monde semble plutôt satisfaits, mais lorsque j'essaie de reproduire la chose bien sûr cela ne marche pas... Pourtant la syntaxe ma parait juste et là je cale.
Je me suis mis une petite MsgBox dans le code histoire de voir jusqu'où avance la macro mais j'ai beau modifier mon Range, la MsgBox ne s'active pas me laissant penser que la condition non plus du coup.

Help svp 😁

VB:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim T_PLANACTIONS As Object
Set T_PLANACTIONS = PlanAction.ListObject("T_PLANACTIONS")

Dim xRg As Range
Dim xRgSel As Range
Dim Email As Object
Set Email = CreateObject("Outlook.Application")

    'On Error Resume Next
    'Application.ScreenUpdating = False
    'Application.DisplayAlerts = False
    'Application.EnableEvents = False
    
    
    'Set xRg = Range("M:M")
    Set xRg = T_PLANACTIONS.ListColumns("Pour Action").DataBodyRange
    Set xRgSel = Application.Intersect(Target, xRg)

    If Not xRgSel Is Nothing Then
    
    MsgBox "Marche ou marche pas ? " & Target.Address
    
    Dim Responsable As Range
    x = Target.Value
    'x = xRgSel.Value

    Select Case x
        Case "Bruno"
            Responsable = Para.Range("G3")
        Case "Renaud"
            Responsable = Para.Range("G2")
        Case "Raphaël"
            Responsable = Para.Range("G4")
        Case "Cyril"
            Responsable = Para.Range("G6")
        Case "Damien"
            Responsable = Para.Range("G7")
    End Select
            
 
Dim StrSubjectRef As String
StrSubjectRef = "Lot 3 : Ta contribution est attendue sur une action"

Dim StrBodyRef As String
StrBodyRef = "Analyses du - Alerte dépassement sur un paramètre de Référence Qualité." & "<br>"
'            & "Mesure de " & NomParamètre & " à " & QtéParamètre & " au niveau de " & PtPrélèv & " lors des analyses d'eau n'est pas dans sa gamme de conformité." & "<br>" _
'              & "<a href=" & Chemin & "\" & NomFic & ">CLIQUER ICI</a> Pour ouvrir le fichier et en apprendre plus." & "<br>" _
'              & "<br>" _
'              & "@tte"

        With Email.CreateItem(olMailItem)
            .Subject = StrSubjectRef
            .To = Responsable
            .HTMLBody = .HTMLBody & StrBodyRef
            .Display
            '.Send
        End With
        
        Set xRgSel = Nothing

    End If
    
    'Application.DisplayAlerts = True
    'Application.ScreenUpdating = True
    'Application.EnableEvents = True
    
End Sub
 
Solution
Oui mais vous l'avez mis dans le module ThisWorkbook. Il n'y a pas d'objet implicite générateur d'évènements nommé Worksheet le module ThisWorkbook. Il y a seulement un objet Workbook. Le générateur Worksheet, c'est seulement dans les modules d'objets Worksheet.
Utilisez les listes déroulantes surmontant la fenêtre de code pour implanter les modèles de procédures de prises en charge d'évènements. L'évènement SheetChange de l'objet Workbook nécessite un effet un argument Byval Sh As Object supplémentaire devant.

Dranreb

XLDnaute Barbatruc
Bonjour.
PlanAction est soit un nom d'objet Worsheet de la rubrique Microsoft Excel Objets, soit une variable Public As Worksheet, je suppose ?
Dans ce cas, au début, extrayez un ListObjet de sa collection ListObjects !
Si c'est un Range vous pouvez prendre sa propriété ListObject, sans "s" mais sans argument non plus.
 

R3n0W

XLDnaute Nouveau
Bonjour.
PlanAction est soit un nom d'objet Worsheet de la rubrique Microsoft Excel Objets, soit une variable Public As Worksheet, je suppose ?
Dans ce cas, au début, extrayez un ListObjet de sa collection ListObjects !
Si c'est un Range vous pouvez prendre sa propriété ListObject, sans "s" mais sans argument non plus.

Bonjour Dranreb,
"PlanAction" est effectivement un nom d'objet Worksheet, tout comme "Para". Je trouve que ça allège la déclaration des variables sans perdre en clarté.
Du coup je suis assez curieux de votre astuce sur les ListObjects mais j'avoue ne pas avoir bien saisi l'explication. Un petit exemple peut être ?

Vous pensez que cela peut avoir un impact sur mon problème ?
 

ChTi160

XLDnaute Barbatruc
Bonjour le Fil
R3n0W !
tu as
VB:
Set T_PLANACTIONS = PlanAction.ListObject("T_PLANACTIONS")
ou il manque un "s" à ListObject,
pour donner
VB:
Set T_PLANACTIONS = PlanAction.ListObjects("T_PLANACTIONS")
as tu modifié ton code en conséquence , comme indiqué par Dranreb ?
Bonne journée
Jean marie
 

R3n0W

XLDnaute Nouveau
Bonjour ChTi160 !
Code modifié. Malheureusement pas d'amélioration à l'horizon lorsque je modifie une cellule de la plage :
VB:
xRg = T_PLANACTIONS.ListColumns("Pour Action").DataBodyRange

Bonne journée également,
 

Dranreb

XLDnaute Barbatruc
Je trouve que ça allège la déclaration des variables sans perdre en clarté.
J'approuve complètement l'utilisation des objets VBA Worksheet implantés par l'application hôte, mais pour moi ça perd en clarté quant à ce dont il s'agit si le nom qu'on lui a donné ne commence pas par Wsh.

Utilisez les espions, c'est très pratique, ou joignez le classeur, qu'on puisse déboguer à votre place.
 
Dernière édition:

R3n0W

XLDnaute Nouveau
J'entends, il est vrai que ça reste clair lorsque ça reste la même personne qui alloue les noms.
J'ai pris la remarque en compte et ai rajouté le Préfixe Ws_ aux noms de mes Worksheets.

Moi ce que je trouve dommage, mais c'est peut être que je ne sais pas le faire, c'est qu'on ne puisse pas directement utiliser le Tableau via son nom d'Objet comme pour la Worksheet. Après tout, Excel nous impose des noms uniques pour les tableaux, mais non il faut passer par une déclaration As Object.
Bref je m'égare. Vous trouverez une version anonymisée en PJ.

Je n'ai encore jamais utilisé les Espions, je pense qu'il va falloir que je m'y mette !
 

Pièces jointes

  • PLAN D'ACTIONS LOT3 - Anonyme.xlsm
    221.3 KB · Affichages: 1

Dranreb

XLDnaute Barbatruc
Mettez Option Explicit en tête de vos modules. Il vous signalerait avant même de tenter une exécution que T_PLANACTION n'existe pas dans la Sub Test.
Par ailleurs une Sub Worksheet_Change n'a rien à faire dans le module ThisWorkbook. Il y a Workbook_SheetChange si vous voulez.
 

R3n0W

XLDnaute Nouveau
J'ai déjà créé des macros dans ThisWorkbook, mais des trucs simples comme BeforeSave par exemple, là je fais avec ce que j'ai trouvé sur internet, les forums comme celui-ci ou sur le site Microsoft.
Pour déclencher une action à la modification d'une cellule d'une plage, ils utilisent la fonction
VB:
Private Sub Worksheet_Change (ByVal Target As Range)
Donc j'utilise la même.
Etant toujours partant pour tester et apprendre j'ai donc tenté
Code:
Workbook_SheetChange(ByVal Target As Range)
toujours dans ThisWorkbook mais la modification de ma plage xRg me donne l'erreur suivante :
Erreur de compilation
La déclaration de la procédure ne correspond pas à la description de l'évènement ou de la procédure du même nom
Pas beaucoup plus avancé… Mais au moins il voit bien qu'il y a quelque chose à faire lorsque je modifie ma plage et ça me rassure un peu 😅
 

Dranreb

XLDnaute Barbatruc
Oui mais vous l'avez mis dans le module ThisWorkbook. Il n'y a pas d'objet implicite générateur d'évènements nommé Worksheet le module ThisWorkbook. Il y a seulement un objet Workbook. Le générateur Worksheet, c'est seulement dans les modules d'objets Worksheet.
Utilisez les listes déroulantes surmontant la fenêtre de code pour implanter les modèles de procédures de prises en charge d'évènements. L'évènement SheetChange de l'objet Workbook nécessite un effet un argument Byval Sh As Object supplémentaire devant.
 
Dernière édition:

R3n0W

XLDnaute Nouveau
Oui mais vous l'avez mis dans le module ThisWorkbook. Il n'y a pas d'objet implicite générateur d'évènements nommé Worksheet le module ThisWorkbook. Il y a seulement un objet Workbook. Le générateur Worksheet, c'est seulement dans les modules d'objets Worksheet.
Effectivement, vous avez raison.
J'ai creusé un peu par rapport à ça et j'ai fini par trouver.
Lorsque j'ai remplacé Worksheet_Change par Workbook_SheetChange et que j'ai eu l'erreur c'est parce que mes variables n'étaient pas complètes, je ne déclarais que Target et il en manquait une :
VB:
Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Cela fonctionne j'ai ma MsgBox qui s'affiche à la modification d'une cellule de ma plage xRg maintenant !
Merci 😁
 

Discussions similaires

Réponses
6
Affichages
304
Réponses
2
Affichages
236

Statistiques des forums

Discussions
312 209
Messages
2 086 266
Membres
103 168
dernier inscrit
isidore33