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 :

Manipulation de colonnes [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Par défaut Manipulation de colonnes
    Bonjour,

    J'ai un petit soucis, j'ai fait quelques macros pour déplacer des colonnes dans un tableau, cela fonctionne quand je n'ai qu'un tableau dans une feuille.

    Mais dès que j'ai plusieurs tableaux cote à cote cela ne fonctionne plus, le résultat de RearrangeTable = 1004.

    Avez-vous une idée ?

    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
    67
    Sub Deplace_Colonne(Table As ListObject, ByVal Pos_Dep As Integer, ByVal Pos_Fin As Integer)
     
    With Table
        If Pos_Dep <= .ListColumns.Count Then
            'If Pos_Fin > Table.ListColumns.Count Then Pos_Fin = Table.ListColumns.Count + 1
            .ListColumns(Pos_Dep).Range.Cut
            If Pos_Fin < Pos_Dep Then
                .ListColumns(Pos_Fin).Range.Insert shift:=xlToRight
            Else
                If Pos_Fin > .ListColumns.Count Then
                    .ListColumns(.ListColumns.Count).Range.Offset(0, 1).Insert shift:=xlToRight
                Else
                    .ListColumns(Pos_Fin - 1).Range.Insert shift:=xlToRight
                End If
            End If
        Else
            ' En dehors des limites
        End If
    End With
    End Sub
     
    Sub Insert_Colonne(Table As ListObject, ByVal Nom As String, ByVal Position As Integer)
     
    With Table
        If Position <= .ListColumns.Count Then
            .ListColumns(Position).Add
            .ListColumns(Position + 1).Name = Nom
        Else
            .ListColumns.Add
            .ListColumns(.ListColumns.Count).Name = Nom
        End If
    End With
     
    End Sub
     
    Function ReArrange_Table(Table As ListObject, ByVal Colonnes, Optional KeepAllColumns As Boolean = False) As Long
     
    Dim L_Colonne As ListColumn
    Dim Compteur As Integer
    Dim Position As Integer
     
    On Error GoTo Fin
        For Compteur = LBound(Colonnes) To UBound(Colonnes)
            If Colonnes(Compteur) <> "" Then
                ' Ne traite que les colonnes ayant un nom
                If Existe_Colonne(Table, Colonnes(Compteur)) Then
                    Call Deplace_Colonne(Table, Position_Colonne(Table, Colonnes(Compteur)), Table.ListColumns.Count + 1)
                Else
                    Call Insert_Colonne(Table, Colonnes(Compteur), Table.ListColumns.Count + 1)
                End If
            End If
        Next Compteur
        If Not KeepAllColumns Then
            Do While Table.ListColumns.Count > UBound(Colonnes) + 1
                Table.ListColumns(1).Delete
            Loop
        Else
            For Compteur = 1 To Table.ListColumns.Count - (UBound(Colonnes) + 1)
                Table.ListColumns(1).Range.Cut
                Table.ListColumns(Table.ListColumns.Count).Range.Offset(0, 1).Insert shift:=xlToRight
            Next Compteur
        End If
    Fin:
        Application.CutCopyMode = False
        If Err <> 0 Then ReArrange_Table = Err.Number
     
    End Function

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    En gros, lors de l'insertion de ta colonne, ton tableau structuré est "agrandit" d'une colonne, avant le delete, et essaie donc de se superposer au second tableau adossé à celui-ci, ce qui génère une erreur.

    Le même souci se présenterait en ajoutant une ligne à un tableau si un second est directement présent en dessous, sans assez de ligne de séparation.

    C'est pourquoi dans la logique des choses ont essaie au maximum d'avoir un seul listobject par feuille.

    Idée de contournement :

    Déplacement momentané du second listobject, traitement, remise en place d'origine
    Laisser une colonne vide entre les deux tables
    ...

    Le plus efficace restant le 1 tableau par feuille.

    Pierre Fauconnier à déjà abordé le sujet du déplacement de colonne d'un un billet ( lien ci-dessous) mais à première vue je dirais que tu rencontreras le même souci.


    https://www.developpez.net/forums/bl...eau-structure/

    Bat,
    MFoxy

  3. #3
    Membre averti
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Par défaut
    Bonjour,

    Merci pour la réponse, j'ai bien ajouté une colonne entre 2 tableaux, mais cela ne change rien....
    Et dans ce cas je ne souhaite pas avoir autant de feuilles que de tableaux, car ce sont de petit tableau pour configuration
    Finalement j'ajoute une colonne complète et je fais un redimmensionnement (resize) du tableau (listobject)., cela fonctionne apparemment.

    Merci.

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

Discussions similaires

  1. [XL-2007] Manipulations de Colonnes et Cellules
    Par renaudjean dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/10/2013, 23h18
  2. [WD15] Manipulation de colonne dans un ETAT
    Par GCASPIC10 dans le forum WinDev
    Réponses: 1
    Dernier message: 02/12/2010, 03h14
  3. manipulation des colonnes de DatagridView
    Par laredo dans le forum Débuter
    Réponses: 1
    Dernier message: 18/09/2008, 00h13
  4. Manipulation de colonnes
    Par intel_mark dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/08/2007, 09h06
  5. [VB6] Manipuler des cellules/lignes/colonne d'un Flexgrid
    Par zako dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/06/2006, 18h34

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