Compacter un tableau avec VBA

Résolu
slimscud Messages postés 60 Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je voudrais compacter les valeurs de mon tableau le plus a gauche possible
Je n'ai pas le droit de joindre un fichier
mais en gros ce que je veux c'est que sur une ligne au lieu d'avoir par exemple mes valeures

X 1 X 2 X 3 X 4
je les veux
1 2 3 4 X X X X
ca fait 4 heures que je suis bloquer sur ce probleme a cause d'un simple bouton
merci a vous

6 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Une macro qui devrait mettre moins de 30 min : https://www.cjoint.com/?DFfqY3OSYLI
    Comme apparemment tu as plusieurs feuilles concernées c'est une macro unique dans Thisworkbook.
    Elle se lance par un double-clic en J2. Ajoute un contrôle du nom des feuilles, qu'elle ne se lance que sur les feuilles concernées.

    eric
    1
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    Pas très clair.
    Tu peux joindre un exemple bidon (avec la même structure et quelques lignes) de ce que tu veux obtenir, au format excel 2003 sur cjoint.com et mets le lien obtenu à ton prochain message

    Cdlmnt
    0
    1. slimscud Messages postés 60 Statut Membre
       
      Bonjour désole de ne pas avoir répondu plus tot je n'etais plus sur omn lieu de travail et je n'avais plus excel sous la main
      https://www.cjoint.com/?DFeiPkaP35X
      voila en gros ce que je veut qu'un bouton me fasse
      0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Désolé, mais je t'ai demandé un fichier au format excel 2003 (fichier/enregistrer sous/Type/ ... xls)
    0
  4. Maurice
     
    Bonjour
    il faut faire 2 boucle

    Sub test()
    Nlig = Range("B" & Rows.Count).End(xlUp).Row
    For L = 3 To Nlig
    Col = 10
    For C = 3 To 7
    If Cells(L, C).Value <> "" Then
    Cells(L, Col).Value = Cells(L, C).Value
    Col = Col + 1
    End If
    Next
    Next
    End Sub

    A+
    Maurice
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    A toi de modifier les valeurs des constantes selon ta configuration

    Option Explicit

    Const NF = "Feuil1"
    Const lideb = 1
    Const codeb = 1

    Public Sub Kompacte()
    Dim lifin As Long, li As Long, co As Long, cofin As Long, coco As Long
    With Sheets(NF)
    lifin = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
    For li = lideb To lifin
    cofin = .Cells(li, Columns.Count).End(xlToLeft).Column
    coco = codeb
    For co = codeb To cofin
    If .Cells(li, co) <> "" Then
    .Cells(li, coco) = .Cells(li, co)
    .Cells(li, co) = ""
    coco = coco + 1
    End If
    Next co
    Next li
    End With
    End Sub

    Cdlmnt
    0
    1. slimscud Messages postés 60 Statut Membre
       
      Ok merci je vais essayer ca tout de suite.
      Désole pour le fichier excel j'ai pas trop compris pourquoi il me la pas mis en 2003 ce lien devrait etre bon.
      https://www.cjoint.com/?DFfoaBkTrPE
      0
    2. slimscud Messages postés 60 Statut Membre
       
      Les Vba ne sont pas du tout comme ce a quoi je m'attendais enfait peu etre que si j'expliquais un peu mieu ce que je veux ca serait mieu
      je voudrais que si la case de gauche est vide il me decale ma valeure dedan ceci pour 20 lignes et 30 colonnes
      j'ai utiliser un copier coller si avec une boucle je met presque 30 minutes a tout decaler si il y a beaucoup de valeures
      0
  7. slimscud Messages postés 60 Statut Membre
     
    C'est exactement ce qu'il me faut !
    il est instantané
    par contre j'aimerais qi'il soit sur un bouton comment j'ajoute la macro au bouton?
    et pourquoi la colonne S n'est pas decalée ?
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjouir,

      pourquoi la colonne S n'est pas decalée ?

      Erreur de ma part, corrigé


      par contre j'aimerais qi'il soit sur un bouton
      Si tu préfères, dans ce cas il faudra mettre le code sur chaque bouton :
          Dim pl As Variant, lig As Long, col As Long, col2 As Long, i As Long
          Const plage As String = "B5:S34"
          
          pl = Range(plage).Value
          If Target.Address = "$J$2" Then
              Cancel = True
              For lig = 1 To UBound(pl, 1)
                  For col = 1 To UBound(pl, 2)
                      If pl(lig, col) = "" Then
                          col2 = col
                          Do
                              col2 = col2 + 1
                              If col2 > UBound(pl, 2) Then Exit For
                          Loop Until pl(lig, col2) <> ""
                          i = 0
                          For col2 = col2 To UBound(pl, 2)
                              pl(lig, col + i) = pl(lig, col2)
                              pl(lig, col2) = ""
                              i = i + 1
                          Next col2
                      End If
                  Next col
              Next lig
              Range(plage) = pl
          End If


      eric
      0