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 :

Retourner un tableau


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
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut Retourner un tableau
    Bonjour à tous,

    Dans le fichier excel suivant, le nombre de colonne varie d'une ligne a l'autre.
    Je voudrais connaitre la dernière colonne utilisé afin de pouvoir inverser le tableau (en miroir) que la premiere colonne devienne la derniere et ainsi de suite pour les autre.

    Voici le code que j'ai utilisé,

    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
     
    Option Explicit
     
    Sub Essai()
      Dim Tbl
      Dim Lig As Integer
      Dim Col As Integer
      Dim DerLigne As Integer
      Dim DerColonne As Integer
     
      DerLigne = Cells(Rows.Count, 1).End(xlUp).Row
      DerColonne = Worksheets("Feuil3").UsedRange.Columns.Count
     
      Tbl = Range(Cells(1, 1), Cells(DerLigne, DerColonne)): Application.ScreenUpdating = 0
     
      For Lig = 1 To DerLigne
        For Col = 1 To DerColonne
            Cells(Lig, (DerColonne + 1) - Col) = Tbl(Lig, Col)
        Next Col
      Next Lig
     
    End Sub
    cela fonctionne sur en gros mais ma variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      DerColonne = Worksheets("Feuil3").UsedRange.Columns.Count
    ne me renvoie pas le bon resultat.

    Une idée de l'erreur?

    Merci

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Si ton « tableau » ne comporte pas de ligne vide (comme tout tableau qui se respecte !) utilises .CurrentRegion
    et plutôt que d'écrire cellule par cellule, utilises un second tableau VBA (tu pourras te passer de ScreenUpdating = 0).

    EDIT : par exemple
    Code VBA : 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
    Option Explicit
    Sub Test()
      Dim Tb1 As Variant
      Dim Tb2 As Variant
      Dim x As Long
      Dim y As Long
      Dim c As Range
      Tb1 = Worksheets("Feuil3").Range("A1").CurrentRegion.Value
      ReDim Tb2(1 To UBound(Tb1), 1 To UBound(Tb1, 2))
      For x = 1 To UBound(Tb1)
        For y = UBound(Tb1, 2) To 1 Step -1
           Tb2(x, y) = Tb1(x, UBound(Tb1, 2) - y + 1)
        Next y
      Next x
      Set c = Worksheets("Feuil2").Range("A1")  ' destination
      c.Resize(UBound(Tb2), UBound(Tb2, 2)).Value = Tb2
    End Sub

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Si tu veux avoir une valeur DerColonne différente pour chaque ligne, il faut le calculer après avoir choisi la ligne donc après le premier For To.
    La syntaxe est la même que pour déterminer la dernière ligne excepté qu'on part de la dernière colonne (Columns.Count au lieu de Rows.Count) et qu'on va vers la gauche au lieu d'aller vers le haut (xlToLeft au lieu de xlUp).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      For Lig = 1 To DerLigne
        DerColonne = Worksheets("Feuil3").Cells(Lig, Columns.Count).End(xltoLeft).Column
        For Col = 1 To DerColonne

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 249
    Par défaut
    hello,
    le souci avec que la copie des valeurs c'est que le formatage des cellules ne suit pas .
    Voici une autre façon de procéder en utilisant un tri de colonne :
    1 - On rajoute une ligne temporaire avec un indice correspondant au numéro de colonne.
    2 - On trie les colonnes en fonction de cette nouvelle ligne en inversant l'ordre.
    3 - On efface la ligne ajoutée.

    Le 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
    Sub EssaiJP()  
      Dim r
      Dim indices()
      Dim numCols, i As Integer
     
      Set r = Worksheets("Feuil3").UsedRange
      ' on ajoute une première ligne avec un indice de numéro de colonne
      r.Rows(1).Insert xlShiftDown
      numCols = r.Columns.Count
      ReDim indices(numCols)
      For i = 0 To numCols
        indices(i) = i
      Next
      r.Rows(0).NumberFormat = "General"
      r.Rows(0).Value = indices
      ' tri en fonction de la première ligne ajoutée
      Set r = Worksheets("Feuil3").UsedRange
      r.Sort r.Rows(1), xlDescending, , , , , , xlNo, , , xlSortRows
      ' on supprime la ligne rajoutée
      r.Rows(1).Delete shift:=xlUp
    End Sub
    Je ne sais pas si c'est cela que tu veux faire. Voici le résultat (le début des nouvelles dernières colonnes) :

    Nom : Tri_Col_VBA.PNG
Affichages : 185
Taille : 16,6 Ko

    Ami calmant, J.P

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/10/2005, 18h32
  2. Retourner un tableau ?
    Par chateau_dur dans le forum C++
    Réponses: 8
    Dernier message: 20/08/2005, 12h11
  3. retourné un tableau
    Par elekis dans le forum C++
    Réponses: 5
    Dernier message: 17/03/2005, 15h03
  4. [plpgsql] comment retourner un tableau
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 21h09
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

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