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 :

[A-03] Dupliquer un champ sous un autre nom


Sujet :

VBA Access

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut [A-03] Dupliquer un champ sous un autre nom
    Bonjour,
    Je continue ici a exposer mon pb, qui a démarré sur le forum SQL, et est devenu un pb VBA.
    En résumé, il s'agit de créer un champ vide ch2 qui a les mêmes propriétés qu'un autre champ texte ch1 existant déjà dans la table.
    Je crée donc un champ par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaBd.Execute "ALTER TABLE Matable ADD COLUMN ch2 text 10"
    Maintenant, il s'agit de recopier les propriétés de ch1 dans ch2 (Merci Taoueret) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Dim WS  As Workspace
      Set WS = DBEngine.Workspaces(0)
      Dim MaBd As Database
      Set MaBd = WS.OpenDatabase(MaBase)
    MaBd.Execute "ALTER TABLE MaTable ADD COLUMN ch2 text 10"
    Set fldch1 = CurrentDb.TableDefs(Matable).Fields(Ch1)
    Set fldch2 = CurrentDb.TableDefs(MaTable).Fields(Ch2)
    Dim prp As Properties
    For Each prp In fldch1.Properties
       fldch2.Properties(prp.Name) = fldch1.Properties(prp.Name)
    Next prp
    mais une erreur se produit sur le dernier name de l'avant dernière ligne : "Membre de méthode ou de données introuvable"
    Merci de l'aide
    Amitiés

  2. #2
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut
    As-tu bien coché toutes les références nécessaires?

    essaye çà (si c'est bien ici l'erreur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set fldch2.Properties(prp.Name) = fldch1.Properties(prp.Name)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    J'ai ajouté "set" en début de ligne comme tu le suggères, mais l'erreur est tjrs là.
    Quant aux références, aucune n'est signalée manquante.
    A+

  4. #4
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut
    Et avec çà à corriger en plus?:

    puis ajoute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim fldch1 As Field
    Dim fldch2 As Field
    aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set fldch1 = CurrentDb.TableDefs("Matable").Fields("Ch1")
    Set fldch2 = CurrentDb.TableDefs("MaTable").Fields("Ch2")
    aussi pourquoi tu utilises Madb pour revenir sur CurrentDb ensuite?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    J'ai fait ce que tu as suggèré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CurrentDb.Execute "ALTER TABLE [MaTable] ADD COLUMN [Ch2] text (50)"
    Dim fldch1, fldch2 As Field
    Set fldch1 = CurrentDb.TableDefs(MaTable).Fields(Ch1)
    Set fldch2 = CurrentDb.TableDefs(MaTable).Fields(Ch2)
    Dim ValPrp As String 
    ValPrp = CurrentDb.TableDefs(MaTable).Fields(Ch1).Properties("Size")
    Set CurrentDb.TableDefs(MaTable).Fields(Ch2).Properties("Size") = ValPrp
    "ValPrp" renvoie le bonne valeur de "Size", puis il y a erreur de compilation sur "Properties("Size") de la dernière ligne, quand on veut appliquer cette valeur à la même propriété de ch2.
    Si j'enlève le "Set" de cette ligne, c'est l'erreur "opération non valide"
    Tu remarqueras que j'ai explicité fldch1 et 2, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set fldch1 = CurrentDb.TableDefs(MaTable).Fields(Ch1)
    ValPrp = fldCh1.Properties("Size")
    donne la bonne valeur de Size, alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ValPrp = CurrentDb.TableDefs(MaTable).Fields(Ch1).Properties("Size")
    qui théoriquement devrait donner le même résultat donne un eerreur.
    Je ne comprends pas pourquoi deux expressions équivalentes n'ont pas le même comportement.
    Amicalement à tous.

  6. #6
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut
    Bon j'avoue que même moi je n'y comprend rien mais bon, suis pas un pro non plus.

    Au cas où tu veux juste copier le type et la taille du champ, ceci fonctionne sans problème (j'ai testé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Copier_Champ(Bd As Database, NomTableOrig As String, NomTableCopie As String, ChampOrig As String, ChampCopie As String)
        With Bd
            .TableDefs(NomTableCopie).Fields.Append .TableDefs(NomTableCopie).CreateField(ChampCopie, _
            .TableDefs(NomTableOrig).Fields(ChampOrig).Type, _
            .TableDefs(NomTableOrig).Fields(ChampOrig).Size)
        End With
    End Sub
    appelé de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Copier_Champ(CurrentDb, "table1", "table1", "t1", "t3")

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    Merci de la suggestion, qui fonctionne bien. pour une propriété (Size ici)
    Mais je voudrais copier toutes les propriétés du champ, il faut alors pouvoir mettre les propriétés (noms, valeur) en paramètres et avec une boucle, construire la commande entre 'with db' et 'end with'.
    Ce n'est a priori pas impossible, et je vais essayer, mais je préférerais une solution plus simple, comme j'avais tenté sans succès, en récupérant les prop du champ origine et au fur et à mesure pour les passer au champ copie.
    Mais je buttais sur l'impossibilité apparente de modifier par code les prop d'un champ existant, qui ne semblent modifiables qu'en création, et là on n'est plus en création, alors que ton code est bien de la création.
    Je cherche...
    A+

  8. #8
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut
    Déjà je ne pense pas que tu puisses mettre deux champs de même noms dans une même table. Puis de toute façon, cette méthode te permet d'éviter de lancer la première requête et de copier toutes les autres caractéristiques du champ:
    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
    Private Sub Copier_Champ(Bd As Database, NomTableOrig As String, NomTableCopie As String, ChampOrig As String, ChampCopie As String)
        With Bd
            'copie du type du champ et de sa taille
            .TableDefs(NomTableCopie).Fields.Append .TableDefs(NomTableCopie).CreateField(ChampCopie, _
            .TableDefs(NomTableOrig).Fields(ChampOrig).Type, _
            .TableDefs(NomTableOrig).Fields(ChampOrig).Size)
     
            'copie valeurs par défaut
            .TableDefs(NomTableCopie).Fields(ChampCopie).DefaultValue = _
            .TableDefs(NomTableOrig).Fields(ChampOrig).DefaultValue
     
            'copie propriété notnull
            .TableDefs(NomTableCopie).Fields(ChampCopie).Required = _
            .TableDefs(NomTableOrig).Fields(ChampOrig).Required
     
            '.... ainsi de suite
        End With
    End Sub
    mais bon, c'est toi qui voit , bon courage!!

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    Bien entendu le nouveau champ a un nom différent du champ orig.
    Ce que tu suggères est bien ce que j'envisage, mais les champs à copier ne sont pas tous du même type, donc ils possédent des propriétés qui différent.

    Il faut donc d'abord connaître les prop du champ à copier, puis construire pour chaque prop (il y en a une trentaine pour un champ texte) ce que tu as fait pour 3.

    Si le contenu de la commande était une chaîne, un fichier texte construit à la demande ferait l'affaire, mais ce n'est malheureusement pas le cas.
    Il doit bien exister une astuce pour cela.
    Merci
    A+

Discussions similaires

  1. [A-03] copier un champ sous un autre nom
    Par AndréPe dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 22/01/2009, 16h18
  2. copier un signet et le coller sous un autre nom
    Par A@Lah dans le forum VBA Word
    Réponses: 2
    Dernier message: 17/01/2008, 18h05
  3. Réponses: 19
    Dernier message: 23/11/2007, 01h45
  4. Réponses: 1
    Dernier message: 25/04/2007, 16h45
  5. Réponses: 2
    Dernier message: 23/03/2007, 15h19

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