Débutant en VBA je ne peux finir ma macro

jeanpierreco -  
 Armojax -
Bonjour,

Dans une feuille de calcul excel, sur une colonne j'ai des dates qui sont des dates de rappel de vaccinations à ne pas dépasser.Ces dates se mettent en rouge à l'ouverture de la macro auto open par comparaison avec la date système (cellule E3). Sinon elles restent normales.

Dans la seconde partie de la macro, si on entre la date de vaccination (colonne à côté des dates de rappel), je voudrais effacer automatiquement la cellule correspondant à la date de rappel pour n'avoir que les dates de rappel futures d'affichées.

Sur ma macro ,ci-dessous, elle fonctionne une fois pour effacer la cellule date rappel vaccination et m'envoie un message d'erreur sur la ligne:
ActiveCell.Offset(0, -1).Select du type erreur d'exécution 1004 erreur définie par l'application et par l'objet.Si je réinitialise elle refonctionne et me renvoit l'erreur
D'où vient l'erreur?
D'autre part dans la première partie de la macro (comparaison des dates) si on est supérieure à la date système le texte s'affiche en rouge mais si la date était par exemple de l'année 2004 elle est considérée comme inférieure et pourtant la date de rappel serait dépassée. Comment faire dans ce cas pour comparer les dates?
Voici la macro

Sub auto_Open()

' Macro1 Macro
' Macro enregistrée le 18/01/2005 par jp
Dim plage As Range
Dim plage1 As Range

Set plage = Worksheets("feuil1").Range("D6:D15")
For Each cell In plage
If cell.Value > Range("E3") Then
cell.Font.ColorIndex = 3
'la date système est en E3 les dates supérieures passent en rouge
Else
cell.Font.ColorIndex = 0
'les dates inférieures ne changent pas de couleur
End If
Next cell
Set plage1 = Worksheets("feuil1").Range("E6:E15")
For Each cell In plage1
If IsDate(cell) Then
'si les cellules plage "E6:E15" sont des dates
ActiveCell.Offset(0, -1).Select
'selectionner la cellule tout de suite à gauche et la supprimmer

Selection.ClearContents

End If
Next cell

End Sub

