Access vba : aide pour fonction de coloriage

Résolu
Bonjour,

Je cherche toujours à mettre en gras le contenu de champs en fonction de sa valeur. Pour cela, j'ai écrit la fonction suivante, que je lui demande d'utiliser à l'ouverture de mon formulaire :

Public Function coloriage()

If Forms![F - Ratios]![Sac ou Gaine] = "TOTAL" Then
Forms![F - Ratios]![Sac ou Gaine].FontBold = True
End If
End Function

Le problème est qu'il ne se passe rien. la syntaxe ne le choque pas, mais il ne fait rien. Alors je m'interroge.
Est-ce que comme le contenu de mon formulaire est long il faut que je fasse une boucle (sachant que cela représente une bonne dizaine de lignes à colorer) ?
Et dans ce cas laquelle ?
J'ai essayé avec DO LOOP, mais d'une part ça ne donne rien, et d'autre part, j'ai lu quelque part sur le web (ça fait un moment que je cherche) que la boucle s'arrêtait dès qu'il trouvait la bonne valeur, alors que je veux qu'il balaye l'intégralité de la colonne.

Je continue à chercher, mais si l'un de vous avait la possibilité de m'orienter dans la bonne direction (je ne demande pas forcément la solution complète), cela m'aiderait à avancer.

Merci d'avance
--

Arzawe
Configuration: Windows XP
Internet Explorer 6.0

10 réponses

  1. Bonjour,

    - je viens de tester vite fait, et ça marche... Mais pour les besoins du test, j'ai mis le code en direct sur l'évènement ouverture de formulaire...comme ça :

    Private Sub Form_Open(Cancel As Integer)
    Me![Sac ou Gaine] = "TOTAL"
    End Sub

    Private Sub Sac_ou_Gaine_GotFocus()
    If Me![Sac ou Gaine] = "TOTAL" Then
    Me![Sac ou Gaine].FontBold = True
    End If
    Me!Commande2.SetFocus
    End Sub

    - quel est le type de champ que tu veux mettre en gras? Une zone de texte, une étiquette?
    - comment initialises-tu ce champ? Est-ce qu'il ne prend pas la valeur TOTAL après que tu aies lancé ton script?
    1
    1. Ce sont des zones de textes isses d'une table dans laquelle mes calculs ont déjà été faits. Donc la fonction doit s'exécuter à l'ouverture du formulaire.

      En fait je pourrais les produire dans un état, mais ma chef veut que ce soit un formulaire. La valeur Total est définie avant l'ouverture de la table, par un bouton qui lance toute une série de calculs. Et chaque ligne Total correspond à des sommes en fonction de divers critères. Donc mon formulaire doit afficher des lignes en gras, et des lignes en normal.

      Je vais essayer ton code, mais j'ai juste une question : comme je ne veux pas copier bêtement, je souhaiterais comprendre : Pourquoi 2 private sub ? A quoi correspond la première ? Elle s'éxécute à l'ouverture du formulaire, mais pourquoi juste une ligne à l'intérieur ? A quoi sert le deuxième ? A quoi correspondes gotfocus et setfocus ?

      Merci de ton aide
      0
  2. J'ai un pu avancé. Pour faire une boucle, il faut, si j'ai bien compris un nombre d'exécution qui sert de compteur. Moi je veux que le compteur soit le nombre d'enregistrements. Comment récupérer ce nombre et ensuite compter mes enregistrements dans la table?
    0
    1. Ah, ces chefs...lol

      J'ai mis deux petites procédures pour simuler ton problème... la première, à l'ouverture du formulaire pour initialiser la zone de texte Sac ou Gaine, la seconde, c'est lorsque la dite zone reçoit le focus (est sélectionnée), elle fait le test et se met en gras, ensuite j'ai juste mis un contrôle sur lequel j'envoie le focus pour déselectionner la zone de texte et vérifier qu'elle est bien en gras!! (sinon si elle reste sélectionnée, je n'y voyais rien... lol)

      Je viens de tester ça :
      Private Sub Form_Open(Cancel As Integer)
      If Me![sac ou gaine] = "TOTAL" Then
      Me![sac ou gaine].FontBold = True
      End If
      End Sub

      ...et ça marche... Je pense que le problème vient de l'appel de la fonction que tu définis. Essaye comme ça et dis voir ce qui se passe :-)

      0
      1. J'ai essayé les deux procédures que tu m'as indiquées : pour les deux, il ne dit rien, mais ne fait rien non plus.

        Mais je ne désespère pas de trouver
        0
    2. Bizarre... lol

      As-tu essayé de mettre des points d'arrêt, pour voir ce qui se passe dans ton code?

      Je sais que c'est pas simple, mais peux-tu mettre un exemple en ligne?
      0
      1. En fait, il fait comme s'il en reconnaissait pas les champs, ou plutôt comme s'il ne les voyait pas. Pour la première fonction : il ne sait pas de quoi je parle genre c'est quoi ce Me.
        J'ai remplacé Me par Forms![F - Ratios]![Sac ou Gaine] et là il me dit Erreur d'exécution 2448 : Impossible d'attribuer une valeur à cet objet.

        La deuxième fonction il ne dit strictement rien.

        J'ai essayé hier soir à la maison sur une base bidon, avec une pauv'table sur dans laquelle j'ai bêtement rentré des données, et là la deuxième procédure que tu m'as indiquée a fonctionné. Grrrrrrrr!

        C'est peut-être que c'est tout bêtement dans les propriété de mes contrôles.

        Je continue à bidouiller, et je te tiens au courant.

        Je n'ai pas le droit de faire sortir ma base de mon bureau, même avec ma clé usb, alors la mettre sur le net pour un exemple...
        0
      2. Private Sub Sac_ou_Gaine_Enter()
        If Me![sac ou gaine] = "TOTAL" Then
        Me![sac ou gaine].FontBold = True
        End If

        End Sub

        Voilà ce que j'ai mis directement sur mon contrôle [Sac ou Gaine]. En première apparence, il ne fait rien. Si je clique sur une des données de la colonne concernée, il me met toute la colonne en gras, même ce que je ne veux pas voir en gras.
        Mais là je trouve qu'on avance
        0
      3. Je viens d'avoir une idée : si je fais une boucle. Est-ce que tu crois que c'est possible? Ainsi, il prendrait en compte la valeur de chaque enregistrement et non pas la colonne entière.
        Mais par contre, je ne sais pas quelle boucle utiliser
        0
    3. Otes-moi d'un doute... tu affiches ton formulaire en mode données ou formulaire? Parce que ça change tout... lol

      Moi j'ai fait les tests en mode formulaire...
      0
      1. Je passe bien en mode formulaie pour faire mes tests : je ne suis pas douée, mais il ne faut quand même pas exagérer...
        :-)
        0
    4. Non, non je me moquais pas, loin de là... juste que les procédures ci-dessus marchent bien en mode formulaire, mais pas du tout en mode feuilles de données...:-)

      Et justement, en mode feuille de données, j'ai mis ce code :
      Private Sub Form_Load()
      Me![sac ou gaine] = "total"
      Me![Texte2] = "toto"
      If Me![sac ou gaine] = "total" Then
      MsgBox "toto"
      Me![sac ou gaine].FontBold = 1
      End If
      End Sub

      Le msgbox est juste là pour qu'il se passe quelque chose!! lol

      En regardant les variables pas à pas, on voit bien la valeur fontbold de sac ou gaine passer de 0 à 1, par contre il ne se passe rien à l'écran (encore une fois en mode données...), je me demande pourquoi...

      Je continue à chercher :-)
      0
      1. J'ai essayé un autre truc

        Public Function coloriage()

        Dim bdd As Database
        Dim RstRatio As Recordset
        Dim RaTio As TableDef
        Dim SG

        Set bdd = CurrentDb
        Set RaTio = bdd.TableDefs("Ratios")
        Set RstRatio = bdd.OpenRecordset("Ratios")
        Set SG = RstRatio![Sac ou Gaine]

        Select Case SG
        Case "TOTAL"
        Forms![F - Ratios]![Sac ou Gaine].FontBold = True
        Case Else
        Forms![F - Ratios]![Sac ou Gaine].FontBold = False
        End Select

        End Function

        Mais là pareil, il ne me fait rien. Pourtant, je suis assez contente de moi, ça me semblait bien propre mon code :-)
        0
      2. Alors, si je le mets dans un Private Sub à l'ouverture, il ne fait rien, quand je le mets dans une fonction que je lance par macro à l'ouverture, il ne fait rien, mais si je l'exécute avec le formulaire déjà ouvert, il me met toute la colonne en gras.

        Ce n'est pas encore tout à fait ce que je veux, mais au moins j'ai l'impression d'avancer.
        0
      3. Une petite expérience avec des msgbox montre qu'il n'arrive pas à lire la première partie de mon Case, celle où il est question de Total.
        0
    5. Re :-)

      Tu peux faire une copie d'écran de ton formulaire, que je reproduise ça dans une base factice..., histoire de parler de la même chose :-)
      0
      1. Tu vas rire... jaune :-)

        Dans ton formulaire en mode feuille de données, clic sur un cellule de ta colonne Sac ou Gaine, puis Format/Mise en forme conditionnelle, dans condition 1 tu mets Valeur de champ, puis egal à, et tu tapes "TOTAL" (avec les guillemets), puis tu choisis gras (et rouge, tant qu'à faire!! lol) puis tu valides par OK...

        Et hop!!
        0
        1. Je suis dégoutée : mais bon, j'ai au moins appris à faire des boucles, à m'arrêter à chaque enregistrement.
          Maistenant, il faut que toute ma ligne prenne le format souhaité.

          Merci beaucoup
          0
        2. @arzaweC'est bon : j'ai compris comment tout çamarche et j'ai mis toute ma ligne en orange.

          MERCI BEAUCOUP, BEAUCOUP, BEAUCOUP pour ton aide, pour l'utilisation de ton cerveau, et le temps que tu y as passé.

          A bientôt
          0
      2. Euh... le cerveau c'est ce truc entre les oreilles? Moi j'ai juste bossé avec mes petits doigts musclés... lol

        Content que ça aide, j'en ai appris autant que toi!!

        A refaire...
        0
        1. Non, mais regarde jusqu'où j'étais arrivée ce matin :
          Private Sub Form_Load()
          Dim bdd As Database
          Dim RstRatio, RstForms As Recordset
          Dim RaTio As TableDef
          Dim SG, Lign, i
          Dim FldSG As Field

          Set RstForms = Forms("F - Ratios").Recordset

          Set bdd = CurrentDb
          Set RaTio = bdd.TableDefs("Ratios")
          Set RstRatio = bdd.OpenRecordset("Ratios")

          Do Until RstForms.EOF
          Set SG = RstForms![Sac ou Gaine]
          Select Case SG
          Case "TOTAL"
          Forms![F - Ratios]![Sac ou Gaine].Recordset.FontBold = True

          MsgBox "Total"
          Case "S"
          Forms![F - Ratios]![Sac ou Gaine].FontBold = False
          MsgBox "bouh"
          Case "M"
          Forms![F - Ratios]![Sac ou Gaine].FontBold = False
          MsgBox "Pouet"

          End Select
          RstForms.MoveNext
          Loop

          End Sub

          Mais le résultat était seulement qu'il passait chaque ligne en revue :-(

          0
      3. Cool!!
        0
        1. Tu peux rire. Pour arriver à ce résultat en une matinée, on s'y est quand même mis à 3 !!!!! :-)
          0