Boucle recherche cellule vide et déplacement de valeur

Bonjour le Forum

Après pas mal de recherche je galère un max sur une boucle de recherche de cellule vide et déplacement de valeur.

Soit je suis nul soit le niveau de difficulté est réel, il faudra me dire.

Sur le fichier joint si la REF est vide en C je déplace la GAMME de E en C pour toute les lignes.

Ensuite je supprimerai les lignes vides dans E et si je n'y arrive pas je mange mon chapeau

Merci à tous pour aide

Bonjour,

Voici une proposition avec ce code :

Sub deplacer()

With Sheets("A")
    dl = .Cells(.Rows.Count, 5).End(xlUp).Row
    With .Range("C2:E" & dl)
        t = .Value
        For i = 1 To dl - 1
            If t(i, 1) = "" Then
                t(i, 1) = t(i, 3)
                t(i, 3) = ""
            End If
        Next i
        .ClearContents
        .Value = t
    End With
End With

End Sub

Cdlt,

Hello,

Merci d'avoir consacré du temps.

Je pense avoir compris la méthode mais ce n'est pas le résultat attendu (enfin, j'ai un peu compris en regardant les variables locales)
Je me suis rendu compte que mes explications d'attente de résultat n'étaient pas très clair.

Je renvois un fichier avec une feuille du résultat attendu.
Si vous me mettez un peu de commentaires, cela me permet d'essayer de comprendre

Ok, pas de souci pour les commentaires...

Le tableau est vraiment présenté avec ces lignes vides ?

Voici votre fichier en retour (où je ne traite que les 3 colonnes) :

Sub deplacer()

With ActiveSheet
    dl = .Cells(.Rows.Count, 5).End(xlUp).Row 'dernière ligne en E
    With .Range("C2:E" & dl) 'avec les 3 colonnes C à E (entêtes exclues)
        t = .Value 't stocke les valeurs
        For i = LBound(t) To UBound(t) 'pour chaque ligne du tableau
            If t(i, 1) = "" Then 'si la ref est vide
                n = n + 1 'incrémentation n (variable compteur utilisée pour décaler les valeurs et enlever les vides)
                sgamme = t(i, 3) 'on conserve la gamme en cours
            Else 'sinon, si ref non vide, on affecte la ligne i-n (donc ligne en cours - nombre de vides) de t
                t(i - n, 1) = t(i, 1) 'ref décalée prend ref en cours
                t(i - n, 2) = sgamme 'gamme prend gamme stockée
                t(i - n, 3) = t(i, 3) 'ligne décalée prend ligne en cours
            End If
        Next i
        .ClearContents 'on efface le contenu de la plage
        .Resize(UBound(t) - n, .Columns.Count).Value = t 'on recolle les valeurs obtenus sur la plage retaillée au nombre de valeurs (taille départ du tableau - nombre de vides)
    End With
End With

End Sub

J'espère que mes commentaires seront assez clairs.

Cdlt,

Hello,

Parfait, génial.

Le tableau n’est pas tout à fait comme ça, il faut que je conserve les données parfois présentes dans la colonne A « «TAG » afin qu’elles restent sur la ligne de la REF mais je vais tenter de comprendre et d’adapter, merci pour les commentaires.

Le plus navrant pour moi est de ne pas avoir réussis à le faire moi même en cherchant pendant des heures pour pas dire des jours alors qu’il faut peut de temps à d’autres

Comme les tableaux étaient un peu difficile à comprendre dans mon apprentissage du VBA, je suis un peu passé à côté et du coup galère.

Je vais décortique ce code pour comprendre et adapter.

Merci pour l’aide

Salut,

Voici, au cas où, un essai pour le tableau complet cette fois (non testé) :

Sub deplacer()

With ActiveSheet
    dl = .Cells(.Rows.Count, 5).End(xlUp).Row 'dernière ligne en E
    With .Range("A2:E" & dl) 'avec les 3 colonnes C à E (entêtes exclues)
        t = .Value 't stocke les valeurs
        For i = LBound(t) To UBound(t) 'pour chaque ligne du tableau
            If t(i, 3) = "" Then 'si la ref est vide
                n = n + 1 'incrémentation n (variable compteur utilisée pour décaler les valeurs et enlever les vides)
                sgamme = t(i, 5) 'on conserve la gamme en cours
            Else 'sinon, si ref non vide, on affecte la ligne i-n (donc ligne en cours - nombre de vides) de t
                for k = lbound(t, 2) to ubound(t, 2)
                    t(i - n, k) = t(i, k) 'ref décalée prend ref en cours
                next k
                t(i - n, 4) = sgamme 'gamme prend gamme stockée
            End If
        Next i
        .ClearContents 'on efface le contenu de la plage
        .Resize(UBound(t) - n, ubound(t, 2)).Value = t 'on recolle les valeurs obtenus sur la plage retaillée au nombre de valeurs (taille départ du tableau - nombre de vides)
    End With
End With

End Sub

Je comprends, l'apprentissage des tableaux n'est pas évident. Mais je pense qu'il ne faut pas passer à côté car ils permettent déjà d'avoir une exécution accélérée et surtout de modifier les valeurs en arrière-plan, vu que ce sont des variables multi-dimensionnelles. Ca peut être utile... Si ça peut te rassurer, il y a un certain niveau de difficulté dans ce cas !

Mais vu que tu connais la fenêtre de variables locales, tu devrais t'y familiariser plus vite !

Cdlt,

Rechercher des sujets similaires à "boucle recherche vide deplacement valeur"