[VBA] Remplir des vides d'un tableau

Bonjour,

Cette discussion fait suite à celle-ci : https://forum.excel-pratique.com/viewtopic.php?f=2&t=140975 et doit constituer la dernière partie de ce projet.

J'ai une base de données qui contient des parties de lignes vides. Je pense savoir le faire via l'utilisationd e boucles, mais cela serait très chronophage, c'est pourquoi j'aimerais pouvoir les compléter via l'utilisation de tableaux pour limiter le temps d'exécution. Mais je ne sais pas bien dimensionner les tableaux

Voici ce que la macro serait supposée faire :

Remplir les lignes vides (de la colonne "X" à la colonne "CD").

Pour cela, il faut que col "NOM_VALIDE_TAXREF" = col "NOM_COMPLET" = col "NOM_VALIDE".

Si c'est bien le cas et qu'il existe des lignes vides à compléter, alors copier la ligne (col "X" to "CD") et la coller en colonne "X" pour chaque ligne vide jusqu'à la prochaine ligne pleine vers le bas.

Les lignes vides sont toujours situées en fin de "bloc" jusqu'à la prochaine ligne pleine.

On peut également vérifier comme ceci : Si col "NOM_COMPLET" = "NOM_VALIDE_TAXREF" et col "NOM_COMPLET" = ""

J'espère que mes explications sont suffisamment limpides !

Je vous remercie de votre attention,

A plus tard !

resultat attendu resultat actuel
9alignement.xlsm (46.79 Ko)

Et voila le travail, c'est une macro

Pour tout PB

Toukoul

A+

4alignement001.xlsm (52.42 Ko)

Bonjour,

Effectivement, via des boucles ces opérations sont aisément réalisables, je vous remercie de votre proposition, en revanche, comme je disais

j'aimerais pouvoir les compléter via l'utilisation de tableaux pour limiter le temps d'exécution.

; c'est un traitement que j'aimerais appliquer sur un nombre conséquent de lignes et l'utilisation de boucles directement sur les données de ma table n'est pas la meilleure stratégie.

Encore merci

Bonne journée !

Combien de lignes

Et patienter 3 minutes pour l'exécution n'est pas rien face au confinement!!!

Je rigole!

Justement, 3 minutes c'est le temps que prennent les autres procédures, qui utilisent des tableaux.

En réalité, je ne suis même pas sur qu'Excel parvienne à finir cette tâche en bouclant sur les données (mon dernier test avait pris 7H00).

J'ai mis à jour le code que vous avez proposé pour qu'il réalise exactement ce que j'essayais de faire car certaines lignes n'étaient pas complétées :

Sub REMPLISSAGE()
Dim x$, a&, y&, lrre&, lcre&, nc As Byte, nvtx As Byte, nv As Byte, b%, c%, d%, e%, rng1 as range

With Sheets("Resultat")
lrre = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
lcre = .UsedRange.Columns.Count - 1
nvtx = .Range("1:1").Find("NOM_VALIDE_TAXREF", LookIn:=xlValues, Lookat:=xlWhole).Column
nc = .Range("1:1").Find("NOM_COMPLET_tmp", LookIn:=xlValues, Lookat:=xlWhole).Column
nv = .Range("1:1").Find("NOM_VALIDE", LookIn:=xlValues, Lookat:=xlWhole).Column

    For a = 3 To lrre
c = 0
        If .Cells(a, nc) = "" Then
        c = a
            For b = a To 2 Step -1
                If .Cells(b, nvtx) = .Cells(b, nc) And .Cells(b, nvtx) = .Cells(b, nv) Then
                    Set rng1 = .Cells(b, nc).Resize(, lcre - nc): Exit For
                End If
            Next b
e = a - 1
            rng1.Copy Destination:=.Cells(c, nc)
        End If
1    Next a
End With
End Sub

Je vais m'amuser à le lancer sur les 180 000 lignes de mon document et voir ce qu'il advient !

Edit : Je ne sais pas comment coller une ligne dans une plage de données ; si je trouve, le code peut être amélioré en bouclant sur les lignes vides

        For d = a To lrre
               If .Cells(d, nc) = "" Then: e = e + 1
               If .Cells(d, nc) <> "" Then: Exit For
           Next d
           

Et en collant la bonne ligne dans le range qui correspond au cellules vides à remplir.

A plus tard.

Private Sub Ligne_Change(ByVal Target As Range) 'Programme duplicata lignes calcul

If Target.Value <> 0 Then 'mettre ici le contrôle pour valider la copie

Sheets("Resultats").Rows("7:7").Select Selection.Copy ' ici copy de la ligne 7

Sheets("Resultats").Rows("8:8").Select Selection.Paste ' ici colage de la ligne sur la ligne 8

End Sub

Cette procédure est appelée ainsi :

Ligne_change range("a7")

a adapter a ton PB

Bonsoir,

Finalement, le temps de traitement n'est pas si long, j'ai relancé plusieurs fois les tests, en moins de 10 minutes tout est exécuté. Sachant que c'est un code que je suis censé ne lancer qu'une fois par an, ça ne devrait pas gêner.

A l'occasion, j'essaierai de passer par des tableaux, je pense savoir comment je dois m'y prendre.

Bonne fin de journée / week-end !

Rechercher des sujets similaires à "vba remplir vides tableau"