Problème avec les cellules vides !

Résolu
Bonjour,

Les cellules "C6" et "C8" contiennent soit "rien" (cellules effacées), soit un nombre venant d'une copie;
Je galère pour écrire une macro du genre :

sub GRAPH()

si "C6" vide alors
"D8"=1
'ce "D8"=1 est juste pour voir le fonctionnement !
sinon
si "C8" non vide alors
"D8"=2
'idem ci-dessus
fin
fin
"D8"=3
'idem ci-dessus
end sub

Je n'arrive pas à trouver une écriture qui colle avec le "si cellule "X" vide" et qui fonctionne !

Merci d m'aider,
cordialement,
GUGUSSE.

10 réponses

  1. re

    Const nomF = "Feuil1"
    
    Public Sub essai()
    With Sheets(nomF)
      If .[C6] = "" Then
        .[D8] = 1
      Else
        .[D8] = 2
      End If
    End With
    End Sub

    bonne suite
    1. Bonjour,

      Encore moi!
      J'ai tout plein d'interrrogations :

      - je ne comprend pas l'utilité de "with sheet(nomF)" puisqu'il n'y a qu'une feuille sur laquelle opèrera la macro et sur laquelle sont situées les cellules à tester.
      - il y avait trois cas avec trois actions différentes. Peut-être que je me suis mal exprimé ou que mon énonce comportait une erreur. Le voici formulé d'une autre façon :

      SI "C6" vide, alors "D8"=1
      sinon
      si "C8" vide, alors "D8"=4
      sinon
      "D7"=2 'j'ai changé "D8" en "D7" pour visualiser car en fait il y aura trois appels de macros (les "1", "2" & "4")
      "D8"=4 'comme tu peux le voir, "D8"=4 est exécuté depuis deux endroits différents, c'est peut-être là que j'ai fait une erreur dans l'énoncé du problème !
      Fin

      J'espère ne pas abuser de ta bonne volonté, mais ce n'est pas facile d'apprendre, uniquement avec "F1" !

      Cordialement,
      GUGUSSE.
      1. Q1. l'utilité de "with sheet(nomF)" puisqu'il n'y a qu'une feuille sur laquelle opèrera la macro
        Si le code est placé dans le module de la feuille à manipuler, tu n'as effectivement pas besoin du "with sheets(nomF), les références aux cellules se feront alors sans le point par exemple [D6].value = 5 ou simplement [D6]=5
        Par contre, si le code est dans un module général (Module 1 par exemple) ou dans le module d'une autre feuille, il est indispensable d'indiquer dans quelle feuille on va opérer, tu as alors le choix entre
        sheets(nomF).[D6] ou sheets(nomF).Range("D6") ou sheets(nomF).cells(6,4)
        sheets(1).[D6] ou ...
        activesheet.[D6] ou ...
        comme il va y avoir pas mal d'accès à la feuille de travail, on précise une fois pour toutes la feuille avec with sheets(nomF), les références aux cellules sont alors précédées d'un point .[D6]
        ne pas oublier le end with à la fin du traitement
        RQ. le fait de mettre le nom de la feuille dans une constante (Const nomF = "Feuil1"), permet en cas de changement du nom de la feuille de n'intervenir qu'une fois, en début de code

        Q2. SI "C6" vide, alors "D8"=1
        sinon
        si "C8" vide, alors "D8"=4
        sinon
        "D7"=2 '
        pas très clair
        est ce qu'on doit lire
        Si C6=""   
        alors   
          D8=1   
        sinon   
          si C8=""   
          alors   
            D8=4   
          sinon   
            D7=2   
          fin (du 2° si)   
        fin (du 1° si

        s'écrira
        if [C6] = "" then   
          [D8] = 1   
        else   
          if [C8]="" then   
            [D8]=4   
          else   
            [D7]=2   
          end if   
        end if

        RQ. il faut soigner la mise en page du code en "indentant" (décalant) les blocs de code selon leur "niveau"
        bonne suite
        1. Bonjour,

          J'apprécie ta patience.
          Le langage écrit joue bien des tours si on ne le connais pas parfaitement !
          (je me suis encore mal exprimé, il manque une "écriture" à la fin).
          Essayons une autre méthode :

          https://www.cjoint.com/?BIhk3U5rV3C

          Est-ce limpide ?
          Cordialement,
          GUGUSE.
          1. Si tu veux que dans le cas ou C6<>"" et C8<>"", Macro3 soit exécutée APRES Macro2, il n'y a rien à faire

            sinon (mais ce n'est plus le même organigramme)

            si C6=""  
            alors   
              Macro1  
            sinon  
              Macro3  
              si C8 <> ""  
              alors  
                Macro2  
              fin  
            fin

            bon courage
            1. Bonjour,
              J'ai pas tout compris, mais cela ne fait rien, j'appellerai deux fois ma macro !

              Pour en revenir à mon problème précédent (amélioration d'un graphique), comme j'avance peu à peu, je me suis dit qu'un graphe qui ne prendrait que les plages renseignées serait un plus (ta solution N° 4).
              Seulement, voilà, j'ai des problèmes pour donner le nom : rien ne correspond à ce que tu écrit.

              https://www.cjoint.com/?BIhn2EF00Uv

              Et comment donner ces noms au plages du graphique ?
              Je travaille avec Excel 2007 et peut-être ne pourras-tu pas me donner la démarche.

              Encore merci de ta patience.
              Cordialement,
              GUGUSSE.
              1. 1. quand je dis : Si tu veux que dans le cas ou C6<>"" et C8<>"", Macro3 soit exécutée APRES Macro2, il n'y a rien à faire , c'est pour dire que ce que tu as écrit est la seule solution
                2. pour les poulies, quelques explications supplémentaires pour définir les plages de données du graphique
                https://www.cjoint.com/?3IhquZlpxPC

                bonne suite
                1. Bonjour,
                  Merci pour tout, tout fonctionne, mais le fichier commence à être un sapin de noël vu les appels aux différentes pages !

                  J'ai quand même galéré un max pour définir mes plages dynamiquement et créer le graphe qui va avec : cela tenait plus des compétences de Mac GYVER que d'un pro du VBA ! (changement de nom de ton fichier, copie des codes des plages et valeurs dans word, modification (il ne voulait qu'un nom de feuille et pas de classeur !)de ces codes (plus facile que dans Excel !) et réintroduction des codes= OUF !

                  Tu comprendra que parfois je ne fais pas exprès de ne pas comprendre.

                  En ce qui concerne mon algorithme, j'ai trouvé la solution :

                  si C6 vide
                  alors D8 = "copie 1"
                  sinon
                  si C8 non vide
                  alors D7 = "transfert 2"
                  fin
                  D8 = "copie 3"
                  fin

                  A+,
                  cordialement,
                  GUGUSSE