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 :

Listobject nom colonne variable


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut Listobject nom colonne variable
    Bonjour,
    Je souhaite copier des données d'un export système vers un autre fichier (base ventes).

    J'ai modifié les intitulés de colonnes du fichier d'export pour qu'ils correspondent à ceux de la base vente, supprimé les colonnes non souhaitées et créé un tableau structuré dans l'export. (Jusque là tout va bien...)

    Le tableau cible est également un tableau structuré (Listobject). Je souhaiterais que pour chaque ligne, si l'en-tête de colonne d'export = en-tête de colonne base vente, la valeur soit copiée. Il y a donc 2 variables : la ligne (ça ok, comme d'habitude), ET la colonne.
    J'ai essayé ceci mais sans succès :
    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
    For Each cell In WB_export.Sheets(1).Range("Export_ventes[#Headers]")
     
                nom_col_export = cell.Value
     
                For Each cell2 In ThisWorkbook.Sheets("Base ventes").Range("Base_ventes[#Headers]")
     
                    nom_col_bdd_ventes = cell2.Value
     
                    If nom_col_export = nom_col_bdd_ventes Then
                        ThisWorkbook.Sheets("Base ventes").Range("Base_ventes[nom_col_bdd_ventes]").Cells(k).Value = WB_export.Sheets(1).Range("Export_ventes[nom_col_export]").Cells(i).Value
                        Exit For
                    End If
     
                Next cell2
     
            Next cell
    k = n° de ligne base vente où doivent se copier les données
    i = n° de ligne de l'export dont je souhaite copier les données

    J'espère avoir été claire... Malgré mes recherches je n'ai pas trouvé de solution (généralement c'est seulement la ligne qui varie...), alors un coup de main ne serait pas de refus.

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Aymeline Voir le message
    Bonjour,

    Pour faire ça, je crée une table d'équivalence où j'indique la position de chaque champs dans les tables cible et source. Les positions respectives sont chargées dans une matrice. Il suffit ensuite de faire une boucle sur la matrice pour mettre à jour les données sur chaque ligne. Je vérifie avant que toutes les positions sont bien trouvées pour les champs sélectionnés avec un X.

    Pièce jointe 355305

  3. #3
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut
    Bonjour,
    Le problème c'est que l'index de mes colonnes est variable, c'est une des raisons pour lesquelles j'ai décidé de travailler avec des tableaux structurés : la référence est le nom de colonne et plus sa position.
    Merci tout de même, je vais regarder quand même et voir si je peux m'en inspirer pour trouver une solution.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Aymeline Voir le message
    Bonjour,
    Le problème c'est que l'index de mes colonnes est variable, c'est une des raisons pour lesquelles j'ai décidé de travailler avec des tableaux structurés : la référence est le nom de colonne et plus sa position.
    Un petit coup de pouce :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    Option Explicit
     
    Public DetectionColonnes As String
     
    Function ColonneFeuille(ByVal FeuilleTitre As Worksheet, ByVal LigneTitre As Long, ByVal TitreRecherche As String) As Long
     
    Dim NbColonnes As Long
    Dim Cellule As Range
    Dim Aire As Range
     
        With FeuilleTitre
     
             ColonneFeuille = 0
             NbColonnes = .Cells(LigneTitre, .Columns.Count).End(xlToLeft).Column
             Set Aire = .Range(.Cells(LigneTitre, 1), .Cells(LigneTitre, NbColonnes))
     
             For Each Cellule In Aire
                 Select Case Mid(Cellule.Value, 1, Len(TitreRecherche))
                        Case TitreRecherche
                             ColonneFeuille = Cellule.Column
                             Exit For
                 End Select
             Next
     
             If ColonneFeuille = 0 Then DetectionColonnes = DetectionColonnes & Chr(10) & TitreRecherche
     
             Set Aire = Nothing
     
        End With
     
    End Function
     
     
    Sub Test()
     
    Dim ShVentes As Worksheet
    Dim LigneDeTitre As Long
    Dim ColInfo1 As Long, ColInfo2 As Long
     
        On Error GoTo FinTest
     
        DetectionColonnes = "Absence colonnes : " & Chr(10)
     
        Set ShVentes = Sheets("Base ventes")
     
        With ShVentes
             LigneDeTitre = .ListObjects("Export_ventes").HeaderRowRange.Row
             ColInfo1 = ColonneFeuille(ShVentes, LigneDeTitre, "Info1")
             ColInfo2 = ColonneFeuille(ShVentes, LigneDeTitre, "Info2")
        End With
     
        If DetectionColonnes <> "Absence colonnes : " & Chr(10) Then
           MsgBox DetectionColonnes
           GoTo FinTest
        End If
     
        MsgBox ColInfo1 & Chr(10) & ColInfo2
     
        GoTo FinTest
     
    FinTest:
     
        Set ShVentes = Nothing
     
    End Sub

  5. #5
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut
    Sinon j'ai trouvé ça, adapté en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i = 1
    nomColonne = "Désignation produit"
     
        With ThisWorkbook.Sheets("Base ventes").ListObjects("Base_ventes").ListColumns(nomColonne)
            Intersect(.DataBodyRange, i).Select
        End With
    Mais ça me met un code d'erreur 424 "Objet requis" sur la ligne intersect, et j'ai pourtant bien vérifié les noms, ils sont issus de l'enregistreur...

  6. #6
    Membre averti
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Septembre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 37
    Par défaut
    Bon, ça a été laborieux car il existe plusieurs syntaxes pour les tableaux structurés et qu'on ne trouve pas autant d'infos sur cette façon de coder en VBA, mais j'ai finalement réussi !

    Voici le (bout de) code final si ça peut servir :
    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
     
           For i = 1 To WB_export.Sheets(1).Range("Export_ventes").Rows.Count Step 1 'pour chaque ligne d'export
     
        export_gamme = WB_export.Sheets(1).Range("Export_ventes[Gamme]").Cells(i).Value
     
     
            'Copier les en-têtes identiques
            For no_col_export = 1 To WB_export.Sheets(1).ListObjects("Export_ventes").ListColumns.Count Step 1
     
                nom_col_export = WB_export.Sheets(1).ListObjects("Export_ventes").Range(1, no_col_export).Value
     
                For no_col_bdd = 1 To ThisWorkbook.Sheets("Base ventes").ListObjects("Base_ventes").ListColumns.Count Step 1
     
                    nom_col_bdd_ventes = ThisWorkbook.Sheets("Base ventes").ListObjects("Base_ventes").Range(1, no_col_bdd).Value
     
                    If nom_col_export = nom_col_bdd_ventes Then
                        ThisWorkbook.Sheets("Base ventes").ListObjects("Base_ventes").Range(k + 1, no_col_bdd).Value = WB_export.Sheets(1).ListObjects("Export_ventes").Range(i + 1, no_col_export).Value 'Mettre + 1 car avec cette syntaxe ligne 1 = en-tête
                        Exit For
                    End If
     
                Next no_col_bdd
     
            Next no_col_export
     
            'Indiquer que la ligne a été copiée
            WB_export.Sheets(1).Range("Export_ventes[Importé dans récap]").Cells(i).Value = "Oui"
     
            'Ecrire sur la ligne suivante
            k = k + 1
     
    Next i
    '
    avec i n° de ligne de l'export à copier et k n° de ligne où l'on souhaite copier les données

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

Discussions similaires

  1. Nom de variable = nom de colonne sql
    Par EricGardien dans le forum ASP
    Réponses: 2
    Dernier message: 10/01/2012, 08h50
  2. Réponses: 10
    Dernier message: 23/12/2010, 20h26
  3. Nom de variable (colonne) avec espace
    Par kikilolo dans le forum Débutez
    Réponses: 2
    Dernier message: 02/08/2010, 12h02
  4. Ajouter une colonne à une table dont le nom est variable
    Par Badtothebone93 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/04/2009, 17h32
  5. Nom de colonne variable
    Par Fayoul dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/08/2006, 15h50

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