4 réponses

  1. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    Bonjour jeanpierreco,
    J'ai testé votre macro et il semble qu'il manque une instruction (en gras).
    'si les cellules plage "E6:E15" sont des dates
    Cells(cell.Row, cell.Column).Select
    ActiveCell.Offset(0, -1).Select (ou Activate, à voir)
    Bonne journée.

    Salutations
    Jean-Pierre
    1
  2. Armojax
     
    Bonsoir Jeanpierreco,

    Dans ta deuxième boucle, tu travailles sur "cell", et non pas sur ActiveCell. Remplace "ActiveCell" par "cell" tout court. Ça suffit pour corriger ton problème.

    Puisque tu te mets à VBA, ta première boucle est un bon exercice.
    Sinon, tu peux te passer de VBA pour colorer tes cellules.

    Je suppose que ta cellule "E3" (ou L3C5) contient : =AUJOURDHUI().
    En Excel pur (sans VBA) tu peux utiliser la mise en forme conditionnelle.
    On y accède en faisant : Format / Mise en forme conditionnelle.

    Sélectionne ta plage de cellules, puis vas-y.
    - Dans la lucarne de gauche, tu dis que si la valeur de ta cellule "est supérieure à "
    - Dans la lucarne de droite, tu dis : =L3C5 (en notation L1C1 par exemple).
    Ensuite, le bouton Format te permet de choisir une mise en forme (police, motif, couleur). Tu peux mettre jusqu'à 3 conditions.

    Essaie ça, c'est pratique.
    Armojax.
    0
    1. jeanpierreco
       
      Bonjour,
      Merci Armojax de tes conseils, J'ai pratiquement fini toutes mes macros sur le classeur.
      J'ai un dernier détail que je n'arrive pas à résoudre. Dans la portion de code ci-dessous comment mettre un gestionnaire d'erreur pour indiquer à l'utilisateur de rentrer une date au format valide au cas où la saisie dans la cellule serait autre qu'une date.
      Je fais le pas à pas détaillé en mettant un gestionnaire d'erreur mais la cellule en erreur est ignorée et la MSGBOX n'apparait pas.

      plage1 = Worksheets("feuil1").Range("E6:E15")

      For Each cell In plage1

      If IsDate(cell) = True Then

      cell.Activate
      'si les cellules plage "E6:E15" sont des dates

      ActiveCell.Offset(0, -1).Activate
      'selectionner la cellule tout de suite à gauche et la supprimer

      Selection.ClearContents
      End If

      Next cell

      End Sub
      0
      1. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95 > jeanpierreco
         
        Bonjour jeanpierreco,
        Je me suis mal expliqué dans mon premier courriel, toutes mes excuses.
        Je suis content de constaté que tout fonctionne avec la méthode Activate, et ceci malgré mon erreur.
        Bravo.

        Salutations
        Jean-Pierre
        -1
  3. Armojax
     
    Bonsoir jeanpierreco,

    Je te propose le code ci-dessous :

    Sub Macro()
    
        Dim plage1 As Range
        
        Set plage1 = Worksheets("feuil1").Range("E6:E15")
        
        For Each cell In plage1
            If IsDate(cell) Then
                cell.Offset(0, -1).ClearContents
            Else
                 cell.select
                MsgBox cell.Value & " : format de date non valide"
                Exit Sub
            End If
        Next cell
        
    End Sub
    


    - La fonction "IsDate" renvoie une valeur VRAI ou FAUX. Donc tu peux écrire "If IsDate() ... then" sans tester la valeur : =True.

    - Ensuite, il est la plupart du temps possible de travailler sur un objet sans l'activer au préalable. On peut parfaitement aller chercher des données d'une plage d'un classeur non actif, sans rien activer ni sélecter auparavant.

    - Quand on fait "Enregistrer une macro", pour qu'Excel mémorise les actions qu'on fait à la main, on passe son temps à sélectionner quelque chose, puis on fait une action. Au moment de la sélection, Excel ne sait pas ce qu'on va faire (mettre en gras ? couper ? colorer ?). Il note donc qu'on a sélectionné l'objet. Puis, dans la commande suivante, il fait : Selection.Action.

    En général, on peut remplacer :
    Select toto
    Selection.Action
    

    par
    toto.Action
    

    C'est un peu comme si on disait : "Je sélectionne Gilbert", puis "Bonjour la sélection". Non, on dit "Bonjour Gilbert".

    D'où la simplification du code : on vire les activate, selection, select. Ça marche tout aussi bien.

    - Pour ta gestion d'erreur, je propose du simpliste. Dans le cas où la cellule ne contient pas une date (cas Else), j'affiche un petit message contenant la valeur de la cellule, et je la sélectionne pour rendre visible l'endroit. On peut aussi la mettre en rouge, etc. Et je sors de la boucle.

    Bien sûr, on a d'autres solutions. ..

    Bonne soirée.
    Armojax.
    0
  4. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
     
    Bonjour jeanpierreco,
    Pour sélectionner une cellule, utiliser la méthode Activate (Select pour une plage)
    D'où : ActiveCell.Offset(0, -1).Activate
    Bonne journée
    Salutations
    Jean-Pierre
    -1
    1. Armojax
       
      Bonsoir,

      Ce n'est pas exactement ça, Purrofixe.

      "Select" sélectionne une plage ? D'accord. Mais une seule cellule suffit à constituer une plage.
      D'autre part, ActiveCell désignant la cellule active, vouloir lui appliquer un "Activate" n'a pas grand sens.

      Cordialement.
      Armojax.
      0
      1. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95 > Armojax
         
        Bonsoir,
        Merci.

        Salutations
        Jean-Pierre
        0