Résolu VBA: Selection de tableau (feuille de calcul)

Eth4nol

Nouveau membre
Bonjour tout le monde,

Je travaille sur un projet Excel utilisant des macros VBA plutôt simple à décrire:
- Un onglet principal (appelons le "Semaine_Courante") dans lequel j'ai créé plusieurs tableaux et là j'insiste bien car il ne s'agit pas de tableaux au sens VBA du terme mais de tableaux au sens Excel (différemment dit je ne parle pas de tableau() mais d'une plage de cellules créées via Accueil/Mettre sous forme de tableaux). J'en ai environ 10 dans la même feuille de calcul.
- Un autre onglet possédant exactement les mêmes tableaux que nous allons appeler "Historique" par exemple.

L'idée est toute bête: Le contenu des tableaux (chacun possédant environ 10 colonnes et un nombre variable de lignes) de l'onglet "Semaine_Courante" doit être transféré dans les tableaux respectifs de l'onglet "Historique".
Différemment dit le premier onglet sera amené à être "rafraîchi" (les lignes copiées seront supprimées) et l'autre stockera au fil du temps tout ce qui a été écris.


L'idée que j'ai serai de pointer vers ces objets que j'appelle tableaux (je me répète mais je fais référence aux tableaux de feuilles de calculs et non pas aux "arrays" au sens code) pour pouvoir insérer ce que je veux où je veux sans me soucier de quoi que ce soit.
Le souci étant le fait que les tableaux vont grossir au fil du temps ce qui m'empêche d'anticiper le numéro des lignes -> je ne peux donc pas bouriner à coup de Rows(xx).Insert (vous vous doutez bien que je me retrouverai à insérer des lignes du tableau 7, par exemple, au beau milieu du tableau 2 au bout d'un moment).

Cela fait plus d'une semaine que j'arpente les tutos/forums/site webs et autres et je n'ai trouvé NUL PART un moyen de faire référence à cette notion de tableau.
Tout ce que j'ai trouvé ressemble à du Range("XX").CurrentRegion qui fonctionne à merveille mais qui ne pourras pas être pérenne car, comme je vous l'ai dit, le nombre de lignes de l'onglet "Historique" augmentera au fil du temps...


Si quelqu'un sait comment "pointer" vers cette notion de tableau OU connaît une autre solution ça m'évitera de me jeter sous un train (oui oui j'en suis à ce point...).

Merci d'avance
 

drul

Obscur pro du hardware
Staff
Salut, si tes "tableaux" sont délimité par une ligne vide, tu peux utilisé RANGE("XXX").end(xlDown) pour déterminé la fin de ton tableau.

Pourquoi ne pas créer un nouvel onglet chaque fois que tu veux faire un historique ? se serait beaucoup plus simple à gérer, et certainement à utiliser également ... (bon quand on arrive à 287 onglets ça devient un peu pénible je l'avoue ...)
 

drul

Obscur pro du hardware
Staff
Meilleure réponse
Je t'invite aussi à regarder cet exemple:

 

Eth4nol

Nouveau membre
Salut Drul,

Merci beaucoup pour ton temps pour commencer :)

Ton idée de créer un onglet par tableau est en effet quelque chose qui m'est passé par la tête néanmoins c'est à proscrire de mon côté : J'aurai environ 10 onglets pour "Historique", potentiellement 10 de plus pour "Semaine_courante" et enfin rien n'empêche l'avenir de m'amener à devoir en créer plus, ça risque de faire beaucoup :s

J'aime bien ton idée d'essayer de déterminer la fin d'un tableau via "Range("XX").end(xlDown) malheureusement je vais me heurter encore et toujours au même problème :(
Je te donne un exemple avec 2 tableaux successifs:
A va de la ligne 1 à la ligne 10
B va de la ligne 12 (je met une ligne à blanc comme tu l'as proposé) à la ligne 20
Pour A: Range("A1").end(xlDown)
Pour B: Range("A12").end(xlDown)

Admettons qu'au fil du temps j'ai inséré 30 lignes dans A, ce dernier ira de 1 à 40 et mon Range("A12").end(xlDown) ne pourras plus déterminer la fin du deuxième tableau (en l'occurrence B) mais déterminera la fin du premier.
Du coup cette solution, bien que très maligne je te l'accorde ne peut pas marcher sur la durée :(

L'idéal serait de pouvoir manipuler cette notion de tableau, par exemple (j'invente complètement!):
Sheets("Mafeuille").TableauA.insert()...
Quelque chose qui y ressemblerai mais surtout qui me permettrait de ne pas avoir en rentrer de données statiques et donc d'avoir une macro qui marche peu importe ce que je bricole après.

Merci encore tout de même
 

drul

Obscur pro du hardware
Staff
Salut, mais non voyons,

Code:
'Pour A: 
Range("A1").end(xlDown)

'Pour B:
Range("A1").End(xlDown).Offset(2, 0).End(xlDown).Row
...


De manière générique pour n table:

Code:
Sub Macro1()
'
' Macro1 Macro
'
'
Dim TableStart As Range
Dim NombreDeTable As Long
Dim FinDeTable As Long

NombreDeTable = 2 'à toi de voir combien tu en as ...
'(remarque on peut très bien le déterminer, mais on verra ça dans un deuxième temps si tu le désire)

Set TableStart = Range("A1") 'première table

For i = 1 To NombreDeTable
    FinDeTable = TableStart.End(xlDown).Row
    MsgBox FinDeTable
    
    Set TableStart = TableStart.End(xlDown).Offset(2, 0)
Next
End Sub

Question: as-tu vu ma deuxième proposition ?
Le fait de nommée ta plage de cellule, te permet facilement de cibler ta table dans le VBA.
 

Eth4nol

Nouveau membre
Re coucou,

Bien vu, en effet si j'ai bien suivi (je n'ai pas encore mis en exécution ton code) ça devrait marcher et ce peu importe le nombre de tables (j'ai bien noté que tu possédais un tour dans ton sac pour déterminer automatiquement le nombre de tables ;)).
Mais j'en reviens à une inquiétude de base: tout cela risque d'être rigide si jamais l'utilisateur final bricole dans la feuille de calcul non?
Je te donne un exemple tout bête: Je décide arbitrairement d'utiliser A1 (dans les faits je prendrai plus du C4/C5 histoire de...) et puis bim quelqu'un décide de mettre tout un paquet d'entête décalant les lignes, ou bien encore de décaler des colonnes (va savoir hein). Tout d'un coup cela risque de faire planter un peu le code.

D'une manière plus générale je souhaite éviter autant que possible de coder en statique.

Ce qui m'amène à rebondir sur ton deuxième point.
Nommer les plages de cellules serait en effet l'idéal à l'exception du fait que ces dernières ne sont pas des tables :( J'ai besoin de cette flexibilité malheureusement.

Mis à part tout ça j'ai réussi, en fouinant via l'enregistreur de macro, à récupérer ceci:

ActiveSheet.ListObjects("MonTableau").PleinDeMethodes

Ceci m'a l'air de bien résoudre m'ont problème, qu'en penses tu?

Non seulement je peux accéder à mes tableaux de manière complètement transparente et pis surtout je n'ai pas à me soucier de leur emplacement dans la feuille de calcul.

Anyway, je garde sous le coude de tour de passe passe via l'utilisation de end(xlDown) qui m'a l'air fonctionnelle.

Merci énormément pour ton aide en tout cas!
 

drul

Obscur pro du hardware
Staff


C'est la même solution que tu as trouvés ...
 

Eth4nol

Nouveau membre
Hmmm Range("MonTableau") = ActiveSheet.ListObject("MonTableau")?
Ok je pensais qu'il s'agissait de deux choses différentes.

En tout cas merci Drul ;)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 000
Membres
1 586 387
Dernier membre
ouistititouille
Partager cette page
Haut