Construire un tableau(VBA) à partir d'une extraction d'unERP
Bonjour à tous,
Je débute dans excel, mais j'ai déjà utilisé le langage VB il y quelques années...
J'ai un petit soucis pour construire un tableau, je vous explique :
J'ai donc 3 pages dans un même classeur dont deux son des extractions.
Sur la première je souhaite construire un tableau en récupérant les données sous les autres pages en utilisant que certaine colonne car je n'ai pas besoin de toutes les infos
Le soucis c'est que je suis toujours bloqué par des erreurs. Je pense qu'il manque des choses dans mon langage vb soit des déclarations de variables ou mal déclaré mon tableau...
J'ai voulu également compter les lignes sur l'extraction d'une page...
Voici mon code :
'Compte le nombre de ligne dans l'extraction
Dim derniere_ligne As Byte
derniere_ligne = Sheets("Feuil3").Cells.SpecialCells(xlCellTypeConstants).Count
'Déclaration Tableau
Dim Tabl_ordo()
ReDim Tabl_ordo(derniere_ligne - 2, 7)
For i = 0 To derniere_ligne()
Tabl_ordo(i, 0) = Worksheets("Extraction OP-OF").Range("B1").Value
Tabl_ordo(i, 1) = Worksheets("Extraction OP-OF").Range("F1").Value
Tabl_ordo(i, 2) = Worksheets("Extraction OP-OF").Range("G1").Value
Tabl_ordo(i, 3) = Worksheets("Extraction OP-OF").Range("L1").Value
Tabl_ordo(i, 4) = Worksheets("Extraction OP-OF").Range("N1").Value
Tabl_ordo(i, 5) = Worksheets("Extraction OP-OF").Range("O1").Value
Next
Merci par avance pour votre aide
Et si vous n'avez pas compris j'ai mis un exemple de mon fichier en restreint.
Bonjour,
Mets un fichier correspondant à ta demande, et avec ton code complet...
J'ai commencé à le réécrire, mais avec un fichier qui n'y correspond nullement j'ai toutes chances de perdre mon temps !
Cordialement.
oups, pardon..
Je me suis fait également avoir car quand je l'ai ouvert plus rien, je n'ai pas enregistré en prenant compte les macros ...
Je vous ai mis le fichier, le vrai avec le code.
Désolée encore.
Re,
Mal parti avec une procédure d'évènement... !
Note que les évènementielles sont réservées à des actions qui se déclenchent automatiquement à la survenance d'évènements, sans intervention de l'utilisateur. Inadapté à ton cas où il s'agit de réaliser une action au moment décidé...
Les modules de feuille doivent être en principe réservés aux procédures d'évènements. Les procédures ordinaires (la majorité du code trouve place dans un Module standard.
L'utilisation d'un tableau Excel pour recueillir les données est une bonne idée. Excel nomme automatiquement ce tableau : le nom figure au gestionnaire de noms et correspond à la partie données du tableau (hors en-tête), il est utilisable en VBA comme un nom de plage nommée, et on l'utilisera donc !
A titre préparatoire, sur la première ligne (vide encore) du tableau préparé, il convient de mettre au format voulu les cellules dont le champ a un format particulier : la D (0,000) et E et F au format date. Lorsqu'on insèrera des données, Excel les incorporera automatiquement au tableau en l'étendant et répercutera le format de la première cellule à l'ensemble du champ, sans que l'on ait à le faire...
Sub Lizouille()
Dim Tabl_ordo(), col, n%, i%, j%
col = Array(2, 6, 7, 12, 14, 15)
With Worksheets("Extraction OP-OF")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
ReDim Tabl_ordo(n - 2, 5)
For i = 2 To n
For j = 0 To 5
Tabl_ordo(i - 2, j) = .Cells(i, col(j)).Value2
Next j
Next i
End With
[Tableau2].Cells(1, 1).Resize(n - 1, 6).Value = Tabl_ordo
End SubParticularités par rapport à ton code initial :
On travaille pour l'essentiel sur la feuille Extraction [Ne pas confondre nom de feuille (Name) avec son nom de code (CodeName), l'index de feuille pour l'utilisation de Sheets ou Worksheets est le nom ou la position dans le classeur], on la met donc sous bloc With : on a toujours intérêt à le faire dès la moindre répétition, on gagnera toujours quelque chose et le code sera plus court !
Ne prélevant que certaines colonnes non consécutives, on établit un tableau des numéros de colonnes à prélever, de façon à opérer en boucle (en évitant les énumérations fastidieuses répétitives...
Comme on le peut, on redimensionne exactement le tableau de résultats aux données à prélever (tenir compte que les indices du tableau partent de 0 et que l'on commence le prélèvement ligne 2).
Double boucle, pour parcourir les lignes et prélever les champs voulus dans chaque ligne...
Prélèvement en utilisant la propriété Value2 de l'objet Range (au lieu de la propriété Value par défaut) : elle a pour particularité de dépouiller les dates de leurs attributs de reconnaissance textuelle (sous forme de valeur numérique donc), ce qui permet d'éliminer tout risque d'inversion mois/jour (à laquelle se livrerait VBA intempestivement en identifiant un texte comme date, au format américain qui lui est natif...). Dans ce cas, il faudrait rétablir le format de cellule adéquat ensuite, car on affecterait des nombre, mais la préparation initiale du tableau fait qu'Excel s'en chargera lui-même !
Pour l'affectation : on utilise le tableau (pas de passage par la feuille), on redimensionne à partir de la première cellule de données du tableau Excel une plage correspondant en lignes et colonnes à notre tableau de résultats, à laquelle on affecte ledit tableau...
Je suppose que c'était bien la méthode recherchée, vu ton orientation de départ... Je soulignerai qu'on se contente d'une ligne de code, et que cette méthode, exclusive à VBA, est plus rapide qu'un copier-coller. Elle est à privilégier dès lors que l'on n'a à transférer que des valeurs...
Cordialement.
Merci MFerrand pour se retour détaillé.
Effectivement je me souviens vaguement des procédure, fonction, ... Je pense que je vais devoir ressortir mes cours
J'ai compris le code après plusieurs lecture. Effectivement des petites erreurs que je ne connaissais pas.
En tout cas, très bien expliqué, j'ai compris mes erreurs. Le fichier n'est qu'au début du développement, je dois par la suite créer un planning...
Je pense que j'aurai d'autre question à l'avenir
Merci beaucoup de votre aide.
Bon après-midi.