Critére d'appliquation Code

GDP06

XLDnaute Nouveau
Bonjour,

Comment faire éxécuter, ou ne pas éxécuter, un code à l'ouverture d'un fichier Exel suivant des valeurs de cellules (Numérique ou texte) ?

Mon probléme : dans le fichier joint est attaché un code, je veux qu'il s'éxécute que si une ou plusieurs cellule (C7:C12) sont égales à la Cellule (A1), sinon le fichier s'enregistre et se ferme.

Le but du code : envoyé un mail à des destinataires suivant les données.

Ma question : comment insérer une fonction "SI" (ou autre dans le code)

Merci de votre aide.
 

Pièces jointes

  • Tab Ref envoi Ot (Exemple).xlsm
    25.1 KB · Affichages: 34

Orodreth

XLDnaute Impliqué
Re : Critére d'appliquation Code

Bonjour,

Pas trop le temps de regarder ton fichier joint, mais en me basant sur ta description, voici un code qui devrait répondre à ta demande:

Code:
Sub Workbook_Open()
    Dim WS_AVerifier As Worksheet
    'Variable qui permet au classeur de référencer la feuille sur laquelle se trouve tes critères
    'IL FAUT CHANGER ==> NOM DE LA FEUILLE ICI <== par le nom de ta feuille Excel
    Set WS_AVerifier = Worksheets("NOM DE LA FEUILLE ICI") 

    If Verif_Plage_C7C12(WS_AVerifier) Then 'La condition à vérifier ici
        'Exécution de ton code ici
    End if
End Sub

Private Function Verif_Plage_C7C12 (WS_AVerifier As Worksheet) As Boolean 'La fonction qui va permettre de déterminer si tes critères sont vérifiés
    Dim b_TousCriteres_OK As Boolean
    b_TousCriteres_OK = True 'Par défaut, tous tes critères sont considérés comme étant vérifiés

    'Le principe d'action consiste à parcourir la liste des critères pour vérifier si l'un d'eux est faux. 
    'Si tel est le cas, la fonction ne cherche pas plus loin et informe le classeur que tous les critères ne sont pas OK
    'Sinon, elle poursuit son traitement jusqu'à la fin et informe ensuite le classeur que les critères sont OK

    Dim val_Reference_C1 As String
    val_Reference_C1 = Cstr(WS_AVerifier.Range("C1").value)

    Dim pcs_Criteria As Long 'variable qui permet de parcourir les critères
    For pcs_Criteria = 7 to 12 'On va boucler sur chaque critère pour vérifier la condition
        'On teste le critère par rapport à la référence, le test est fait au format textuel
        If cstr(WS_AVerifier.cells(pcs_Criteria, 3).value) <> val_Reference_C1 then
            b_TousCriteres_OK = False
            Goto Fin_Verif_Criteria
        End if
    Next pcs_Criteria

Fin_Verif_Criteria:
    Verif_Plage_C7C12 = b_TousCriteres_OK
End Function

Copie-colle ce code dans ton module "ThisWorkBook", n'oublie pas de modifier le NOM DE LA FEUILLE ICI, enregistre, ferme, et rouvre pour tester.

Cordialement,
 

GDP06

XLDnaute Nouveau
Re : Critére d'appliquation Code

Rebonjour,

J'ai réécrit le code avec la fonction. Je commets une erreur et aprés 2h30 de "réfléchissement" je n'y arrive plus !

À l'ouverture du fichier, le code envoie un Mail, même si la valeur des cellules en C6:C12 n'est pas 10 (valeur de C1)

Où est mon erreur d'écriture ?

En pj le fichier avec son Nx Code

Merci et bonne soirée.
 

Pièces jointes

  • Tab Ref envoi Ot (Exemple).xlsm
    29.1 KB · Affichages: 40

Jam

XLDnaute Accro
Re : Critére d'appliquation Code

Salut GDP06, Orodreth,

Désolé mais je peux pas m'empêcher de faire quelques remarques (d'ordre pragmatique uniquement) concernant le code soumis par Orodreth - je précise qu'en aucun cas cela ne se veut désobligeant:
  • Je ne vois pas l'intérêt d'avoir recours à une fonction alors qu'on y fait appel qu'une seule fois
  • De même je ne pense pas qu'il soit nécessaire de faire une déclaration de la feuille
  • Je suggère d'utiliser une plage nommée et de parcourir la collection: intérêt = rapidité du code, pas d'utilisation de 7 à 12, lisibilité
  • le truc qui est vraiment beurk :eek: c'est le Goto. Ca pas être bien en VBA.
Donc tout cela donnerai quelque chose comme ceci:

