problème de filtre vba macro Excel - VB/VBA/VBS - Programmation
Marsh Posté le 21-07-2009 à 17:54:53
Bonjour
Avec un filtre et des données comme cela tu ne t'en sortiras pas.
Il faudrait que tu ai :
col A Col B
titre A
titre A 1
titre A 4
titre B
titre B 5
titre B 2
titre B 4
Il faudra donc passer par une macro, qui tant que le titre ne change pas il somme la colonne d'a coté.
Pas bien dur.
Question, tu veux un tableau recapitulatif de tous tes titres ?
Ou tu veux par exemple savoir la somme pour titre A ? Genre une fonction : =SommeTitre("Titre A" ) et ca te renvoie 5 ?
Explique un peu mieux le deroulement si tu veux de l'aide. En tout cas de ma part.
Cordialement
Marsh Posté le 21-07-2009 à 19:25:39
SuppotDeSaTante a écrit : |
Marsh Posté le 21-07-2009 à 23:17:47
Ok je zieute ca demain, mes noeils-noeils tombent tout seuls
Marsh Posté le 22-07-2009 à 09:17:56
excuse moi encore ,dje69r ^^ , mais j'ai aussi une 3 eme colonne ou il y a des noms ... en face de chaque nombre de la colonne B , et la cerise sur le gateau ... serait de copier just l'ensemble des noms correspondant aux nombres sommés et de les mettre en commentaire dans la case ou l'on a somme les nombres (ici 5,2,4 par exemple)
ie on aurait dans la case cible 11 avec en commentaire dans la cellule ( "nom A" correspondant au 5, "nom B" correspondant au 2, "nom C " correspondant au 4)
réussi uniquement , à mettre des commentaire simple
With Workbooks("cible" ).Worksheets("PREVIADE" ).Cells(1, AddComment
.Visible = False
.Text "texte à remplir"
End With
En te remerciant encore
cordialement
Marsh Posté le 22-07-2009 à 11:08:19
A tes souhaits...
Pas tout compris...
Je requepepete depuis le bédut :
On somme la colonne B en fonction du titre que tu choisis ?
Genre tu mets "Titre A" et ca te renvoit 5
Question, le 5 ca doit te le mettre ou ?
Et ton commentaire, par exemple pour "nom B", il sort d'ou le "2" ?
Montres moi peut etre soit un bout de tableau réél, soit ton tableau avec les 3 colonnes modifié ?
Marsh Posté le 22-07-2009 à 11:19:48
Re! , l'ideal c'est de le copier dans un fichier cible.xls , onglet 1 , case 1 , apres je serais faire lol ...
En ce qui concerne les nom , en faite , chaque chiffre correspond une prime d'assurance .... et donc un nom du bénéficiaire qui dans une autre colonne (ex ici C ) mais à la même ligne que le chiffre .. je souhaite ouvrir un commentaire dans le fichier cible onglet 1 case 1 en mettant tous les noms correspondant ou les montant ont été choisis ...
merci encore ...
ps : le 2 correspondant au 2eme chiffre du titre B
Marsh Posté le 22-07-2009 à 11:23:59
Résumons tous ^^ , il y a 3 colonne : col A : titre en faite correspond aux partenaires.., col B : motant des primes , col C nom du bénéficiare...
J'aimerais pouvoir choisir le nom du partenaire : la macro sommerait toutes les primes de la col B dans le fichier cible et ajouterait en commentaire dans la même cellule , le nom de tous les bénéficiares choisis dans la colonne B
Marsh Posté le 22-07-2009 à 11:31:46
Ah oui donc tu veux que le resultat aille dans un autre fichier ?
Ce fichier est il ouvert au moment de l'execution de la macro ou faut il l'ouvrir ? Est-ce toujours le meme ?
Il faut un max de precisions tu sais...
Marsh Posté le 22-07-2009 à 11:46:02
heu excuse moi j'ai pas trop précisé cela ,car je sais me faire .. mais disons que le fichier n'est pas ouvert et l'deal serait de chosir l'emplacement cible pour le partenaire A par exemple cell (1 ,1 )
le partenaire B cell (1,2) etc
cordialement
Marsh Posté le 22-07-2009 à 12:10:30
foxley_gravity a écrit : heu excuse moi j'ai pas trop précisé cela ,car je sais me faire .. |
foxley_gravity a écrit : que l'deal serait de chosir l'emplacement cible pour le partenaire A par exemple cell (1 ,1 ) |
Bon comme j'avais planché dessus, je te mets la fonction vite faite.
Elle renvoit la somme en fonction du 'partenaire'
Code :
|
Fin du caca nerveux
Marsh Posté le 22-07-2009 à 12:30:35
Excuse moi , c'est mon premier post , je suis désolé si j'avais été imprécis ... je voulais éssayer de simplifier au maximun pour être le plus facilement comprehensible , deja que je me perd tout seul lol .... désolé encore ^^
J'ai a peu pres compris ce que tu as écris ...la somme du partenaire choisi va dans foxley gravity , tu me dis si c'est bon je vais faire , je vais essayer de copier les sommes du partenaire A dans la cellule (1,1) du nouveau fichier et copier celle du partenaire B dans la cellule (1.2)
Pour le partenaire A :
Function foxley_gravity(Titre)
Workbooks.Open Filename:="cible.xls"
Workbooks.Open Filename:="source.xls"
'la ou il y a les données sur les partenaires...
Workbooks("source.xls" ).Worksheets(1).activate
DerniereLigne = Range("A65536" ).End(xlUp).Offset(1, 0).Row
DerniereLigne2 = Range("B65536" ).End(xlUp).Offset(1, 0).Row
DepartLigne = 0
For i = 1 To DerniereLigne
If Cells(i, 1).Value = PARTENAIRE A Then DepartLigne = i
Next i
If DepartLigne = 0 Then Exit Function
For x = DepartLigne To DerniereLigne2
If Cells(x + 1, 1).Value <> Cells(x, 1).Value And Cells(x + 1, 1).Value <> "" Then
foxley_gravity = Evaluate("SUM(B" & DepartLigne & ":B" & x & " )" )
Exit Function
End If
Next x
Workbooks("source.xls" ).Worksheets("1" ).Cells(1, 1).value= Evaluate("SUM(B" & DepartLigne & ":B" & DerniereLigne2 & " )" )
End Function
cordialement en te remerciant
Marsh Posté le 22-07-2009 à 14:22:19
T'inquiètes j'ai vu, d'ou mon smiley a la fin de mon post.
Déjà, utilises les balises cpp ou quote (entre crochet) pour mettre le code, c'est plus lisible :
[ cpp]Ton code[ /cpp]
(Sans espace dans les balises)
En fait non, ton code ne me semble pas bon.
Car tu veux mettre la somme dans le fichier cible et pas le fichier source. Et tu dois sommer dans la source pour le mettre sur la cible.
Ensuite tu as oublié dans la seconde boucle de justement definir la somme dans le fichier cible.
C'est une fonction, tu n'as donc pas besoin de mettre en dur le partenaire (qui d'ailleurs est mal saisi puisqu'une chaine se met entre double cote " donc ca serait "PARTENAIRE A"), puisqu'il est passé en paramatre de la fonction avec la variable Titre : Function foxley_gravity(Titre)
Sinon tu peux aussi passer par une boite de dialogue qui te demande quel partenaire sommer.
Et si tu veux appeler la macro avec les boutons d'Excel, mets ca en Sub
Je te mets ca dans l'exemple qui suit avec la correspondance de couleur entre explication ci haut et le code :
Code :
|
Marsh Posté le 22-07-2009 à 14:41:57
Ok merci beucoup vraiment ...et pour ce qui concerne les commentaires ^^
En ce qui concerne les nom , en faite , chaque chiffre(prime) correspond un nom d'un bénéficiaire qui dans une autre colonne (ex ici C ) mais à la même ligne que le chiffre .. je souhaite ouvrir un commentaire dans le fichier cible onglet 1 case 1 qui vient d'etre calculé en mettant tous les noms correspondant
Pour l'instant j'arrive jusque à cré un commentaire lol ,c'est deja ca
With Workbooks("cible" ).Worksheets("PREVIADE" ).Cells(1, AddComment
.Visible = False
.Text "texte à remplir"
End With
merci encore ...
Marsh Posté le 22-07-2009 à 15:08:43
J'ai du editer mon post pendant que tu ecrivais, verifie.
Je passe par une variable Rtat pour stocker la somme, vu qu'on la remploie ailleurs, ca ferait trop long de retaper "SUM(" etc.
Pour les commentaires, nouveautés en gras :
Code :
|
Marsh Posté le 22-07-2009 à 16:14:44
Re
Excuse moi , au fur et à mesure je vais corser la dificulté du programme lol , non je fais pas expres ,
Le programme plante la : If DepartLigne = 0 Then Exit Sub
erreur de compilation
Les premiers chiffre sont 5 ligne en dessous du titre... est ce si le programme lit des string il plantera non ?
Je n'ai pas vu ou indiquer la colonne des noms des sinistrés pour écrire le commentaire.
Sub forum()
Workbooks.Open Filename:="D:\Documents and Settings\x7001\Bureau2008Sinistres02062009.xls"
Workbooks.Open Filename:="D:\Documents and Settings\x7001\source.xls"
'la ou il y a les données sur les partenaires...
Workbooks("D:\Documents and Settings\x7001\Bureau2008Sinistres02062009.xls" ).Worksheets(1).Activate
DerniereLigne = Range("A65536" ).End(xlUp).Offset(1, 0).Row
DerniereLigne2 = Range("B65536" ).End(xlUp).Offset(1, 0).Row
DepartLigne = 0
'J'ai voulu mettre la case contenant PREVI MUTUEL avec les **
'j'espere que c'est bon
For i = 1 To DerniereLigne
If Cells(i, 1).Value = "*PREVI MUTUEL*" Then DepartLigne = i
Next i
If DepartLigne = 0 Then Exit Sub
For x = DepartLigne To DerniereLigne2
If Cells(x + 1, 1).Value <> Cells(x, 1).Value And Cells(x + 1, 1).Value <> "" Then
'Somme dans le fichier cible
Rtat = Evaluate("SUM([Source]FeuilleCible!B" & DepartLigne & ":B" & x & " )" )
Workbooks("cible.xls" ).Worksheets(1).Cells(1, 1).Value = Rtat
TextPartenaires = TextPartenaires & ": " & Rtat
Exit Sub
End If
Next x
'Somme dans le fichier cible pour la derniere ligne de partenaire
Rtat = Evaluate("SUM([Source]FeuilleCible!B" & DepartLigne & ":B" & DerniereLigne2 & " )" )
Workbooks("cible.xls" ).Worksheets(1).Cells(1, 1).Value = Rtat
TextPartenaires = TextPartenaires & ": " & Rtat
Workbooks("cible.xls" ).Worksheets("PREVIADE" ).Cells(1, 1).AddComment TextPartenaires
End Sub
Marsh Posté le 22-07-2009 à 16:29:21
C'est bien le probleme, les problematiques arrivent dans le desordre...
D'ou mes questions initiales...
Non, tu ne peux pas prendre comme ca, les valeurs contenant "PREVI MUTUEL"
Ensuite, pourquoi as tu enlevé l'inputbox ?
Tu pars trop dans tous les sens sans tester ce que je te donne.
Pour les chiffres 5 lignes en dessous, il etait temps de le dire... C'est DepartLigne qui le defini, un +4 devrait faire l'affaire.
Pour le reste, il va falloire au moins tester un bout avant de me balancer un code qui vraissemblablement ne fonctionne/era pas.
Je t'ai demandé :
Si tu ne cherchais que pour un seul et un seul 'titre' qui en fait sont des partenaires. Tu me dis oui, puis finalement tu veux faire une recherche avec du "contient"
Le nom de tes deux fichiers
L'endroit ou tu voulais que la somme aille
Comment etait fait le tableau (qui finalement a changé)
Etc.
Je n'ai pas les infos, je ne vais pas modifier a chaque fois le code que je te fais, parceque tu omets ou ne veux pas me donner toutes les infos.
C'est pas possible de bosser comme ca, du moins pour moi.
Il faut etre carré un minimum et ne pas partir dans tous les sens.
Pose ton probléme, tes besoins, ce que tu souhaites CONCRETEMENT faire et je repasserai
Marsh Posté le 22-07-2009 à 20:09:38
je t'es envoyé un mail pour t'expliquer completement le probleme
bonne soirée
Marsh Posté le 23-07-2009 à 15:42:13
Bonjour
Représentation du tableau
col1 col2 col3 col4 col5 col 6
ligne 01
ligne 02 titre A 16 Durand Dupond Duchemol
ligne 03
ligne 04 col1 col2 col3
ligne 05 titre A
ligne 06 1 Durand
ligne 07 5 Dupond
ligne 08 10 Duchemol
ligne 09 titre B
ligne 10 10 Ratatouille
ligne 11 11 Ducon
Utilisation
dans le cellule ligne 2 colonne 4 saisie ton titre ( titre A)
attention de bien saisir (bdc cap espace)
execute la macro dudule que voici
Code :
|
Marsh Posté le 24-07-2009 à 09:24:52
Bonjour !
Merci , je crois que c'est exactement ce que je voulais .... je ne pas comment vous remecier ...
Vraiment merci beucoup d'avoir été aussi rapide , je vais travailler à adapter tout cela à ma 50eme d'onglet ...lol , je suis pas couché^^
bonne journée ....
Marsh Posté le 24-07-2009 à 09:55:53
Je ne comprends pas que la derniere macro que je t'ai filé ne fonctionne pas, puisque chez moi avec tes fichiers ca roule.
Bref, si tu t'en es sorti, c'est le principal
Marsh Posté le 24-07-2009 à 10:58:23
A bon ^^ peut tu peux m'en envoyer celle qui fonctionne avec mes fichiers , ca me tracasse
cdt
Marsh Posté le 21-07-2009 à 17:03:02
Bonjour, je suis un débutant sur vba et j'aimerais de l'aide , en remerciant les gens qui prendront un peu de temps pour moi ...
Mon but est d'obtenir une macro qui filtre certain titre dans la colonne A puis d'aller chercher et de les sommes les élément correspondant de la colonne B pour écrire la somme dans un autre fichier
ex
col A Col B
titre A
1
4
titre B
5
2
4
titre C
8
7
Ici par exemple si je selectionne le titre B je devrais optenir 11
voici ce que j'ai écris :
Sub macro_filtre()
Dim i As Integer
i = 2
MsgBox Workbooks(1).Worksheets(1).Range("A" & i).Value
'Workbooks(1).Worksheets(1).Range("A1" ).AutoFilter
For i = 2 To Workbooks(1).Worksheets(1).Rows.Count
Range("A" & i).AutoFilter Field:=1, Criteria1:="*B*", Operator:=xlAnd, Criteria2:=""
'Pour filtrer les enregistrements non vides
Next
'boucle sur les filtres de la feuille
With .AutoFilter.Filters
MsgBox Application.WorksheetFunction.Subtotal(9, Columns(2))
' additionne les cellules visibles de la colonne B.
End If
End Sub
En vous remerciant ....