VBA création de tableau à partir d'une base de données

Macgiy

XLDnaute Nouveau
Bonsoir à tous,

Je viens aujourd'hui parce que j'aimerai un peu d'aide sur la création d'un tableau à l'aide de VBA.

Je m'explique plus précisément et je joindrais à ce message mon fichier exemple.

Je dispose dans une première feuille d'une base de données classée par année. Puis une colonne début avec la date, une autre fin avec la date et une troisième avec le type.
J'aimerais donc créer un tableau récapitulatif (cf deuxième feuille du fichier exemple) qui en fonction du type me renvoi la date de début et de fin mais sans prendre les années intermédiaire.

L'explication est un peu brouillonne je pense mais avec le fichier très facile à comprendre. Il est impératif de garder la gestion de la base de la manière présentée.

Et pour résumé il y la base qui est présentée dans la première feuille et le résultat auquel je souhaite arrivé dans la deuxième feuille.

Je souhaite réalisé cette opération avec une macro de manière à l'automatisé parce que les données sont amenées à être changées et c'est pour de ce fait imprimer des reporting rapidement.

Je vous remercie d'avance.
 

Pièces jointes

  • classer produit test.xlsx
    10.3 KB · Affichages: 146

Dranreb

XLDnaute Barbatruc
Re : VBA création de tableau à partir d'une base de données

Bonsoir.
Ce code dans le module Feuil2 de la feuille Récap fait l'affaire avec vos données :
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim SCSuppr As Range
Application.ScreenUpdating = False
Feuil1.[D3].Resize(Feuil1.[D60000].End(xlUp).Row - 2, 3).Copy Me.[C5]
With Me.Rows(5).Resize(Me.[C60000].End(xlUp).Row - 4)
   .Columns("B").FormulaR1C1 = "=ROW()-4"
   .Columns("B").HorizontalAlignment = xlCenter
   .Columns("H").FormulaR1C1 = "=AND(RC5=R[-1]C5,RC3=R[-1]C4+1)"
   .Cells(1, "H").Value = False
   .Columns("G").FormulaR1C1 = "=IF(R[1]C[1],R[1]C,RC4)"
   .Columns("F").FormulaR1C1 = "=IF(RC[2],""Suppr"",RC[1])"
   .Columns("D").Value = .Columns("F").Value
   .Columns("F:H").ClearContents
   .Columns("D").SpecialCells(xlCellTypeConstants, 2).EntireRow.Delete
   End With
End Sub
 

Macgiy

XLDnaute Nouveau
Re : VBA création de tableau à partir d'une base de données

Bonjour Dranreb,

Je vous remercie déjà pour votre rapidité, cependant je rencontre quelques problèmes avec l'utilisation du code. Un premier message d'erreur m'empêche de l'utiliser en me disant que c'est une mauvaise utilisation du mot clé Me

Donc que fait ce Me comme fonction et comment régler ce message d'erreur ?
Dois-je changer les endroits où est marqué Feuil1 par le nom de ma feuille c est à dire données ?

En vous remrciant


Petite edit de ma réponse je n'avais pas mis le code au bon endroit dans le bon module, mais maintenant c'est bon le code fonctionne je vais essayer de le retravailler pour l'utiliser sur un fichier plus important avec plus de données et je reviens vers vous en cas de problèmes plus important
 
Dernière édition:

Macgiy

XLDnaute Nouveau
Re : VBA création de tableau à partir d'une base de données

Re bonjour à tous,

Donc nouvelle question j'ai réalisé quelques tests donc j'arriver à jouer sur l'emplacement des données à copier, de ne prendre qu'à partir d'un certain moment. Cependant j'aimerai jouer sur l'emplacement de copie je ne voudrais non plus les copier maintenant en C5 mais C12 et je ne comprends pas trop comment ça fonctionne parce que juste en changeant la cellule cible du Copy Me

Merci
 

Dranreb

XLDnaute Barbatruc
Re : VBA création de tableau à partir d'une base de données

Bonjour.
Si vous remplacez la destination Me.[A5] par une cellule d'une autre ligne, il faut aussi mettre ce nouveau numéro de ligne derrière With Me.Rows( dans l'instruction suivante, et finir celle ci, avant la parenthèse de fin, par ce numéro diminué de 1.
 

Macgiy

XLDnaute Nouveau
Re : VBA création de tableau à partir d'une base de données

Encore merci, les explications claires et concises encore une fois.

Dernière petite question, je voudrais activer la macro par un bouton, commandbutton ou une forme un peu jolie de excel n'importe, quelle est la procédure à suivre parce que d'habitude je crée mon bouton et je lui fais affecter macro mais la je rencontre quelques problèmes.

Merci
 

Dranreb

