Problème avec les cellules vides !

Résolu/Fermé
GUGUSSE2 Messages postés 72 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 1 février 2017 - Modifié par GUGUSSE2 le 6/09/2012 à 18:08
GUGUSSE2 Messages postés 72 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 1 février 2017 - 8 sept. 2012 à 11:54
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

ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
6 sept. 2012 à 20:17
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
0
GUGUSSE2 Messages postés 72 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 1 février 2017 7
6 sept. 2012 à 20:55
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.
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
Modifié par ccm81 le 7/09/2012 à 10:10
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
0
GUGUSSE2 Messages postés 72 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 1 février 2017 7
7 sept. 2012 à 11:01
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
7 sept. 2012 à 11:15
tout à fait limpide

https://www.cjoint.com/?3Ihln0LHQEZ

bonne suite
0
GUGUSSE2 Messages postés 72 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 1 février 2017 7
Modifié par GUGUSSE2 le 7/09/2012 à 11:41
Salut,

Il manquait une liaison (voir pièce jointe).
Y a-t-il un moyen plus élégant que d'appeler deux fois
la même macro (symbolisée dans l'exemple par D8=3) ?

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

Sinon, ça marche !
A+,
GUGUSSE.
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
Modifié par ccm81 le 7/09/2012 à 11:58
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
0
GUGUSSE2 Messages postés 72 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 1 février 2017 7
7 sept. 2012 à 13:55
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.
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
7 sept. 2012 à 16:22
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
0
GUGUSSE2 Messages postés 72 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 1 février 2017 7
8 sept. 2012 à 11:54
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
0