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

Macros et VBA Excel Discussion :

Modifier les titres des colonnes par vba


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 660
    Points : 165
    Points
    165
    Par défaut Modifier les titres des colonnes par vba
    Bonjour,

    J’intègre dans une table Access par « DoCmd.TransferSpreadsheet acImport » des données d’une table Excel en csv, mais certains titres des colonnes d’Excel doivent être renommés avant l’intégration des données.

    Début du code :

    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
    '--- Préparer la boîte de dialogue Ouvrir 
         Set fd = Application.FileDialog(msoFileDialogFilePicker) 
         fd.Title = "Choisissez un classeur" 
         fd.InitialFileName = "*.xls" 
         fd.AllowMultiSelect = True 
    
    '--- Personnaliser la liste déroulante Type de fichier 
         fd.Filters.Clear 
         fd.Filters.Add "Fichiers Excel", "*.xls" 
         fd.Filters.Add "Tous les fichiers", "*.*" 
         fd.FilterIndex = 1 
    '--- Ouvrir la boîte de dialogue 
         If fd.Show = 0 Then 
    '--- L'action a été annulée 
         Set fd = Nothing 
         Exit Sub 
    End If 
    
    '--- Ouverture de l'application 
         Set xlApp = CreateObject("Excel.Application") 
         xlApp.Visible = False 
    Set xlw = xlApp.ActiveWorkbook      '--- Récupération du classeur 
    par défaut 
    
    '--- Ouvrir chaque document sélectionné et le traiter 
         For Each varFichier In fd.SelectedItems 
         xlApp.Workbooks.Open (varFichier) 
    
    ***************************************
    *  Traitement pour modifier les titres des colonnes  *
    ***************************************
    '--- Passer à la partie Importation Feuille 
    
         DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "tbl Adhérents",    varFichier, True, strFeuille & "!A1:AD20000"
    Y à-t’il une solution ? Si oui comment ?

    Merci pour votre aide.

    Salutations

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut un truc du genre...
    A mettre après les remarques en rouge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Sheets("Feuil1").Range("A1").Select
        For c = 1 To Range("A1").End(xlToRight).Column
            Cells(1, c) = Replace(Cells(1, c), " ", "")
        Next c
    Les cellules utilisées commencent en "A1" sur la feuille nommée "Feuil1" et ne sont pas séparées par une colonne sans entête.
    Ici suppression des espaces.

    Euh ! Modification définitive dans le tableau Excel ?

    ESVBA

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 660
    Points : 165
    Points
    165
    Par défaut
    Bonsoir ESVBA,

    Merci pour ta réponse, j'ai essayé le code il passe bien sur les titres
    de la première ligne, mais les titres reste toujour présent.

    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
         With xlApp
     
    '--- Récupération du classeur
         Set xlClasseur = Workbooks.Open(varFichier)
     
    '--- Récupération de la feuille
         Set xlFeuille = xlClasseur.Sheets(1)
     
         xlFeuille.Range("A1").Select
     
         For c = 1 To Range("A1").End(xlToRight).Column
            Cells(1, c) = Replace(Cells(1, c), " ", "")
         Next c
     
         End With
    A+

    Salutations

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Il faut lire tout le texte
    Bien sûr qu'il passe sur toute la ligne mais simplement pour effacer les espaces dans les titres de colonnes ! Puisque que c'est le traitement que je lui ai fait faire !

    Et s'il n'y a pas d'espace à supprimer...

    J'ai supposé que le problème était la présence d'espaces dans l'entête.

    Que faut-il faire ?
    Ce n'est pas précisé dans le premier post !
    il faut modifier la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            Cells(1, c) = Replace(Cells(1, c), " ", "")
    mais comment ?

    Quel est le problème dans l'entête de colonne ?




    Autre supposition :

    Si absence d'entête de colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            If Cells(1,c) =  "" Then 
                Cells(1, c) = "Colonne" & c
            End If
    Désolé pour le suivi des posts...

    ESVBA

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 660
    Points : 165
    Points
    165
    Par défaut
    Bonjour ESVBA?

    Je voudrais comme je l'ai dit dans le premier post:

    "mais certains titres des colonnes d’Excel doivent être renommés avant l’intégration des données".

    tout simplement changer le nom des colonnes
    Par exemple la colonne NOM l’appeler NOM-A et l’autre
    colonne NOM l’appeler NOM-B parce que Access n’aime
    pas beaucoup le nom de champs identiques.

    Salutations

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Ah ah...
    les noms de colonnes sont identiques... (bizarre pour un fichier organisé !)

    voilà l'information qu'il faut dire absolument.

    donc la solution est presque dans mon post précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                Cells(1, c) = Cells(1, c) & "-" & c
    Toutes les colonnes auront un nom différent du type :
    Noms-1 Age-2 Ville-3 Noms-4 Nationalité-5 Ville-6 etc

    ça peut convenir ?
    ESVBA

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Amélioration...
    Seuls les noms identiques sont modifés :
    Noms Age Ville Noms Nationalité Ville Decede Noms maritals Noms Noms
    Noms Age Ville Noms-4 Nationalité Ville-6 Decede Noms maritals Noms-9 Noms-10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        For c = 1 To Range("A1").End(xlToRight).Column
            For C_ant = 1 To c - 1
                If Cells(1, c).Value = Cells(1, C_ant).Value Then
                    Cells(1, c).Value = Cells(1, c).Value & "-" & c 'car si >26 colonnes identiques
                End If
            Next C_ant
        Next c
    • J'ajoute le numéro de la colonne car il est unique et peut dépasser facilement 26 colonnes identiques.
    • Je modifie le moins possible de noms
    • Pour renommer tous les entêtes identiques (plus facile à repèrer), transformez : en
    • Pour renommer avec un numéro (ou une lettre) incrémental unique chaque colonne identique c'est plus difficile. Il faut retester la ligne ou mémoriser chaque dernière valeur pour chaque nom (début de nom avant "-")
      Je ne pense pas que ce soit nécessaire à ce niveau. Ou il faut pour une meilleure intégration connaitre exactement comment renommer la colonne : plus par des lettres ou des numéros.

    Si OK un petit

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 660
    Points : 165
    Points
    165
    Par défaut
    Bonjour ESVBA,

    Merci pour ta réponse,

    « (Bizarre pour un fichier organisé !) »
    Je suis d’accord avec toi, mais je ne suis pas maître des fichiers que j’importe.

    Toutes tes solutions ont fonctionné, pour ma part j’utiliserai :
    « Seuls les noms identiques sont modifiés »

    Par contre avant de mettre "Résolu" je voudrais régler l’autre cas où j’importe des données dont certains entêtes de colonne sont très longs, et nécessitent soit d’être tronqués, soit renommés.

    Salutations.

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Question :
    J'utilise aussi Access mais quelle est la taille maximale d'un nom de champ ?

    32 ou 240 caractéres ?

    Je n'ai pas ce problème avec mes tables.

    ESVBA

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Améliorations (2)...
    Voici une réponse testée rapidement, la pression du 24 décembre.

    Il faut modifier "iNbCarNomTable" dans le code avec la bonne valeur.

    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
    Sub Trans()
        Const iNbCarNomTable As Integer = 10  'Nombre de caractères maxi pour un nom de table Access
     
        Sheets("Feuil1").Range("A1").Select
        For c = 1 To Range("A1").End(xlToRight).Column
            '--- Ce nom n'est-il pas trop long ?
            '  > Si la chaine est trop longue ne garde que les (iNbCarNomTable - 6) caractéres de gauche
            '    "-6" ?
            '    Oui, sous 2007, il y a 16375 colonnes qui avec le "-" font 6 caractères
            '    donc on va retirer 6 caractères de plus au cas ou toutes les colonnes porteraient le même nom
            '    pour ne pas avoir de problème de renommage avec la seconde boucle
            '    Ca ne doit pas poser de problème s'il y a déjà x caractères identiques d"en avoir 6 de moins
            If Len(Cells(1, c).Value) > iNbCarNomTable - 6 Then
                Cells(1, c).Value = Left$(Cells(1, c).Value, iNbCarNomTable - 6)
            End If
            '--- Vérification si le nom n'existe pas déjà (tronqué ou non) : on relit les colonnes précédantes
            For C_ant = 1 To c - 1
                '--- Si le nom existe déjà
                If Cells(1, c).Value = Cells(1, C_ant).Value Then
                    Cells(1, c).Value = Cells(1, c).Value & "-" & c 'c=Nombre, car on peut faire >26 colonnes identiques
                End If
            Next C_ant
        Next c
    End Sub
    ESVBA

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 660
    Points : 165
    Points
    165
    Par défaut
    Re Bonjour

    Pour avoir une idée précise voici un entête de colonne parmi tant d’autres qui se trouve dans le ficher Excel que je dois importer dans ma table Access :

    Accepte que ces données (hors courriel) soient utilisées par les partenaires à des fins de prospection

    Je profite de l’occasion pour te souhaiter des bonnes fêtes de fin d’année.

    Salutations

    PS. Je réponds à l’avant dernier post car je n’avais pas encore vu le dernier.

Discussions similaires

  1. Modifier les noms des champs sous VBA
    Par shadockgreg dans le forum Access
    Réponses: 2
    Dernier message: 22/09/2006, 17h50
  2. Réponses: 4
    Dernier message: 05/01/2006, 09h01
  3. Réponses: 4
    Dernier message: 24/11/2005, 14h18
  4. Modifier le titre des colonnes d'une DBGrid
    Par deubal dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/11/2005, 17h15
  5. DBGrid, comment dessiner dans les titres des colonnes
    Par dleu dans le forum Bases de données
    Réponses: 9
    Dernier message: 04/11/2004, 17h49

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