Transférer des données vers une feuille
bonjour,
J'ai besoin de transférer des données d'une feuille ("données") vers une autre feuille ("synthèse"). Les données de la feuille ("données") sont issues à partir d'un USf. Normalement au bout d'une année je devrais avoir plus de 2500 lignes. ce qui représente une bdd assez importante. En gros je récupère avec cet USf les autorisations d'urbanisme (Permis de construire......CUB...) qui sont déposées par commune (environ une vingtaine) et la décision finale (refus accord etc...). Et si ce n'est pas un accord, le ou les motifs de motivation.
Donc nous avons le type de demande (PC-dp-Pa-cub) le numéro de la demande, la proposition (refus....) le ou les motifs de motivation et la commune concernée.
on m'a vantait le mérite d'un tableau comme variable (vba) mais j'avoue je coince pour transférer tout ce beau monde dans le tableau de la feuille synthèse. le cours tableau vba sur ce même site m'a aidé un peu a comprendre mais je n'ai pas la fibre pour le personnaliser à mon cas.
j'ai réussi à récolter les données de la sheets données vers la sheets synthèse avec une formule somproduct mais lors d'un nouvel enregistrement d'une nouvelle demande par l'usf, il met 20 secondes à enregistrer ce nouvel enregistrement
si vous avez une piste de réflexion je suis preneur
merci a vous
je joins mon fichier
Bonjour et bienvenue
Un TCD (Tableau Croisé Dynamique) semble répondre à ta demande.
Amicalement
Nad
merci Nad, pour cette solution qui répond à mes attentes mais il parait qu'avec comme variable un tableau peut gérer trés rapidement de grande quantité de données. C'est aussi pour progresser en vba que j'essaie de comprendre comment fonctionne les variables tableau et rien de plus pratique qu'un exemple
Bonjour,
T'as prévu l'aspirine ?
Voici une solution en VBA qui répond à ton attente :
Sub DemoArrayPC()
'Pour Commencer quelques déclarations préliminaires...
Dim i%, ii%, x%, WSS As Worksheet, WSC As Worksheet, TabloS, TabloC '(S= Source,C=Cible)
'On gèle l'affichage écran
Application.ScreenUpdating = False
Set WSS = Worksheets("DONNEES")
Set WSC = Worksheets("SYNTHESE")
TabloS = WSS.Range("A2:K" & WSS.Range("A" & WSS.Rows.Count).End(xlUp).Row)
TabloC = WSC.Range("A5:V" & WSC.Range("A" & WSC.Rows.Count).End(xlUp).Row)
'Et on va parcourir les tableaux à la recherche d'égalité
'Pour chaque ville de TabloC
For i = 1 To UBound(TabloC)
'On va parcourir tabloS
For ii = 1 To UBound(TabloS)
'On regarde dans la colonne J (10) si la ville est identique
If TabloS(ii, 10) = TabloC(i, 1) Then
'Si oui on peut déjà transcrire l'année
WSC.Cells(i + 4, 2) = TabloS(ii, 11)
'Et on regarde le type de demande
On Error GoTo GESTERRCASE
Select Case TabloS(i, 1)
Case "PC": x = 3 ' x est le N° de colonne correspondant à l'item dans WSC
Case "PA": x = 8
Case "DP": x = 13
Case "Cub": x = 18
Case Else: x = "Err"
End Select
'Et on transcrit le résultat (Nécessite un léger effort d'abstraction...)
If TabloS(ii, 3) = "ACCORD" Then WSC.Cells(i + 4, x) = WSC.Cells(i + 4, x) + 1
If TabloS(ii, 3) = "REFUS" Then WSC.Cells(i + 4, x + 1) = WSC.Cells(i + 4, x + 1) + 1
If TabloS(ii, 3) = "REJET TACITE" Then WSC.Cells(i + 4, x + 2) = WSC.Cells(i + 4, x + 2) + 1
If TabloS(ii, 3) = "SAS" Then WSC.Cells(i + 4, x + 3) = WSC.Cells(i + 4, x + 3) + 1
End If
Next
Next
MsgBox "C'est fini !"
Exit Sub
GESTERRCASE:
MsgBox "Erreur Feuille DONNEES " & Chr(13) & _
" Ligne " & ii + 1 & ", Colonne 1"
End SubNota : Tous les cas d'erreurs possibles ne sont pas traités en particulier si les noms de villes ne sont pas écrits de manière identiques dans les feuilles Synthèse et Données ou si le motif comporte une faute ou des espaces parasites...
C'est le cas notament dans ton fichier Feuille Synthèse "charlie" et dans la feuille Données "charlie " (avec espace de fin)
A+
merci Galopin01
Je prends connaissance de ta réponse ce matin et je te remercie d'avoir planché dessus à une heure tardive.
En plus j'apprécie les commentaires verts qui sont très appréciables pour comprendre le code.
Je n'ai pas d'aspirine mais j'espère que tu n'as pas fait une overdose de caféine
merci encore
Bonjour,
Une 'tite erreur de plume corriger cette ligne (manque un i ) :
Select Case TabloS(ii, 1)Attention de corriger sur les deux feuilles ça doit être Cub et pas Cub dans l'un et CUb dans l'autre...
A+
merci,
désolé pour le MP
j'ai cherché en vain l'erreur, mais quand on débute, on s'égare tout azimut
chapeau bas pour ce petit programme
merci encore
bjr,
pour amender cette base je souhaiterais connaitre pour chaque commune (nb17) les principaux motifs de motivation (nb 33).
je ne sais comment m'y prendre. Faire une boucle pour chaque motif tout en sachant que la liste des 33 peut évoluer devient long et fastidieux.
Chaque demande peut avoir plusieurs motifs de motivation.
je pensais récupérer le tout dans une feuille sous forme de tableau avec les communes en ordonnée et les motifs en abscisse..
je suis preneur de toutes vos lumières
merci
Bonjour,
Perso je récupèrerai en colonne la liste des villes et celle des motifs + un TCD et hop le tour est joué.
Mais la difficulté réside dans les motifs multiples.
On pourrait le contourner avec un mauvais bricolage mais c'est vrai que l'idéal est de passer par VBA.
Pour annuler l'effet de modification des listes de villes et des listes de motif, il faut en effet passer par ta feuille "Motif".
J'y réfléchi et je te tiens au courant.
A+
Bonsoir,
J'ai modifié un peu TOUSSA pour tenir compte de tes observations
J'ai défini les communes et les motifs comme plages dynamiques (voir gestionnaire de noms) de sorte qu'on puisse en ajouter sans modifier le prog. Et désormais le prog part de ces plages pour comparer avec la feuille source.
(en d'autres termes même si la feuille Synthèse ne comporte pas de noms de communes le tableau se remplit quand même.)
Ce n'était d'ailleurs pas obligatoire mais je suis parti du principe que la liste des communes était complète et que le tableau de données pouvait avoir des "trous"
Les stats sont dans la feuille Synthèse.
Bon... Heu... J'ai pas trop vérifié... Il faut bien que je te laisse quelque chose à faire !
Bonne nuit.
A+
merci,
Que c'est beau la (ta) maitrise
eh oui il faut bien que je fasse quelque chose, et je commence par essayer de comprendre ce que tu as écrit. Je ne suis qu'un petit débutant en VBA, et tu comprendras aisément qu'un tel code je ne pouvais pas le sortir seul. Pourrais tu m'expliquer pourquoi
dans les déclarations de variables, le c% cc% sont avec le signe %
Dim c%, cc%, i%, ii%, x%, WSS As Worksheet, WSC As Worksheet, TabloS, TabloC, TabloM, o As Range '(S= Source,C=Cible)
alors qu'après ils sont présents sont le signe %
For c = 4 To 9
For cc = 1 To UBound(TabloM)
en fait c'est comme si c'était d'autres variables non déclarés ou il y a une subtilité particulière?
Je n'ai pas vérifié si tout fonctionnait mais encore un grand MERCI
a+
Bonjour,
Dim c%, cc%, i%, ii%, x% est l'équivalent de :
Dim c as integer, cc as integer, i as integer, ii as integer, x as integer
Après on fait comme on aime...
A mon age
Les objets (Worksheets et Range) n'ont pas d'abréviation particulière et les Tablo (en l'absence d'autre précision dont déclarés comme Variant. A ce sujet voir l'aide de Dim sur VBA.
A+