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. 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
    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,
        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. 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'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. 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,

                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. 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