[VBA excel] mise en forme conditionnelle

Fermé
pol_38 - 16 juil. 2007 à 14:48
Papou93 Messages postés 146 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 5 juin 2012 - 18 juil. 2007 à 20:26
Bonjour a tous,

Je cherche a faire en VBA l'equivalent d'une mise en forme conditionnelle mais en faisant porter ma condition sur une plage de donnes situee dans une autre feuille que celle utilisee (ce que, a ma connaissance, la MEFC ne sait pas faire).

Voici ce que j'ai fait comme code, ca coince au niveau du 'If' :

Sub form()
Sheets("donnes").Select

Dim i As Integer
Dim j As Integer

i = 10
j = 2

While Cells(i, 3).Value <> ""

For j = 1 To 18

If Cells(i, 3).Value = Sheets("conditions").Cells(j, 1).Value Then
Selection.Font.Bold = True
End If
j = j + 1
Next
i = i + 1
Wend

End Sub


Sans doute est-ce parceque excel ne comprends pas 'Sheets("conditions").Cells(j, 1).Value ' ???

Merci de votre aide toujours precieuse !!!

Pol
A voir également:

5 réponses

Bonjour Pol_38,

Essaies ce code modifié :

Sub form() 
Dim i As Integer 
Dim j As Integer 

i = 10 
j = 2 

With Sheets("donnes")
  While .Cells(i, 3).Value <> "" 
    For j = 1 To 18 
      If .Cells(i, 3).Value = Sheets("conditions").Cells(j, 1).Value Then 
        Selection.Font.Bold = True 
      End If 
    j = j + 1 
  Next 
i = i + 1 
Wend 

End Sub 

Cordialement.
0
pol_38 Messages postés 5 Date d'inscription lundi 5 mars 2007 Statut Membre Dernière intervention 18 juillet 2007
16 juil. 2007 à 16:35
Bonjour Papou,

Ca ne marche pas, il coince toujours a la formule If...
Le probleme ne viendrait-il pas du fait que Sheets (''conditions'') n'est pas active?

cordialement

Pol
0
Re-bonjour pol_38,

Chez moi ça fonctionne, j'ai testé que même s'il n'y a rien dans les 3 premières colonnes, le résultat affiche 12 zéros.
Il n'est pas nécessaire d'activer les feuilles pour manipuler les cellules.
As-tu essayé de lancer la macro en mode débogage afin de pouvoir tester les variables ?
si tu le veux, tu peux m'envoyer ton fichier (sans données confidentielles, bien sûr !) à l'adresse suivante :

papou79@hotmail.fr

Cordialement.
0
Excuses-moi pol_38,

J'ai confondu avec un autre poste.
Il fallait lire :

Il n'est pas nécessaire d'activer les feuilles pour manipuler les cellules.
As-tu essayé de lancer la macro en mode débogage afin de pouvoir tester les variables ?
Si tu le veux, tu peux m'envoyer ton fichier (sans données confidentielles, bien sûr !) à l'adresse suivante :

papou79@hotmail.fr

Cordialement.
0
Papou93 Messages postés 146 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 5 juin 2012 59
17 juil. 2007 à 08:32
Bonjour po_38,

