VBA - Aide sur macro - boucle Tableau

Bonjour à tous,

Je viens vers vous afin d'obtenir de l'aide sur une macro VBA, trop ambitieuse par rapport à mon niveau dans ce langage :). Je dois faire un fichier, qui comporte deux onglets "projets" et "ok" qui comportent le même tableau (même colonnes). Je souhaiterai implémenter une macro sur la feuille projet mais après plusieurs essais cela ne fonctionne pas.

Voici l'explicatif de ce que je souhaiterais faire, écrit de manière algorithmique :

Pour chaque ligne de mon tableau

Si la colonne "P" de la ligne concernée n'est pas vide

je coupe la ligne entière de mon onglet actuel

je vais dans mon second onglet (nommé "OK")

je vais à la dernière ligne (ou la première ligne vide) du tableau présent dans cet onglet

je colle la ligne précédemment sélectionnée

je retourne dans le premier onglet (nommé "projet")

je supprime la ligne coupée

Fin Si

Prochaine ligne

Fin boucle

Tout ça est bien cool, mais mon niveau actuel en VBA me fait m'arracher les cheveux lol. Ce que je ne sais pas faire:

- faire la boucle sur tout mon tableau (qui comporte 3000 lignes)

- dire à Excel qu'il doit chercher le contenu de la colonne "P" de la ligne qu'il regarde

- dire à Excel qu'il me coupe la bonne ligne

J'ai essayé de faire cette manip avec l'enregistreur de macro, mais cela ne fonctionne pas….

Par avance merci au ninja de VBA qui m'aidera à réaliser cette macro ;)

Bon week-end à vous :)

Edit 1: Ajout d'un squelette de fichier ressemblant à mon fichier original

11classeur1.xlsm (20.64 Ko)

Bonjour,

Je reformule : Comme dans le premier tableau toutes les lignes sont remplies, je coupe tout et je le met sur le tableau Ok.

Par contre il y a un problème : Ou je mets TOUSSA ?

Ce genre de tableau ne devrait comporter que des lignes pleines. ou une seule ligne vide si comme dans ton Tableau Ok il n'y a rien dedans.

Donc bien vouloir confirmer que le tableau "Cible" sera toujours vide ou toujours plein mais un tableau plein de lignes vides ça, on ne sait pas trop faire !

A+

Bonjour,

Merci pour ta réponse. En fait, les deux tableaux auront des données. la macro s'exécute sur la feuille "projet". Je veux juste prendre la ligne (si c'est possible bien sur) qui comporte la case de sa colonne "P" remplie, couper toute la ligne, basculer sur l'onglet "ok", ALLER A LA DERNIERE LIGNE de ce tableau, et coller.

Dans mon fichier d'exemple, il est vide effectivement, c'est à titre d'exemple mais je te confirme que la feuille nommée "ok" aura des données.

Comme indiqué en intro je crois que cette macro est ambitieuse. Si tu me dis que c'est pas réalisable, je comprendrais lol

Ce dont j'ai besoin d'être certain c'est que toutes les lignes du tableau cible seront remplies et surtout qu'il n'y aura JAMAIS de lignes vides à la fin.

Re,

Merci de ton aide et désolé de ne pas être clair. Pour l'instant (et pas sur l'exemple mais sur mon fichier "officiel") j'ai crée le tableau "projet" avec 3000 lignes, et simplement dupliqué cet onglet, conservé uniquement le nom des colonnes. Il fait donc pour le moment 3000 lignes. Mais si tu me dis que c'est mieux de ne pas laisser de lignes vides, je reformate mon tableau à la dernière ligne remplie des données qu'il doit contenir (pour être plus clair: si j'ai 92 lignes à mettre pré-macro dans "ok", je reformate le tableau à la ligne 92).

Bonjour,

Ecoute... Un tableau structuré ne devrait pas comporter de ligne vide...

Sauf s'il est complètement vide, auquel cas seul la ligne 2 est complètement vide.

J'ai fait en sorte que ligne vide ou pas les lignes s'ajoutent à la fin du tableau Cible.

Il n'y a qu'un impératif le tableau Source doit être renommé TSrc et le tableau Cible oit être renommé TCbl dans le gestionnaire de Noms.

A+

8thenoob-vg.xlsm (26.71 Ko)

Une proposition. J'ai renommé ta feuille OK pour ne pas y toucher. Tu auras peut-être une piste.

16proposition4.xlsm (25.82 Ko)

Re,

Vraiment déjà merci à vous deux. Quand je regarde vos codes je me dit que le chemin vers le top en VBA est encore loin :).

Le résultat le plus proche de ce que je souhaite serait celui d'Optimix. Merci infiniment. Dois-je passer par la création d'un bouton pour lancer la macro?

Vraiment merci vous êtes top!

