IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Mettre à nul toutes les valeurs d'un champ sauf la première et la dernière - amélioration?


Sujet :

VBA Access

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 339
    Points : 229
    Points
    229
    Par défaut Mettre à nul toutes les valeurs d'un champ sauf la première et la dernière - amélioration?
    Bonjour,

    Je suis en train de préparer un recordset pour l'exportation vers une feuille excel précise.
    Dans un champ donné de mon recordset, j'ai (par exemple) les 10 premiers enregistrements null, suivis d'une série de 50 enregistrements non null, suivis de 60 enregistrements null.
    Je souhaiterai garder la valeur du 11ème enregistrement, mettre à null les valeurs des enregistrements 12 à 59, garder la valeur du 60ème enregistrement.

    J'ai essayé avec les bookmark (pour me repositionner sur les données à conserver et "nullifier" le reste) mais je n'arrive pas à maîtriser cela.
    Pour l'instant, j'ai écrit ceci où je défini deux "compteurs" (Positionfirst et PositionLast):
    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
     
                Positionfirst = 0
                Positionlast = 0
                    'on cherche la première et la dernière valeur non nulle du champ
                    Do While Not rec.EOF
                        If IsNull(rec.Fields(j)) Then
                            Positionfirst = Positionfirst + 1
                            If Positionlast <> 0 Then Exit Do 'la fois suivante où la donnée sera nulle c'est quand on a dépassé la date d'émergence
                        End If
                        Positionlast = Positionlast + 1
                        If IsNull(rec.Fields(j)) And Positionfirst <> 0 Then
                            Positionlast = Positionlast - 1
                        End If
                        rec.MoveNext
                    Loop
     
                    'on se repositionne au début du recordset
                    rec.MoveFirst
                    i = 0
                    'on va effacer les valeurs non utiles entre cette première et la dernière valeur non nulle
                    Do While Not rec.EOF
                        i = i + 1
                        If i = Positionfirst Then
                            rec.Edit
                            rec.Fields(j).value = 35
                            rec.Update
                        End If
     
                        If i > Positionfirst And i < Positionlast Then
                            rec.Edit
                            rec.Fields(j).value = Null
                            rec.Update
                        End If
     
                        If i = Positionlast Then
                            rec.Edit
                            rec.Fields(j).value = 35
                            rec.Update
                        End If
     
                        rec.MoveNext
                    Loop
    Ca fonctionne mais ce n'est pas très élégant je trouve... Si vous avez des suggestions pour améliorer le code, je suis preneur. Surtout qu'en final, je vais devoir faire la même chose pour plus de 20 champs contenant chacun plus de 500 enregistrements non null disposés de la même façon (mais à des "niveaux différents") que l'exemple que je vous donne.

    Un grand merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,

    Une suggestion, à tester (sur une copie de la bdd):
    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
        Dim bIsNull As Boolean, vValue As Variant
     
        bIsNull = True
        vValue = Null
        With rec
            Do While Not .EOF
                If IsNull(.Fields(j)) Then      '--- actuel Null
                    bIsNull = True
                    If IsNull(vValue) Then
                        '--- continuer (rien à changer)
                    Else
                        '--- remettre valeur sur enregistrement précédent
                        '--- (Nullé alors qu'il n'aurait pas du l'être)
                        .MovePrevious
                        .Edit
                        .Fields(j).Value = vValue
                        .Update
                        '--- revenir sur enregistrement en cours
                        vValue = Null
                        .MoveNext
                    End If
                Else                            '--- actuel non Null
                    If bIsNull Then                 '--- champ précédent vide
                        bIsNull = False
                        '--- et continuer (rien à changer)
                    Else                            '--- champ précédent non vide
                        vValue = .Fields(j).Value
                        .Edit
                        .Fields(j).Value = Null
                        .Update
                    End If
                End If
                .MoveNext
            Loop
        End With
    Cordialement.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 339
    Points : 229
    Points
    229
    Par défaut
    Bonjour EricDgn,

    Ca me semble réaliste ce que tu proposes Je vais tester cela dans la semaine et reviens vers toi pour un feedback.
    Merci pour ton aide.

    Cordialement

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 339
    Points : 229
    Points
    229
    Par défaut
    Bonjour EricDgn,

    Et bien tout simplement merci! Ca fonctionne pile-poil!! J'ai intégré ton code (avec une petite modif) dans ce post.

    Encore merci pour ton aide!!
    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [A-03] Requête avec toutes les valeurs d'un champ
    Par badeux dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/10/2008, 11h22
  2. Réponses: 7
    Dernier message: 30/01/2008, 17h39
  3. nombre d'occurences de toutes les valeurs d'un champ
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/01/2008, 20h31
  4. Réponses: 8
    Dernier message: 13/07/2007, 11h05
  5. Requete SELECT : prendre toutes les valeurs pour 1 champ
    Par fab22montpellier dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/09/2005, 09h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo