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 :

decalage vers la droite de données ligne par ligne [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien electronique
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien electronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut decalage vers la droite de données ligne par ligne
    Bonjour,
    J'ai des données qui se présentent sous la forme ci-dessous (AVANT) que je transforme sous la forme (APRES) exemple simplifié il y a un nombre variable de colonnes et de lignes souvent 60 colonnes et 30000 lignes.
    J'ai fait une boucle qui viens compter les cellules vides de chaque lignes puis qui décale d'autant les données avec un shift:=xlToright ligne par ligne.
    Cela marche bien mais l'execution est longue, j'ai désactiver le rafraichissement de l'affichage et mis le calcul en manuel.
    Si quelqu'un pouvez me donner une piste pour amèliorer le code pour accélerer l'execution.

    Merci par avance.

    Avant
    	3	4	5		
    	1	2	3	4	5
    	1	2	3	4	5
    	2	3	4	5	
    	2	3	4	5	
    	1	2	3	4	5
    	2	3	4	5	
    	3	4	5		
    	1	2	3	4	5
    	1	2	3	4	5
    Après
    			3	4	5
    	1	2	3	4	5
    	1	2	3	4	5
    		2	3	4	5
    		2	3	4	5
    	1	2	3	4	5
    		2	3	4	5
    			3	4	5
    	1	2	3	4	5
    	1	2	3	4	5
    Code de la boucle à optimiser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    For j = Ligne_4 To Nbr_lig						
     
           Cells_Vide = Range(Adress_1)						
          'MsgBox (Cells_Vide)						
     
           If Cells_Vide <> 0 Then						
                   For i = 1 To Cells_Vide						
                     Range("J" & Ligne_4).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove						
                    Next						
            End If						
           Ligne_4 = Ligne_4 + 1						
            Adress_1 = "I" & Trim(Ligne_4)						
           Range(Adress_1).Select						
    Next

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Je ne vois pas la différence entre Avant et Après.
    As tu un fichier exemple du avant et après?

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien electronique
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien electronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Ci-joint un exemple.

    En fait aprés les données doivent être toutes alignées sur la dernière colonne.
    Tous les 1 sur même colonne, tous les 2 sur même colonne, etc...
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Pa rapport a ton fichier, ci dessous une autre approche
    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
    Dim i As Long
    Dim NbCol As Integer
     
    For i = 3 To 12
     
     
        'Coupe les données
        Range("E" & i & ":I" & i).Cut Range("K" & i)
     
        'Cherche la colonne de fin
        NbCol = Range("K" & i & ":O" & i).End(xlToRight).Column
     
        'Copy
        Range("K" & i & ":" & Cells(i, NbCol).Address).Cut Cells(i, 20 - NbCol)
     
    Next i

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonsoir
    Si tu as beaucoup de données, utilise plutôt les variables tableaux
    Exemple (données commencent en A1
    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
    Sub Reformate()
    Dim LastLig As Long, i As Long
    Dim Tb As Variant
     
    Application.ScreenUpdating = False
    With Worksheets("exemple")
        Tb = .UsedRange.Value
        LastLig = UBound(Tb, 1)
     
        For i = 1 To LastLig
            Former Tb, i
        Next i
        .Range("A1").Resize(LastLig, UBound(Tb, 2)) = Tb
    End With
    End Sub
     
    Private Sub Former(Tablo As Variant, ByVal Lig As Long)
    Dim i As Integer, j As Integer, n As Integer
     
    n = UBound(Tablo, 2)
    i = n
    Do While Tablo(Lig, i) = "" And i > 1
        i = i - 1
    Loop
    If i < n Then
        For j = i To 1 Step -1
            Tablo(Lig, n - i + j) = Tablo(Lig, j)
            Tablo(Lig, j) = Empty
        Next j
    End If
    End Sub

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien electronique
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien electronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci à tous les deux pour vos réponses.
    La solution avec les tableau est beaucoup plus rapide.
    Etant débutant en vba, je ne connaisser pas cette méthode.
    Encore merci.

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

Discussions similaires

  1. récuperation des données ligne par ligne
    Par esisa1 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 29/06/2010, 15h30
  2. Réponses: 6
    Dernier message: 07/05/2009, 09h32
  3. [MySQL] Afficher les données ligne par ligne
    Par the watcher dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/02/2009, 17h50
  4. [ Problème d'affichage de données ligne par ligne ]
    Par Arkoze dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 05/06/2007, 09h45
  5. Réponses: 62
    Dernier message: 05/07/2006, 13h48

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