Je reviens sut ton programme que j'ai eu le temps d'analyser.
J'ai 2 questions à te poser :
1- Sur quelle feuille veux-tu passer les cellules en gras ?
2- Pourquoi incrémenter 'j' à l'intérieur de la boucle 'For j ...' (ne faudrait-il pas mieux descendre cette ligne sous le 'next') ?
Et une remarque :
Dans ta condition 'If ... Then', remplace selection par l'adresse de la cellule que tu veux passer en gras, sinon c'est toujours la même cellule (l' active) que tu formates.

Ne serait-ce pas plutôt ce que tu cherches ?

Sheets("donnes").Select <---> cette ligne n'est pas nécessaire

Dim i As Integer 
Dim j As Integer 

i = 10 
j = 2 

While Cells(i, 3).Value <> "" 
  For j = 1 To 18 
    If sheets("donnes").Cells(i, 3).Value = Sheets("conditions").Cells(i,j).Value Then 
      Sheets("feuille").cells(cellule).Font.Bold = True 
    End If 
  Next 
j = j + 1
i = i + 1 
Wend 

Remplaces les mots soulignés par les adresses voulues (l'avantage de mentionner les noms des feuilles est que ta macro peut s'effectuer depuis n'importe quelle feuille).

Espérant avoir pu t'aider.

Cordialement.
0
Hello Papou,

Ca bug toujours au meme endroit malgre les modifs...j'ai pourtant egalement modfie le code : For j = 2 To 18, vu que mes conditions commencent a la ligne 2.

Par rapport a tes questions:

1. Je veux passe en gras les cellules de la feuille "donnes", situees ds la colonne C
2. je voulais en incrementant 'j' faire parcourir la liste des 17 "conditions" pour chaque ligne 'i' de la feuille "donnes"

J'essaie de mieux decrire mon cas:

- dans la feuille "donnes", une liste de donnes mises a jour quotidiennement
- dans la feuille "conditions", une liste de 17 donnes constantes inscrites dans les cellules A2->A18
- But = mettre en gras les donnes de la feuille 'donnes' si un d'elle se trouve parmis les 17 de la feuille "conditions"


Merci de ton aide, je debute en VBA et ce n'est pas toujorus evident de trouver des infos :-)

cordialement

Pol
0
Papou93 Messages postés 146 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 5 juin 2012 59
17 juil. 2007 à 12:01
Re-bonjour pol,

Tes explications m'ont davantage éclairé, je t'envoie donc une nouvelle version qui fonctionne, je l'ai testée.
Dans cet exemple, les cellules de la feuille 'donnes' sont en colonne 'C', celles de la feuille 'conditions' vont de 'A2' à A18'.
Comme (selon toi) tu débutes, je me suis permis de commenter abondamment le code.
Tu remarqueras également que cette macro fonctionne aussi en cas de modification de cellules déjà renseignées, ce qui n'était pas le cas avant (Rajout d'un 'Else' dans l'If ... Then'.

Private Sub MiseEnGras()
Dim d As Integer ' 1ère occupée sur feuille "donnes"
Dim f As Integer ' dernière ligne occupée sur feuille "donnes"
Dim L1 As Integer ' fait référence aux lignes de la feuille "donnes"
Dim L2 As Integer ' fait référence aux lignes de la feuille "conditions"

' définit la 1ère ligne à analyser sur feuille "donnes"
d = 10

' calcule la dernière ligne occupée sur feuille "donnes"
1 f = Cells(65536, 3).End(xlUp).Row

' 1ère ligne remplie sur feuille "conditions"
j = 2

With Sheets("conditions") ' évite de mentionner le nom de la feuille "conditions"
' dans les références de cellules.
' Ex: .cells(L,C) fait référence à la cellule de ligne 'L' et de colonne 'C'
' de la feuille mentionnée dans le "with"

  For L1 = d To f ' balayage des lignes renseignées sur feuille "donnes"
    For L2 = j To j + 17 ' balayage des lignes renseignées sur feuille "conditions"
      If .Cells(L2, 1) = Cells(L1, 3) Then
        Cells(L1, 3).Font.Bold = True
        Exit For ' sort de la boucle à la 1ère condition remplie (évite de perdre du temps)
        Else
        Cells(L1, 3).Font.Bold = False
      End If
    Next
  Next
End With

End Sub


J'ai nommé cette macro 'MiseEnGras', et tu peux l'exécuter automatiquement en la rangeant dans l'événemént 'SelectionChange' de la feuille 'dooes' par exemple :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MiseEnGras

End Sub


ou en la mettant dans l'événement 'Click' d'un bouton de commande.

Espérant cette fois avoir tout compris.

Cordialement.
0
pol_38 Messages postés 5 Date d'inscription lundi 5 mars 2007 Statut Membre Dernière intervention 18 juillet 2007
18 juil. 2007 à 18:24
Salut Papou,

Super ca marche a la perfection, et en plus en un temps record pour un fichier de pres de 10Mb et comportant + de 1000 lignes!

Un tout grand merci, non seulement ca marche mais en plus tes explications precises m'ont permis de bien comprendre le fonctionnement de ce code!

Autre petite question: connais des sites, parutions, livres etc. qui peuvent m'aider a progresser en VBA (surtout pour l'espect base de donnees)??

Avec nottament des exemples de codes commentés, ce qui est vraiment le top pour bien comprendre?

Cordialement

Pol
0

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

Posez votre question
Papou93 Messages postés 146 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 5 juin 2012 59
18 juil. 2007 à 20:26
Bonsoir Pol,

Voici rapidement 3 bons sites sur Ecxel et VBA :

http://www.cathyastuce.com/excel.htm
http://dj.joss.free.fr/
http://www.info-3000.com/vbvba/index.php

Ainsi que 2 ouvrages que je possède :

- Excel et VBA des Éditions CampusPress
- VBA pour microsoft Office pour las Nuls
mais il en existe bien d'autres que l'on trouve aisément sur le marché(certains hypermarchés, Fnac ...).
Une piste à explorer également, si ta commune en possède une : la bibliothèque communale.

Pour ma part, après des débuts difficiles, je me suis surtout autoformé en pratiquant l'enregistreur de macros d' Excel, ainsi qu'en consultant des forums au hasard (c'est ainsi que je suis tombé sur celui-ci, qui soit-dit en passant, est l'un des meilleurs).

Bonne recherche et bon courage (pratiquer, toujours pratiquer !)

Cordialement.
0