XLDnaute Barbatruc
Re : VBA création de tableau à partir d'une base de données

Si c'est un bouton de commande remplacez le nom de la Private Sub par le celui de son évènement Click,
si c'est un bouton de formulaire déplacez la vers un module ordinaire, enlevez Private, remplacez Me par Feuil2 et affectez la au bouton.
 

Macgiy

XLDnaute Nouveau
Re : VBA création de tableau à partir d'une base de données

Merci de votre réponse je commande la macro avec un bouton

Cependant si je peux me permettre de vous déranger encore un peu, c est au niveau du style du résultat. Je commence l'intégration de cette macro dans mon fichier final. Comme ma base de données peux avoir des taille variable les cellules sont mise en forme en avance et je remplis uniquement celle que j'ai besoin mais le problème c'est que la macro va jusqu'en bas du tableau et me copie le style des cellules vide. est-il possible d'interdire de copier le style des cellules vides qui sont en queue de base ?
Et aussi est-il possible de copier d'ailleurs sans prendre en compte le style ? Ou pour faire en sorte que le tableau final soit une ligne d'une couleur et l'autre blanche ?

Merci
 

Dranreb

XLDnaute Barbatruc
Re : VBA création de tableau à partir d'une base de données

Comprends pas trop. Normalement End(xlUp) remonte jusqu'à une cellule non vide de la même colonne, peut être faut il en prendre une autre ? … et ne copier que les valeurs ?
 

Macgiy

XLDnaute Nouveau
Re : VBA création de tableau à partir d'une base de données

En gros suivant mes clients je duplique mon fichier

Ensuite je rempli ma base et la mise en forme de ma base est pré faite (mes lignes sont une sur deux colorée et blanche)
Et a la fin je veux faire le réporting c est pour ça la macro et la je viens de faire le test si ma base est sans mise en forme après les dernières cellules avec du texte la macro s'arrête au bon endroit sinon elle va jusqu'à que la mise en forme s'arrête.

Et la deuxième question c'était en effet s'il est possible de copier sans prendre en compte la mise en forme pour après que la macro le réalise une fois les données triées et copiées dans la feuil récap
 

Dranreb

XLDnaute Barbatruc
Re : VBA création de tableau à partir d'une base de données

Installez vous peut être ces deux fonctions dans un module d'utilitaires, vous pourriez alors essayer en mettant ColUti(Feuil1.[D3:F3]).Copy Feuil2.[C5] au lieu de Feuil1.[D3].Resize(Feuil1.[D60000].End(xlUp).Row - 2, 3).Copy Feuil2.[C5]
Et pour ne copier que les valeurs With ColUti(Feuil1.[D3:F3]): Feuil2.[C5].Resize(.Rows.Count, 3).value = .Value: End If
Et aussi With PlgUti(Feuil2.[A5]) au lieu de With Feuil2.Rows(5).Resize(Me.[C60000].End(xlUp).Row - 4)
VB:
Option Explicit
'

Function PlgUti(ByVal PlageDép As Range, Optional ByVal PlagExam As Range = Nothing) As Range
Rem. Cherche la partie utilisée d'une plage, c'est à dire celle qui s'étend jusqu'à la dernière cellule renseignée de plus qu'une chaîne vide.
'    PlageDép: Plage de départ. Seule la 1ère cellule spécifiée est prise en compte pour la déterminer, et suffit donc pour une utilisation VBA.
'            Pour utilisation en formules, il est néanmoins nécessaire de spécifier la plage depuis celle ci jusqu'au reste des colonnes entières.
'    PlageExam: Plus grande plage susceptible de contenir la plage cherchée.
'            Facultatif: UsedRange assumé par défaut.
Dim LMax As Long, CMax As Long, NbL As Long, NbC As Long
On Error GoTo RienTrouvé
If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
LMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
CMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
On Error GoTo 0
NbL = LMax - PlageDép.Row + 1: If NbL < 1 Then GoTo CEstToutVide
NbC = CMax - PlageDép.Column + 1: If NbC < 1 Then GoTo CEstToutVide
Set PlgUti = PlageDép.Resize(NbL, NbC)
Exit Function
RienTrouvé: Resume CEstToutVide
CEstToutVide: Set PlgUti = Nothing
End Function
'

Function ColUti(ByVal PlageDép As Range) As Range
Rem. Comme PlgUti, mais la plage rendue se limitera aux colonnes couvertes par la plage de départ spécifiée
Set ColUti = PlgUti(PlageDép, Intersect(PlageDép.Worksheet.UsedRange, PlageDép.EntireColumn))
End Function
Pour colorier une ligne sur 2 vous pourriez utiliser une MeFC avec comme formule =MOD(LIGNE();2)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 936
Membres
101 844
dernier inscrit
pktla