Microsoft 365 Macro VBA : sélectionner une zone jusqu'à la prochaine cellule pleine

ALF75

XLDnaute Nouveau
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 :)

Bonne fin de journée,

Adrien
 

Pièces jointes

  • Macro.xlsx
    14 KB · Affichages: 11

Softmama

XLDnaute Accro
Bonjour,

Cette macro fait le job :

VB:
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

cf. votre fichier en PJ.
 

Pièces jointes

  • Macro.xlsm
    26.2 KB · Affichages: 3
Dernière édition:

ALF75

XLDnaute Nouveau
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

Merci par avance pour votre retour,

Bonne journée,

Adrien
 
Dernière édition:

Softmama

XLDnaute Accro
Bonjour,

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

Le fichier en PJ.
 

Pièces jointes

  • Macro.xlsm
    29.5 KB · Affichages: 3

ALF75

XLDnaute Nouveau
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) :

VB:
Cells.Find(What:="ADHOC3.", after:=ActiveCell, LookIn:=xlFormulas2, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Worksheets("Output").Activate
ActiveCell.Offset(rowOffset:=9, columnOffset:=0).Activate
ActiveCell.FormulaR1C1 = "adhoc3t1"
ActiveCell.Offset(rowOffset:=7, columnOffset:=0).Activate
ActiveCell.FormulaR1C1 = "adhoc3t2"
ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
ActiveCell.FormulaR1C1 = "adhoc3t3"
"Output" étant le nom de mon onglet de travail.

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...

Merci encore et excellent après-midi,

Adrien
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @ALF75 :), @Softmama ;),

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.
 

Pièces jointes

  • ALF75- copie tableau- v1.xlsm
    34.9 KB · Affichages: 3
Dernière édition:

ALF75

XLDnaute Nouveau
Bonjour @ALF75 :), @Softmama ;),


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 :)

Bonne journée à vous,

Adrien
 

Pièces jointes

  • Fichier complet exemple.xlsm
    387.3 KB · Affichages: 2

soan

XLDnaute Barbatruc
Inactif
Bonjour mapomme,

Cliquer sur le bouton Hop!

Image.jpg

soan
 

Discussions similaires

Statistiques des forums

Discussions
312 318
Messages
2 087 208
Membres
103 493
dernier inscrit
Vidal Salvador