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 :

Dans une table, copier une valeur dans les cellules vides suivantes [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut Dans une table, copier une valeur dans les cellules vides suivantes
    Bonjour

    Je cherche à l'aide d'un code vba à obtenir le résultat suivant.

    Dans un table j'ai une colonne qui contient des cellules vides, des valeurs numériques et d'autres un texte "///".
    Le mecanisme que je souhaite est le suivant.
    Attendre la première valeur numérique et la recopier dans toutes les cellules vides placées sous elle.

    Nom : StSym.jpg
Affichages : 171
Taille : 31,7 Ko


    Espérant avoir été clair.
    Merci pour votre aide.
    Cordialement.

    StSym

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 641
    Points : 34 351
    Points
    34 351
    Par défaut
    Bonjour,

    quel est l'ordre de tes enregistrements ? la notion "d'en-dessous" n'existe pas sans un ordre de tri


    Dans Access on ne parle pas de colonne mais de champs, pas de ligne mais d'enregistrement.

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 766
    Points : 14 807
    Points
    14 807
    Par défaut
    Bonsoir,
    dans la mesure où les enregistrements sont traités dans leur ordre d'arrivée dans la table (sans garantie qu'Access le fasse quand il y a beaucoup de données) il est possible de gérer des ruptures dans une boucle pour mettre à jour une table (mais il y a intérêt à sauvegarder la table avant de lancer ce type de code). De plus, ici on a une difficulté supplémentaire consistant à "bypasser" un enregistrement qui n'est pas mis à jour et qui oblige à gérer la fin de fichier. Mais c'est un défi que j'ai déjà relevé :
    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
    Function majTableau()
    Dim oRs As DAO.Recordset
    ' Gestion des ruptures
    Dim stRupture1 As String    ' pour Article
    Dim stRupture2 As String    ' pour Qty_niv01
     
    Set oRs = CurrentDb.OpenRecordset("tbl_Tableau")
     
        If Not oRs.EOF And Not oRs.BOF Then ' Si table non vide
            Do Until oRs.EOF
                ' Rupture sur Article
                If stRupture1 <> oRs.Fields("Article") Then stRupture1 = oRs.Fields("Article")
     
                ' On ne gère pas le code '////' et on passe à l'enregistrement suivant
                If oRs.Fields("Qty_niv01") = "////" Then oRs.MoveNext
                ' pour chaque MoveNext forcé, on gére la sortie de boucle
                If oRs.EOF Then Exit Do
     
                ' Rupture sur Qty_01 : on stocke la valeur et on passe à l'enregistrement suivant
                If stRupture2 <> oRs.Fields("Qty_niv01") And Not IsNull(oRs.Fields("Qty_niv01")) _
                  And oRs.Fields("Qty_niv01") <> "////" Then
                    stRupture2 = oRs.Fields("Qty_niv01")
                    oRs.MoveNext
                    If oRs.EOF Then Exit Do
                End If
     
                ' Mise à jour de l'enregistrement si Qty_ni01 est vide
                If IsNull(oRs.Fields("Qty_niv01")) Then
                    oRs.Edit
                    oRs.Fields("Qty_niv01") = stRupture2
                    oRs.Update
                End If
                oRs.MoveNext
            Loop
     
        End If
        oRs.Close
        Set oRs = Nothing
    End Function

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut
    Bonsoir

    Jean-Philippe,
    Merci pour ces précisons concernant de vocabulaire Access.
    J'avais retranscrit avec le vocabulaire Excel mon proto réalisé avec cette même application.

    Tee_grandbois
    Merci pour ta solution rapidement proposée.
    Je l'ai adaptée en apportant les modifications suivantes.

    J'ai remplacé
    Dim stRupture2 As String par Dim stRupture2 As Integer
    et
    If oRs.Fields("Qty_niv01") = "////" Then oRs.MoveNext par If oRs.Fields("Qty_niv01") = "9999" Then oRs.MoveNext

    Le résultat souhaité est bien obtenu sur un nombre limité d'enregistrement.
    Dans mon cas j'en ai environ 2 millions et le système plante comme tu l'avais prévu.
    Je vais donc scinder ces enregistrements sur plusieurs tables.

    Encore merci pour ton aide.
    Cordialement
    StSym

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 766
    Points : 14 807
    Points
    14 807
    Par défaut
    Bonsoir,
    pour le traitement de données volumineuses il y a peut-être une solution ici

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

Discussions similaires

  1. [VB.Net] Comment copier une DataRow d'une table vers une autre ?
    Par YLF dans le forum Accès aux données
    Réponses: 7
    Dernier message: 05/09/2012, 23h23
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  4. copier une table d'une bdd1 vers une bdd2
    Par passion_info dans le forum Bases de données
    Réponses: 3
    Dernier message: 30/10/2006, 18h57
  5. copier une ligne d'une table vers une autre
    Par Adren dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/08/2006, 11h54

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