Bonjour,
Je réédite ma question sous une forme nouvelle parce que j'avais mal posé le problème et que je ne parviens pas à transformer le code qu'on m'a donné pour l'adapter à ma question.
Voici mon problème. Dans un fichier, j’ai plusieurs feuilles qui correspondent au même formulaire. En général, je me sers de listes déroulantes pour beaucoup de cellules. Mais, j’en ai quelques-unes à remplir à la main qui correspondent à des questions ouvertes. Lorsque je fais la synthèse des formulaires, je parviens facilement à compter les occurrences lorsqu’elles viennent de listes déroulantes parce que je connais toutes les possibilités. Mais lorsque la réponse est « ouverte », je ne connais pas les occurrences qui ont été créées.
J’aurai voulu une macro qui aille chercher les différentes occurrences (qui sont toujours à la même place), et lorsqu’une occurrence sort plusieurs fois, savoir combien de fois elle est sortie. J'ajoute une précision qui n'était pas dans mon premier sujet : il n'y a qu'une cellule concernée par feuille, mais il y a un nombre de feuilles indéterminé. Donc, le fichier que je mets en pièce jointe est à 4 fiches mais il pourrait être de 10 ou de 30 ou de plus encore
Tous les onglets s'appellent "fiche etc"
Ci-joint un fichier test avec le résultat attendu dans l'onglet synthèse
Il faut essayer de comprendre les lignes de codes qui vous sont communiquées, travailler un peu et voir ce que vous pouvez adapter. Sinon vous n'apprendrez jamais.
De plus et pour ma part, quelqu'un qui attend du tout cuit, aussi sympa soit-il, va vite me lasser.
Pour votre question la ligne de code incriminée est celle-ci .Range("B2").CurrentRegion.ClearContents '
Cette ligne a pour but d'effacer les données calculées précédentes, pour ne pas conserver de fantôme.
Si votre tableau a un nombre de lignes fixes vous pouvez par exemple la remplacer par: .Range("B2:C100").clearContents
La macro du fichier fonctionnait très bien, alors je me suis creusé la tête pour savoir ce que vous vouliez!!!
J'en ai fini par conclure que la réponse était simplement là : 'qui sont toujours à la même place'
Donc en dehors du fait que j'ai refait la macro à ma sauce, la seule modification par rapport à la précédente est que celle-ci ne boucle pas sur les cellules occupées de la colonne A de chaque feuille mais simplement teste la cellule A2 de chaque feuille.
VB:
Sub synthese()
Dim Occurence As String
Set dico = CreateObject("Scripting.dictionary")
For Each sh In Sheets
If sh.Name <> "Synthèse" Then
Occurence = Trim(sh.Range("A2").Text)
If Occurence <> "" Then dico(Occurence) = dico(Occurence) + 1
End If
Next
If dico.Count > 0 Then
With Sheets("Synthèse")
.Range("B2").CurrentRegion.ClearContents ' Nettoie les données précédentes
.Range("B2").Resize(dico.Count) = Application.Transpose(dico.keys)
.Range("C2").Resize(dico.Count) = Application.Transpose(dico.items)
End With
End If
End Sub
Si c'est bien ça que vous voulez, alors il eût été plus simple de rester dans votre autre fil de discussion et de dire que les occurences à trouver sont toujours en A2 de chaque feuille.
Petite question en aparté : pourquoi un fichier .xls (format dépassé depuis 2007) alors que vous avez office 365, vous privant ainsi de toutes les améliorations d'excel faites depuis 12 ans?
La macro du fichier fonctionnait très bien, alors je me suis creusé la tête pour savoir ce que vous vouliez!!!
J'en ai fini par conclure que la réponse était simplement là : 'qui sont toujours à la même place'
Donc en dehors du fait que j'ai refait la macro à ma sauce, la seule modification par rapport à la précédente est que celle-ci ne boucle pas sur les cellules occupées de la colonne A de chaque feuille mais simplement teste la cellule A2 de chaque feuille.
VB:
Sub synthese()
Dim Occurence As String
Set dico = CreateObject("Scripting.dictionary")
For Each sh In Sheets
If sh.Name <> "Synthèse" Then
Occurence = Trim(sh.Range("A2").Text)
If Occurence <> "" Then dico(Occurence) = dico(Occurence) + 1
End If
Next
If dico.Count > 0 Then
With Sheets("Synthèse")
.Range("B2").CurrentRegion.ClearContents ' Nettoie les données précédentes
.Range("B2").Resize(dico.Count) = Application.Transpose(dico.keys)
.Range("C2").Resize(dico.Count) = Application.Transpose(dico.items)
End With
End If
End Sub
Si c'est bien ça que vous voulez, alors il eût été plus simple de rester dans votre autre fil de discussion et de dire que les occurences à trouver sont toujours en A2 de chaque feuille.
Petite question en aparté : pourquoi un fichier .xls (format dépassé depuis 2007) alors que vous avez office 365, vous privant ainsi de toutes les améliorations d'excel faites depuis 12 ans?
Bonjour Reblochon,
En fait, c'est idiot. J'ai regardé la macro et j'en ai déduis qu'elle limitait sa recherche dans un nombre restreint de feuilles sans avoir essayé d'ajouter des feuilles et de voir ce que cela faisait.
Donc, tout est bien, ça marche. Super. Merci.
Pour Excel 2007, je viens juste d'enregistrer mes fichiers 2007 sous le format Excel acceptant les macros. J'espère que je ne vais pas être perdu...
Merci encore.
Bonjour Reblochon,
En fait, c'est idiot. J'ai regardé la macro et j'en ai déduis qu'elle limitait sa recherche dans un nombre restreint de feuilles sans avoir essayé d'ajouter des feuilles et de voir ce que cela faisait.
Donc, tout est bien, ça marche. Super. Merci.
Pour Excel 2007, je viens juste d'enregistrer mes fichiers 2007 sous le format Excel acceptant les macros. J'espère que je ne vais pas être perdu...
Merci encore.
Help Reblochon,
En fait, j'ai un autre problème.
Ta macro fonctionne et je l'ai adaptée à un autre document.
Le problème est que je veux mettre les résultats de la macro dans une feuille existante qui comporte déjà des éléments. Et lorsque je passe la macro, le résultat de la macro s'affiche mais elle a effacé tout le reste de la feuille.
Donc, si tu reprends la macro que tu m'as donnée dans lequel les résultats s'affichent sur la feuille synthèse dans les colonnes B et C, il faudrait faire en sorte qu'elle n'efface pas ce qu'il y a avant la colonne B et après la C. Si tu sais faire, c'est super
Il faut essayer de comprendre les lignes de codes qui vous sont communiquées, travailler un peu et voir ce que vous pouvez adapter. Sinon vous n'apprendrez jamais.
De plus et pour ma part, quelqu'un qui attend du tout cuit, aussi sympa soit-il, va vite me lasser.
Pour votre question la ligne de code incriminée est celle-ci .Range("B2").CurrentRegion.ClearContents '
Cette ligne a pour but d'effacer les données calculées précédentes, pour ne pas conserver de fantôme.
Si votre tableau a un nombre de lignes fixes vous pouvez par exemple la remplacer par: .Range("B2:C100").clearContents
Il faut essayer de comprendre les lignes de codes qui vous sont communiquées, travailler un peu et voir ce que vous pouvez adapter. Sinon vous n'apprendrez jamais.
De plus et pour ma part, quelqu'un qui attend du tout cuit, aussi sympa soit-il, va vite me lasser.
Pour votre question la ligne de code incriminée est celle-ci .Range("B2").CurrentRegion.ClearContents '
Cette ligne a pour but d'effacer les données calculées précédentes, pour ne pas conserver de fantôme.
Si votre tableau a un nombre de lignes fixes vous pouvez par exemple la remplacer par: .Range("B2:C100").clearContents
Roblochon,
Merci beaucoup. J'ai réussi à modifié la macro.
J'essaye de comprendre, ne t'inquiète pas là-dessus. En fait j'envoie des fichiers tests qui n'ont rien à voir avec le document sur lequel je travaille, justement pour me forcer à trifouiller les codes et tenter de comprendre quelque chose. Mais, avoue tout de même qu'il faut être doué d'un esprit un peu spécial pour naviguer allègrement dans le vba.
Au fait, merci pour Genesis Musica. Je l'ai mis sur le salon