Nom de variable lui même variable

Bonjour,

Je reçois périodiquement un fichier Excel de statistiques commerciales de 45 colonnes (Client, produit, pays, région, chiffre d'affaires, remise, ...).

Ces colonnes ne sont pas dans un ordre logique. Afin d'en tirer un TCD qui présente les champs dans un ordre logique pour l'utilisateur (colonnes "client" contigües, colonnes "produit contigües, ...), j'ai besoin de déplacer toutes les colonnes pour les présenter dans le bon ordre.

Mon code :

    Const Col1 As String = "Code Client"        'je veux déplacer la colonne "Code Client" en colonne "A"
    Const Col2 As String = "Nom Client"         'je veux déplacer la colonne "Code Client" en colonne "B", etc ...
    Const Col3 As String = "Code APE"
    Const Col4 As String = "Métier"
    Const Col5 As String = "Groupe"

    ........

    Const Col44 As String = "Type de contrat"
    Const Col45 As String = "N° de contrat"

    Dim i As Integer
    Const Col As String = "Col"

    i = 1
    For i = 1 To 45
[color=#FF0000]        Selection.Find(What:=" & Col & i ", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False).Activate[/color]
    ActiveCell.EntireColumn.Select
    Selection.Cut

    Range(Columns(i), Columns(i)).Select

    Selection.Insert Shift:=xlToRight

    i = i + 1

    Next i

Evidemment, cela ne marche pas. Erreur d'éxecution '91' : variable objet ou variable de bloc with non définie.

Merci infiniment pour votre aide.

bonjour

joins un exemple de fichier, car il est rare de voir 2 clients dans une même ligne

Bonjour jmd,

Rectification

Const Col1 As String = "Code Client" 'je veux déplacer la colonne "Code Client" en colonne "A"

Const Col2 As String = "Nom Client" 'je veux déplacer la colonne "Nom Client" en colonne "B", etc ...

Bonjour à toutes et tous,

Il n'est besoin de faire ce que tu souhaites faire, pour créer ton TCD.

Il faut simplement s'assurer que les noms de champs existent.

Quand tu crées le TCD, tu places les champs comme tu le souhaites !?

Bon, dans l'attente d'un fichier !...

Cdlt.

Bonjour Jean-Eric,

C'est la liste des champs que je souhaite voir apparaitre dans un ordre logique, afin de pouvoir les repérer facilement avant de les faire glisser dans les zones voulues (filtres, lignes, ...).

Pour cela, pas d'autre moyen que de modifier l'ordre des colonnes du fichier de base.

Je peux écrire une macro qui déplace chacune des 45 colonnes, une à une, à l'endroit souhaité, mais je cherche une solution plus élégante avec une boucle, et donc le titre de chaque colonne en variable.

Mais je bute là dessus.

Merci tout de même.

bonjour

salut Jean-Eric

pour faire propre, il faut aussi masquer des colonnes (tu ne vas pas mettre tes 45 col dans le TCD j'espère ! )

il faut Denu données, récupérer

ça ouvre PQuery

là tu peux "supprimer" des colonnes (en fait tu ne les chargeras pas)

et aussi reclasser des colonnes

tu charges ta requête. La magie d'Excel opère !

c'est une fonction nouvelle d'Excel (5 ans déjà ! )

pas de bricolage, pas de VBA

Je viens de télécharger Power Query, dont je ne connaissais pas l'existence.

Je vais prendre du temps pour apprendre à l'utiliser.

Néanmoins, j'aimerai trouver la solution à ma question initiale (syntaxe du selection.find(What: & var &,...) qui peut me servir pour d'autres appli.

Si pas de solution dans la soirée, je clôturerai le post.

Merci à tous.

Re,

Ne t'a pas demander de joindre un fichier (représentatif et anonymisé si nécessaire) ?

Cdlt.

Re,

Je ne sais pas comment joindre un fichier.

Re,

Regarde la vidéo.

https://www.youtube.com/watch?v=EbNYLzTz5wM

La taille du fichier doit être inférieure à 1000ko.

Cdlt.

Bonsoir,

Si ça peut aider :

16test.xlsx (100.09 Ko)

Merci pour votre aide.

Re,

Il aurait été judicieux de mettre le TCD final que tu souhaitais !...

Cdlt.

Jean Eric,

J'ai du mal m'exprimer.

Je ne veux pas un TCD final.

Le principe du TCD est justement que chacun constitue celui (ou ceux) qui lui convient (conviennent) en fonction du type d'analyse recherché.

Je cherche simplement à ce que la liste des champs du TCD qui apparait dans la fenêtre en haut à droite de l'écran se présente dans un ordre cohérent.

Je cherche donc à déplacer les colonnes selon l'ordre qui me convient.

Mais ma boucle ne fonctionne pas.

      '---- Titres des colonnes dans l'ordre souhaité
    Const Col1 As String = "Activité"
    Const Col2 As String = "Sous-activité 1"
    Const Col3 As String = "Sous-activité 2"
    Const Col4 As String = "Agence CA"
    Const Col5 As String = "Agence CP"

   etc ...

    Const Col 45 As String = "P.Annexe"

 '--- Déplacement des colonnes
    Dim i As Integer
    Const Col As String = "Col"
    i = 1
    For i = 1 To 45
    Col = "Col" & i

    '--- Recherche de la colonne à déplacer (Col & i)
    Rows("1:1").Select
    Selection.Find(What:= & col & i, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    ActiveCell.EntireColumn.Select

    '--- Couper et coller (en colonne i)
    Selection.Cut
    Range(Columns(i), Columns(i)).Select
    Selection.Insert Shift:=xlToRight

    i = i + 1

    Next i

Je vois bien que mon Selection.Find avec ma colonne sous la forme & Col & i n'est pas bon.

& Col & i a pour valeur Col1 ou Col2 ou ... Col45 selon la valeur de i, mais pas le titre de la colonne que je cherche.

Qui ne cherche pas ne trouve pas. Mais je cherche et ne trouve pas non plus.

Merci beaucoup pour votre éclairage.

Bonjour,

Un TCD est un tableau croisé dynamique et non un tableau (ou table).

Il serait judicieux de télécharger Power Query pour Excel 2013 (complément gratuit Microsoft) pour traiter tes données.

Il permettrait plus simplement la mise en forme (réorganisation) de tes données.

Un lien à consulter :

https://support.office.com/fr-fr/article/Aide-de-Microsoft-Power-Query-pour-Excel-2b433a85-ddfb-420b-9cda-fe0e60b82a94

Maintenant, je te propose cette procédure à adapter :

Public Sub Formatting_table()
Dim lo As ListObject
Dim tbl, tbl2
Dim lCol As Long, i As Long

    Application.ScreenUpdating = False

    Set lo = ActiveSheet.ListObjects(1)
    tbl = Array("Activit?", "Sous-activit? 1", "Sous-activit? 2", "Agence CA", "Agence CP")
    tbl2 = Array(1, 2, 3, 4, 5)

    For i = LBound(tbl) To UBound(tbl)
        On Error Resume Next
        lCol = Application.Match(tbl(i), lo.HeaderRowRange, 0)
        If Err.Number = 0 Then
            With lo
                .ListColumns(lCol).Range.Cut
                .ListColumns(tbl2(i)).Range.Insert shift:=xlToRight
            End With
            Application.CutCopyMode = 0
        Else
            Err.Clear
            MsgBox "La colonne " & tbl(i) & " n'existe pas !...", 64, "Recherche en-t?te"
        End If
    Next i

End Sub

Nota : Tu remplaceras les ? par un é.

Bonjour Jean-Eric,

Et merci de te lever de si bon matin pour me venir en aide.

Je te remercie pour l'envoi du tuto. Je vais passer du temps sur Power Querry.

Quant à ta proposition de code, elle m'apprend beaucoup de choses.

Elle m'a l'air top, mais elle plante sur la ligne

Set lo = ActiveSheet.ListObjects(1)

Erreur d'éxécution 9 : l'indice n'appartient pas à la sélection.

Evidemment, le code erreur devrait m'indiquer la solution, mais je ne suis pas encore au niveau.

Encore merci, et bonne journée

Re,

Tes données doivent sous forme de tableau, comme dans ton fichier initial (voir gestionnaire de noms).

Cdlt.

OK.

Problème résolu.

Merci pour tout.

Rechercher des sujets similaires à "nom variable meme"