Bonjour,
Je cherche le code pour sélectionner un tableau et copier / coller les lignes jusqu'au prochain tableau, puis copier sur un autre onglet.
J'ai une étape intermédiaire qui consiste à trouver le numéro d'une question (ici ADHOC10. Image - Top 2 Box Summary), sachant que cette question peut potentiellement être à des lignes différentes d'un fichier à un autre (ici A31 mais peut se trouver en A1200 sur un autre fichier).
Fondamentalement, sur cet exemple, je souhaiterai copier les lignes 31 à 61 (ou 60 si possible) et les coller sur un autre onglet.
Auriez-vous une solution à me proposer ?
Merci par avance et à disposition si je ne suis pas clair, le language VBA reste assez obscur pour moi
Sub copieTableaux()
Dim c As Range, d As Range, e As Range, t As Integer, ws As Worksheet
Set c = Feuil1.Range("A1") 'cellule c = début du tableau
Set e = Feuil1.Range("B1000000").End(xlUp).Offset(1, -1) 'dernière ligne de tous les tableaux
Do
Set d = c.Offset(2).End(xlDown).Offset(-1) 'cellule d = fin du tableau à copier
Set ws = Application.Sheets.Add(after:=ThisWorkbook.Sheets(Sheets.Count)) 'insérer un onglet
t = t + 1
ws.Name = "Top" & t 'nom de l'onglet
Feuil1.Range(c, IIf(d.Row > e.Row, e, d)).Resize(, 11).Copy ws.Cells(1, 1) 'copie du tableau qui démarre à c et finit à d (ou e pour le dernier tableau)
Set c = d.Offset(1)
If d.Row > 1000000 Then Exit Do
Loop 'on passe au tableau suivant
End Sub
la boucle fonctionne ainsi :
elle copie les tableaux qui vont de c à d
1er tour c = A1, d = [A3].end(xldown).offset(-1) soit = A30 (équivaut à taper sur Ctrl+flèche du bas depuis la cellule A3)
A1:A30 sur 11 colonnes est copié sur un nouvel onglet
c devient d.offset(1) et on recommence, donc
2ème tour :
c = A31 , d = [A33].end(xldown).offset(-1) soit = A60
A31:A60 sur 11 colonnes est copié sur un nouvel onglet
et ainsi de suite ...
On quitte la boucle lorsque d tombe sur une ligne >1000000
Bonjour,
Merci beaucoup, c'est excellent ! Exactement ce que je souhaite. Et merci pour les explications qui permettent de comprendre un peu mieux la logique.
J'aurai une question complémentaire : si, sur les 3 tableaux, je ne souhaite en extraire qu'un seul (ADHOC10. Image - Top 2 Box Summary par exemple, tableau du milieu donc) dans un fichier contenant bien plus de lignes et sur plusieurs fichiers différents qui n'auront pas la même structure (par exemple, une fois ce tableau sera en ligne 1200, parfois 1300 etc).
Serait-il possible d'ajouter une fonction qui lui dit de trouver tel tableau puis de le copier dans un onglet spécifique ("ADHOC10" par exemple) ?
Au final, je souhaite uniquement extraire certains tableaux. Je devrais très certainement ajuster les boucles (numéros de questions / noms d'onglet) selon mes besoins mais ce n'est pas très grave.
J'ai essayé d'ajouter ces lignes mais cela ne fonctionne pas :
Cells.Find(What:="ADHOC10. Image - Top 2 Box Summary", After:=ActiveCell, LookIn:=xlFormulas2, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Pour choisir le tableau à copier, je vous propose cette évolution de la macro précédente.
Elle propose une liste de tous les tableaux trouvés. Lorsque vous cliquez sur son nom, l'adresse du tableau apparaît. Facile de le copier ailleurs à partir du code précédent.
Il faut donc un petit Userform, avec juste un contrôle Listbox (qui affiche tous les noms de tableaux) et un contrôle Label pour afficher son adresse quand sélectionné.
Ce code à placer dans le module de l'Userform :
VB:
Private Sub ListBox1_Click()
Label1.Caption = listeTableaux(2, ListBox1.ListIndex + 1) 'Montrer l'adresse du tableau sélectionné dans le label
End Sub
Private Sub UserForm_Initialize()
For t = 1 To UBound(listeTableaux, 2)
ListBox1.AddItem listeTableaux(1, t) 'Afficher chaque Tableau dans la listbox
Next
End Sub
La macro déclenchée par le bouton "Copier un seul Tableau" :
VB:
Public listeTableaux() 'Variable commune au bouton et à l'Userform à déclarer en Public et en tête de Module
Sub copieUnSeulTableau()
Dim c As Range, d As Range, e As Range, t As Integer
ReDim listeTableaux(1 To 2, 1 To 1)
Set c = Feuil1.Range("A1") 'cellule c = début du tableau
Set e = Feuil1.Range("B1000000").End(xlUp).Offset(1, -1) 'dernière ligne de tous les tableaux
'récupérer la liste des tableaux dans la variable ListeTableaux
Do
Set d = c.Offset(2).End(xlDown).Offset(-1) 'cellule d = fin du tableau à copier
t = t + 1
ReDim Preserve listeTableaux(1 To 2, 1 To t) 'Variable évolutive qui va recenser tous les noms de Tableaux et leurs adresses
listeTableaux(1, t) = c 'L'entête du Tableau
listeTableaux(2, t) = Range(c, IIf(d.Row > e.Row, e.Offset(-1, 11), d.Offset(-1, 11))).Address 'Son adresse
Set c = d.Offset(1) 'le début du tableau suivant se trouve sous le précédent
Loop Until d.Row > 1000000 'on passe au tableau suivant tant qu'on est pas en bout de feuille
UserForm1.Show 'affichage des résultats dans une boîte de dialogue
End Sub
Merci pour votre retour.
C'est effectivement une solution, mais étant donné que j'ai environ 200 fichiers à traiter, cette solution me paraît compliqué à appliquer actuellement. Je vais tenter d'expliquer ma problématique plus globalement
De base, j'ai un fichier tel qu'en exemple avec une centaine de tableaux.
J'ai besoin de 2 types d'informations :
- récupération d'une ligne de temps pour certaines questions. J'ai ensuite dupliqué et adapté les boucles pour les données dont j'ai besoin (sûrement très basique et améliorable, mais ca tourne) :
En gros, je cherche une variable (ou tableau), je descends de x lignes, copie un texte qui est repris derrière par des rechercheX.
Ensuite, pour certains tableaux, je souhaiterai extraire la totalité du tableau pour pouvoir les travailler plus facilement par la suite sans avoir à les rechercher.
Serait-il possible de faire une boucle un peu similaire avec les "fonctions" suivantes :
- rechercher une variable
- sélectionner la première ligne et descendre jusqu'à la première ligne non vide (tableau suivant)
- copier / coller dans un nouvel onglet
Je dupliquerai cette boucle pour les tableaux dont j'aurai besoin au final
Je suis désolé si ma demande n'était pas hyper claire au début...
Pas encore certain d'avoir compris la question... Alors pour le fun.
Cliquer sur le bouton Hop!
Dans la listbox qui s'affiche :
un clique sur un élément sélectionne les deux lignes correspondantes au sein de la listbox et affiche le tableau concerné dans le coin supérieur gauche de la feuille de tous les tableaux
un double-clique sur un élément crée une nouvelle feuille juste après la feuille des tableaux et y copie le tableau concerné.
nota: comme la listbox contient pour chaque ligne, la ligne de début du tableau et la ligne de fin (colonnes masquées 2 et 3 de la listbox), on a une lecture directe des limites de chaque tableau et on peut facilement adapter le code à ses désirs.
Pas encore certain d'avoir compris la question... Alors pour le fun.
Cliquer sur le bouton Hop!
Dans la listbox qui s'affiche :
un clique sur un élément sélectionne les deux lignes correspondantes au sein de la listbox et affiche le tableau concerné dans le coin supérieur gauche de la feuille de tous les tableaux
un double-clique sur un élément crée une nouvelle feuille juste après la feuille des tableaux et y copie le tableau concerné.
nota: comme la listbox contient pour chaque ligne, la ligne de début du tableau et la ligne de fin (colonnes masquées 2 et 3 de la listbox), on a une lecture directe des limites de chaque tableau et on peut facilement adapter le code à ses désirs.
Ah mince
Ca doit être clair dans mon esprit, mais pas dans mes explications ! J'en suis désolé !
Je joins un fichier original (avec ma macro version "débutant" mais qui me suffit pour la première partie du job), peut-être que ce sera plus simple.
La macro que vous proposez me convient car effectivement, je peux choisir directement les variables (jargon de mon boulot) / tableaux souhaités et les exporter. C'est parfait ! En revanche, la macro ne fonctionne pas sur un autre fichier : j'ai l'erreur suivante "l'indice n'appartient pas à la sélection". Est-ce normal ?
Fondamentalement, j'imaginais une macro où je lui dis :
- rechercher tel tableau (par exemple "ADHOC10. Image - Top 1 Box Summary")
- sélectionner le tableau
- le copier coller dans un onglet
- rechercher un autre tableau et ainsi de suite
Je vais avoir environ 200 fichiers contenant une centaine de tableaux chacun, qui sont identiques en nom de tableau, mais avec un nombre de lignes qui pourra varier d'un fichier à un autre. Ce qui m'empêche donc d'utiliser des codes avec des positions fixes. Sur un fichier, le tableau ADHOC10. Image - Top 1 Box Summary sera en ligne 1200, puis dans le suivant, il sera en ligne 1232 et ainsi de suite.
J'aurai juste besoin d'une boucle en exemple, que je dupliquerai par la suite pour les variables donc j'ai besoin (une dizaine grosso modo).
Merci par avance et désolé mais mon langage "informatique" est loin d'être optimal