VB:
'On aura au préalable nommé la plage C7:C12 avec un petit nom genre "rngVerif"
'Précision: j'utilise toujours rng en suffixe de variable quand il s'agit d'une plage (et pas une cellule).


Sub Workbook_Open()
    Dim x As Range
    Dim sCondition As String
    
    sCondition = Feuil1.Range("C1")
    ' On parcours toutes les cellules. Si une seule ne correspond pas à C1 alors le fichier est fermé
    ' sinon le programme continu et envoi le mèl ;)
    For Each x In Range("rngVerif")
        If x.Value <> sCondition Then
            MsgBox "Conditions non vérifiée. Le classeur va être fermé automatiquement.", vbCritical + vbOKOnly, "Erreur"
            ThisWorkbook.Close SaveChanges:=False
            Exit For
        End If
    Next
    
'... la suite de ton code ici
    
End Sub

Bon courage
 

Staple1600

XLDnaute Barbatruc
Re : Critére d'appliquation Code

Bonjour à tous___________________________________EDITION: Bonjour (avec retard) Jam ;)

Personnellement pour ceci:
je veux qu'il s'éxécute que si une ou plusieurs cellule (C7:C12) sont égales à la Cellule (A1)
je ferai ainsi
Code:
Sub a() 'macro a ici pour test
'donc code VBA à mettre dans WorkBook_Open() pour éxécution à l'ouverture
check = Application.CountIf([C3:C12], [A1])
If check >= 1 Then
Call MacroEnvoiEMail
Else
ThisWorkbook.Close SaveChanges:=False
End If
End Sub
Code:
Private Sub MacroEnvoiEMail()
MsgBox "Y a plus qu'à l'écrire ;o), la macro qui envoie le mail"
End Sub
 
Dernière édition:

Orodreth

XLDnaute Impliqué
Re : Critére d'appliquation Code

Re,

Oula oui, le Goto est moche.

J'ai l'habitude de m'en servir quand je ne connais pas d'autre solution, mais là, un exit for fait parfaitement l'affaire (bien que, en terme strict, le exit for revient à faire précisément un Goto).
Désolé, ma situation personnelle me perturbe plus que je ne le pensais :/
 

Jam

XLDnaute Accro
Re : Critére d'appliquation Code

Salut Orodreth,

T'inquiète c'est pas grave. Regarde, la soluce de ce cher Staple est encore plus simple que ce que j'avais proposé (y m'énerve avec ses soluces toujours aussi simples et performantes ;) ).
Bref, on apprend toujours. C'est ça qui est bien avec le dév. Y'a pas une solution, mais des solutions. Aucune n'est parfaite, ce qui compte c'est qu'elle fonctionne correctement.

Bon courage.

Bonjour Staple :)
 

GDP06

XLDnaute Nouveau
Re : Critére d'appliquation Code

Rebonjour,

Voilà 2h00 que je "galère" sur ma macro et j'ariive pas à résoudre ( et non résolver :) ) le soucis.

Le code de "Staple1600" marche à merveille, ainsi que la macro appellée mais uniquement sur mon fichier exemple.

En effet lorsque je veux appliquer le code et la macro sur un autre tableau, la macro me répond : " Type défini par l'utilisateur non défini" (Voir PJ)

J'oublie quoi ?

Merci
 

Pièces jointes

  • Erreur Macro Mail.docx
    129.5 KB · Affichages: 47

Jam

XLDnaute Accro
Re : Critére d'appliquation Code

Salut GDP06,

Sauf erreur c'est parce que tu n'a pas référencé Outlook dans ton projet.

2013-07-11 16_55_51-Références - VBAProject.png


Bon courage
 

GDP06

XLDnaute Nouveau
Re : Critére d'appliquation Code

Bonjour à Tous,

J'ai bouclé mon projet, grace à votre aide précieuse.

Seul petit soucis, le tableau s'actualise quotidiennement, et son code s'éxécute. Il transmet donc un Courriel. Je veux que le code ne s'éxécute à l'ouverture du tableau, que si une nouvelle cellule (I1:I1000) a la valeur "Ugence garantie" (B2) par rapport à la derniére actualisation.

Suis je assez clair ?

En PJ mon tableau (exemple succsin ) avec ses macros & son code.

Merci et bonne journée.
 

Pièces jointes

  • Controle Garantie Exemple.xlsm
    43.6 KB · Affichages: 38
  • Controle Garantie Exemple.xlsm
    43.6 KB · Affichages: 45
  • Controle Garantie Exemple.xlsm
    43.6 KB · Affichages: 46

Discussions similaires

Réponses
15
Affichages
846

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin