Bonjour,

Après quelques recherches, je commence à penser que ce que je souhaite faire n'est pas possible, mais j'aimerais en avoir la confirmation.

Dans un formulaire continu, par défaut Access alterne la couleur de fond à chaque enregistrement. Je voudrais que cette alternance ait lieu à chaque fois que la valeur d'un enregistrement est différente du précédent.

J'ai fait une tentative avec l'évènement Détail_Paint(), mais ça fait comme un Refresh permanent qui semble utiliser beaucoup de ressources. En plus de ça, étonnamment, en mode debug je n'ai pas réussi à interrompre l'exécution du code en cours : quand je clique sur "Réinitialiser" (le petit carré bleu), le programme continue de tourner et s'arrête au prochain point d'arrêt.

Pour info, voici le code essayé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
Public lngCouleurPrec As Long
 
Private Sub Détail_Paint()
 
On Error GoTo Err_Previous
    Dim strPrecedent As String
    Dim rstClone As DAO.Recordset
    Dim strBookmark As String
    Dim lngCouleurPrec As Long
 
    With Me.Form
        Set rstClone = .RecordsetClone
        strBookmark = .Bookmark
        rstClone.Bookmark = .Bookmark
    End With
 
    ' Si premier enregistrement du recordSet
    If rstClone.BOF Then
        ' Obtient la couleur de fond
        lngCouleurPrec = Me.Section("Détail").BackColor
    ' Sinon se déplace au précédent
    Else
        rstClone.MovePrevious
        ' Lit valeur précédent
        strPrecedent = rstClone.Fields("Champ1")
        ' Re-synchronise bookmark
        Me.Form.Bookmark = strBookmark
    End If
 
    ' Si, dans l'enregistrement courant, le champ a la même valeur que le précédent
    If rstClone.Fields("Champ1") = strPrecedent Then
 
        With Me.Section("Détail")
            ' Applique la même couleur comme couleur de fond
            .BackColor = lngCouleurPrec
            ' Supprime l'alternance de couleur
            .AlternateBackColor = .BackColor
        End With
    Else
        With Me.Section("Détail")
            .BackColor = .AlternateBackColor
            lngCouleurPrec = .AlternateBackColor
        End With
    End If
 
Exit_Previous:
      Exit Sub
 
Err_Previous:
      If Err.Number <> 3021 Then    'Not at the 1st or New Record
        MsgBox Err.Description, vbExclamation, "Error in Previous()"
      End If
        Resume Exit_Previous
End Sub
Je suppose qu'initialiser puis fermer un recordset dans un évènement Paint() n'est pas une bonne idée. Est-ce que créer un Recordset public, initialisé par Form_Load() pourrait améliorer le résultat ? Je vais essayer, mais je n'y crois pas trop.