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 :

Sub et boucle permettant d'inserer une fonction dans chaque champ d'une requête/table [AC-2003]


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 38
    Points
    38
    Par défaut Sub et boucle permettant d'inserer une fonction dans chaque champ d'une requête/table
    Bonjour

    je suis novice en vba pour Access.

    Je souhaiterai développer une sub qui permette d'appliquer une fonction dans chaque champ d'une requête ou mieux d'une table (bien que je ne pense pas que ça soit possible pour cette dernière option).

    J'ai essayé de me documenter sur Internet, problème; on ne peut pas dire que la doc fait foison (contrairement à VBA pour Excel):

    En fait il faudrait 4 éléments:

    La désignation de la table/requête
    Une variable contenant la fonction.
    Une/des variables contenant les variables de la fonction
    Et bien sûre une boucle sur les champs de la requête/table

    ça serait sur Excel je me débrouillerai, mais là le VBA pour Access m'échappe un peu pour l'instant...

    Merci d'avance pour votre aide

    Cordialement

  2. #2
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,

    Qu'appelle tu "appliquer une fonction dans chaque champ"...??

    Ton but est-il simplement de modifier une donnée par une autre et ceci dans plusieurs enregistrements d'une table...?

    Si tel est le cas interresse toi au requête de Mise à jour..

    Dans la .....Exécuter une requête action (ajout, suppression ou mise à jour)

    Dans les tutos : Définition et manipulation de données avec DAO

    A voir....
    FreeAccess
    "Petit à petit l'araignée tisse sa toile"

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Merci FreeAccess pour tes liens, je vais les consulter de ce pas.

    Sinon,

    Pour mieux illustrer ma demande,

    Imaginons une requête avec les champs suivants:

    Fournisseur / CodeFRS / Regroupement / Catégorie / Famille

    J'applique une fonction sur mon premier champs

    FournisseurT: IIf(isnull([Fournisseur]);0;[Fournisseur])

    Cette fonction est fastidieuse à reprendre sur chaque champs (Imaginez que vous ayez plusieurs centaines de champs à traiter!!!).

    Ce que je souhaiterai, c'est avoir une Sub qui applique pour chaque champs de ma requête la fonction annoncée ci dessus

    Merci pour vos réponses

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 265
    Points : 19 434
    Points
    19 434
    Billets dans le blog
    63
    Par défaut
    Salut,

    avec nz disponible sous Access ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FournisseurT: nz([Fournisseur]);0)
    Et Avec DAO comme proposé par FreeAccess:

    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
    Dim rs As Recordset
     
    Set rs = CurrentDb.OpenRecordset("Table1")
     
    While Not (rs.EOF)
     
    rs.Edit
     
    'met à jour les 20 premiers champs avec la fonction nz
    For i = 0 To 19
    rs.Fields(i).Value = nz(rs.Fields(i).Value,0)
    Next i
     
    rs.Update
     
    rs.MoveNext
     
    Wend
     
    rs.Close
    Set rs = Nothing
    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Merci USER la Sub fonctionne au poil!!

    Une dernière question, si on applique une boucle de manière à ce que la sub prenne l'ensemble des tables de la base;

    quelle serait l'instruction pour exclure les tables système?

    Merci pour vos réponses

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 265
    Points : 19 434
    Points
    19 434
    Billets dans le blog
    63
    Par défaut
    Salut,

    Les tables systèmes son en lecture seule.

    Ca doit te donner un code comme ça ( inspiré des sources):

    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
    Dim T As DAO.TableDef
    Dim rs As DAO.Recordset
     
    For Each T In CurrentDb.TableDefs
     
    'Verifie si c'est une table système
     
       If (T.Attributes And dbSystemObject) = 0 Then
     
       Set rs = CurrentDb.OpenRecordset(T.Name)
     
       While Not (rs.EOF)
     
       rs.Edit
     
       'met à jour les 20 premiers champs avec la fonction nz
       For i = 0 To 19
       rs.Fields(i).Value = nz(rs.Fields(i).Value,0)
       Next i
     
       rs.Update
     
       rs.MoveNext
     
       Wend
     
       rs.Close
       Set rs = Nothing
     
       end if
     
    Next T
    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    J'ai écrit ça en parallèle, et ça fonctionne bien...

    Ajouts:
    Non limitation du nombre de champs:

    Exclusion des tables systèmes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Left(oTbl.Name, 4) <> "MSys"

    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
    Dim oTbl As DAO.TableDef
    Dim rs As Recordset
     
    For Each oTbl In oDb.TableDefs
     
    If Left(oTbl.Name, 4) <> "MSys" Then
     
    Set rs = oDb.OpenRecordset(oTbl.Name)
     
    Fin = rs.Fields.Count
     
    While Not (rs.EOF)
     
    rs.Edit
     
    For i = 0 To Fin - 1
    rs.Fields(i).Value = Nz(rs.Fields(i).Value, 0)
    Next i
     
    rs.Update
     
    rs.MoveNext
     
    Wend
     
    End If
     
    Next oTbl
     
    rs.Close
    Set rs = Nothing
     
    End Sub
    Enfin je viens de lire ton code; je me demande si ma manière d'exclure les tables systèmes n'est pas risquée, contrairement à ta manière de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (T.Attributes And dbSystemObject) = 0
    De même je remarque que ta boucle de table se termine après rs.close; y'a t'il des conséquences?

    Qu'est ce que vous en pensez?

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 265
    Points : 19 434
    Points
    19 434
    Billets dans le blog
    63
    Par défaut
    Salut,

    pour le test je te conseil le mien, je l'ai pris dans la faq

    De même je remarque que ta boucle de table se termine après rs.close; y'a t'il des conséquences?
    Je n'ai pas testé mon code, mais je te conseil de faire comme moi, en gros ca ressemble à çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       If (T.Attributes And dbSystemObject) = 0 Then
     
       Set rs = CurrentDb.OpenRecordset(T.Name)
     
       While Not (rs.EOF)
       ...
       Wend
     
       rs.Close
       Set rs = Nothing
     
       end if
    je libère la variable rs après l'avoir utilisé et en vu de l'ouvrir pour une prochaine table.

    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 73
    Points : 38
    Points
    38
    Par défaut
    Merci pour votre aide.

    Sujet résolu

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2012, 23h01
  2. Réponses: 13
    Dernier message: 09/04/2007, 13h20
  3. passer une fonction dans un parametre d'une propriété de classe
    Par CAML dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 06/08/2006, 19h52
  4. [VB6] Appel d'une fonction dans un module d'une dll
    Par speedster dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/06/2006, 17h37
  5. Réponses: 14
    Dernier message: 16/05/2006, 11h26

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