Bonsoir …

On peut trouver le chemin long quand on ne prend pas de raccourcis .

L’un d’eux, incontournable dans le traitement de bases de données (pas gigantesques pour Excel !), est l’utilisation des Tables, appelées maintenant Tableau (Classe ListObjects).

Beaucoup hésitent à les utiliser sans doute effrayés par tout le vocabulaire (théorique) proposé, utilisé.

On peut aisément passer à la Pratique, en se servant de la syntaxe de base de la classe Range, pour ne penser qu’aux nombreuses propriétés rattachées à ce type d’objet donc en faisant l’impasse sur la syntaxe particulière.

En voici un exemple de codes dont le but est de déplacer des informations d’un tableau nommé ici BD dans un tableau nommé TP (selon les 3 phases classiques : copier, coller, supprimer) rédigés en termes de bases.

Private Sub Cb_Click()
‘déclaration des variables L entier pour N° de ligne, P plage de cellules
    Dim L As Integer, P As Range
‘ligne d’écriture dans le Tableau TP (1 s’il est vide ,n° de la première ligne sous lui)
    L = IIf(Application.CountA([TP]) = 0, 1, [TP].Rows.Count + 1)
‘tableau BD filtré selon la colonne 16 avec les cellules non vides
    [BD].AutoFilter 16, "<>"
‘Plage des lignes de cellules non vides (12 dans ce cas) à copier)
    Set P = [BD].SpecialCells(12)
‘Copie dans le tableau TP à partir de L première ligne sous ce tableau (voir ci-dessus)
    P.Copy [TP].Item(L, 1)
‘Suppression des lignes non vides
    P.Delete
‘Suppression du filtre
    [BD].AutoFilter
End Sub

Nota : on peut déplacer les tableaux sans toucher à la macro, même dans d’autres onglets. Il n’est donc pas nécessaire d’avoir recours au référencement aux feuilles où ils sont définis, donc de se casser la tête pour savoir dans quel module écrire les procédures les concernant (en évitant, toutefois, les modules de Classe).

Ici, voir fichier joint, j’ai laissé le message d’alerte automatique concernant la suppression de lignes mais on peut ne pas le mettre sachant qu’il n’y a pas d’erreur.

Il faut quand même être prudent, quand on teste, en faisant une sauvegarde préalable.

Ctrl S permet de le faire rapidement mais en écrasant la version en cours.

J’ai volontairement écrit les actions en termes raccourcis (pour ceux qui voudront le faire par la suite). Il est facile de retrouver les syntaxes de base avec l’enregistreur de macro qui parfois est trop bavard.

J’ai choisi le lancement avec un bouton de commande mais on peut s’en dispenser quand le travail est prévu dans l’activation de l’onglet récepteur.

Bonjour,

Ordonc : Cette méthode m'intéresse pour un autre problème. Est-il possible de récupérer les données filtrées dans un Array ?

A+

Dois-je passer par la création d'un bouton pour lancer la macro?

Non, le bouton n'avait qu'un rôle pédagogique. Tu peux lancer la macro normalement : Affichage...Macros...Afficher les macros...Macro1.

Merci Ordonc, c'est plus qu'intéressant.

Re …

Merci pour les retours .

Oups, tout d’abord, j’ai mis le fichier sans le bouton et j’ai oublié d’ajouter au tout début du code la ligne pour éviter de filtrer une colonne vide :

If Application.CountA([BD].Columns(16)) = 0 Then Exit Sub

De même, j’ai oublié de préciser qu’il fallait valider la suppression sous peine d’être embêté à la relance de la macro (résultat non conforme) donc, que le plus simple est d’insérer les 2 lignes avant puis après la suppression directe permettant d’éviter cela :

   Application.DisplayAlerts = 0
   P.Delete
   Application.DisplayAlerts = 1

@Galopin , il est possible de faire n’importe quoi (même des erreurs ) cependant Excel réagit plus ou moins bien. Le problème principal qui accompagne le filtre est la récupération de plages de cellules discontinues.

On peut bien mettre en place un Array mais en passant par une boucle.

Je sais que l’utilisation d’un tel tableau (VBA) est beaucoup plus rapide qu’une plage (Range) donc, à mon avis, que celle-ci n’est intéressante qu’avec de gain substantiel de vitesse du traitement (données en nombre énorme). Voilà pourquoi, ici, je me suis restreint au passage par un « Range ».

Bonjour à tous,

Désolé pour la réponse tardive. J'ai présenté vos modifications, et tout le monde a vraiment apprécié. Reste plus que la mise en service maintenant :).

Vous m'avez réellement enlevé une grosse épine du pied, je vous en suis reconnaissant.

Je passe le sujet ne résolu, merci encore :)

Rechercher des sujets similaires à "vba aide macro boucle tableau"