VBA Mise à jour automatique d'un fichier

Bonjour à tous,

Etant nouveau sur le forum et débutant en VBA, je viens vous demander un petit peu d'aide.

J'ai un fichier que je souhaiterai mettre à jour régulièrement en supprimant/ajoutant et en recalant les lignes devant les cellules correspondantes.

Pour ça je souhaiterai une macro me permettant d'automatiser ces mises à jour.

Je vous joins mon fichier ainsi qu'une description plus précise de ma demande (en espérant que ce soit compréhensible).

Je vous remercie d'avance pour le temps que vous m'accorderez.

118maj-auto-vba.xlsm (251.47 Ko)

Bonjour,

Est-ce que tu pourrais clarifier ton propos ! Cela veut-il dire que ton tableau ne doit contenir que les lignes existant dans la base ?

Soit à l'arrivée d'une nouvelle base, on ajoute les ligne de la base manquantes dans le tableau et on supprime les lignes du tableau ne figurant plus dans la base ?

Bonjour,

En fait, la base est extraite d'une autre base de donnée.

chaque semaine je vais extraire cette nouvelle base, elle comportera alors les mêmes lignes que l'ancienne à l’exception que des lignes auront pu être supprimées et des nouvelles peuvent apparaître.

Donc oui, les colonnes de "A à I seront les mêmes que dans la base.

Ce qui m'intéresse c'est donc de remplacer l'ancienne base par la nouvelle tout en gardant les informations rentrées à la main (dans les dernières colonnes) et qu'elles se retrouvent bien sur les bonnes lignes.

Puisque des lignes ont été supprimées il faut supprimer les informations des colonnes "J à M" correspondantes et ajouter des cases à remplir pour les nouvelles.

Si tu pouvais ne pas embrouiller en répondant dans les mêmes termes à une question, on gagnera du temps !

Je parle de lignes, une ligne de la feuille est une ligne entière. Une ligne de ton tableau ira de A à M. Une ligne de ta base, de A à I. La partie A à I est commune aux deux feuilles. Elle permet d'identifier si une ligne de la base est dans le tableau ou non.

A cet égard, il serait bon de savoir si un champ de la base constitue un identifiant unique, c'est à dire ne comportant aucun doublon, et suffisant à lui seul pour identifier la ligne.

Si une ligne de la base est absente du tableau, on l'ajoute ! (il n'y a pas lieu de se préoccuper des colonnes au délà de I... on ajoute A à I sur une ligne vide, les cellules de J à M seront présentes mais vides !)

Si une ligne du tableau n'est plus dans la base on la supprime ! (la ligne entière ! il n'y a rien à droite du tableau !)

NB- la colonne B semble être un identifiant sans doublon, il faudrait le confirmer.

Oui, la colonne B est un identifiant sans doublons.

C'est noté ! Mais on aborde la soirée chez moi, et une pause s'impose ! A+

Bonjour,

Je suppose que pour les éléments de la base trouvés dans le tableau, il n'y a rien à faire... ?

Bonjour,

non les éléments de la base ne peuvent pas être modifiés.

Bonjour,

Voilà qui devrait répondre à ta demande, si j'ai bien compris...

Sub MajTablo()
    Dim NBas As Range, n%, nn%, i%, bt&
    With Worksheets("base")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set NBas = .Range("A2:I" & n)
        NBas.Sort key1:=.Range("B2"), order1:=xlAscending, Header:=xlNo
    End With
    With Worksheets("tableau")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row: nn = n + 1
        .Range("A2:M" & n).Sort key1:=.Range("B2"), order1:=xlAscending, Header:=xlNo
        For i = NBas.Rows.Count To 1 Step -1
            bt = NBas.Cells(i, 2)
            Select Case .Cells(n, 2).Value
                Case Is < bt
                    .Cells(nn, 1).Resize(, 9).Value = NBas.Rows(i).Value
                    nn = nn + 1
                Case Is = bt
                    n = n - 1
                    If n = 1 Then Exit For
                Case Is > bt
                    .Rows(n).Delete
                    n = n - 1: nn = nn - 1: i = i + 1
                    If n = 1 Then Exit For
            End Select
        Next i
        Select Case n
            Case Is = 1
                i = i - 1
                Do While i > 0
                    .Cells(nn, 1).Resize(, 9).Value = NBas.Rows(i).Value
                    nn = nn + 1: i = i - 1
                Loop
            Case Is > 1
                Do While n > 1
                    .Rows(n).Delete
                    n = n - 1
                Loop
        End Select
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        .Range("A2:M" & n).Sort key1:=.Range("A2"), order1:=xlAscending, Header:=xlNo
        .Activate
    End With
End Sub

Le procédé est simple. Phase préparatoire : on trie la base sur la colonne B et pareil pour le tableau (tri croissant).

On opère ensuite à partir d'un boucle remontante sur la base : on cale au départ la ligne à comparer sur la dernière ligne du tableau :

  • si la valeur en B est inférieure à celle de la base : c'est un élément de la base à ajouter : on l'ajoute en fin et on se recale sur la ligne au-dessus du tableau pour le tour suivant ;
  • si la valeur en B est supérieure à celle de la base : l'élément du tableau est à supprimer : on supprime et on se recale sur la ligne au-dessus du tableau, et on désincrémente i pour repasser la même valeur de la base (non trouvée...) ;
  • si les valeurs sont égales : on continue en se recalant sur la ligne au-dessus du tableau...
A chaque opération on ajuste le suivi de la première ligne vide sur le tableau pour insertion éventuelle, et on suit le calage sur le tableau pour sortir de la boucle principale lorsqu'on atteint la première ligne du tableau.

Phase complémentaire : i suit l'évolution dans la base, n l'évolution dans le tableau. A la sortie de boucle, n peut être égal à 1 (on en est sorti parce qu'il atteignait cette valeur) ou encore supérieur.

Si n=1 (on a parcouru tout le tableau avant que la boucle sur la base arrive à son terme) : tous les éléments non encore parcourus de la base sont donc à ajouter (s'il y en a), et on les ajoute.

Si n>1 (on est sorti de la boucle avant d'avoir parcouru tout le tableau) : il n'y a plus d'éléments dans la base, et tous les éléments non parcourus du tableau sont à supprimer, ce qu'on fait.

On retrie le tableau sur les dates (colonne A) et on affiche la feuille.

NB- J'ai placé un bouton de test sur la feuille Demande... si on utilise un bouton pour lancer la macro, il est préférable qu'il ne soit pas sur la feuille tableau ! (car c'est celle sur laquelle on opère, si on lance l'opération avec le tableau comme feuille active il conviendrait alors d'inhiber le rafraîchissement de l'affichage... ce qui est inutile si comme prévu la feuille tableau n'est pas affichée à l'écran durant l'opération). [Pour que VBA travaille vite, tout doit se passer hors de vue de l'utilisateur...!]

Cordialement.

efficacité, rapidité et pédagogie.

C'est parfait, cela fonctionne très bien pour l'instant.

Merci beaucoup et bonne journée.

Rechercher des sujets similaires à "vba mise jour automatique fichier"