Récupération de données et mise en forme [Résolu/Fermé]

Signaler
Messages postés
12
Date d'inscription
mercredi 22 mai 2013
Statut
Membre
Dernière intervention
21 octobre 2014
-
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
-
Bonjour,

Je cherche à réaliser un code VBA qui me permettra de récupérer des données sur un colonne d'un fichier Excel puis de créer un onglet où je vais classer ces données en 2 colonnes dont la 1ère correspondra à la une donnée et la 2ème sa fréquence associée.

En pièce jointe la feuille 1 représente les données à récupérer et la feuille 2 représente le résultat de ma macro.

Merci pour votre aide




5 réponses

Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 607
Bonjour,

1- tu as mis deux images de ta feuille Feuil1. De manière générale, il vaut mieux faire passer un fichier plutôt qu'une image.
Pour transmettre un fichier, il faut passer par un site de pièce jointe tel que cjoint.com

Va sur ce site : https://www.cjoint.com/
Clic sur parcourir,
Cherche ton fichier,
clic sur ouvrir,
Clic sur "Créer le lien cjoint",
Copier le lien,
Revenir ici le coller dans une réponse...

2- Un peu de lecture

3- Ta solution, donc, par Mr Boisgontier :
Sub CompteItems()
Dim mondico As Object, c As Variant
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Sheets("Feuil1").Range("a2", [a65000].End(xlUp))
    mondico(c.Value) = mondico(c.Value) + 1
  Next c
  Sheets("Feuil2").[c2].Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)
  Sheets("Feuil2").[d2].Resize(mondico.Count, 1) = Application.Transpose(mondico.items)
End Sub

Messages postés
12
Date d'inscription
mercredi 22 mai 2013
Statut
Membre
Dernière intervention
21 octobre 2014

Bonjour,

Je te remercie pour ta réponse. Je vais me mettre au travail pour voir ce que ça donne et tenir au courant ici.

Le lien comme tu me l'as expliqué : https://www.cjoint.com/?0JuqTs57Wft

Encore merci pour ton aide.
Messages postés
12
Date d'inscription
mercredi 22 mai 2013
Statut
Membre
Dernière intervention
21 octobre 2014

Rebonjour, la macro fonctionne très bien merci.

J'aurais une autre question :

Avec les nouvelles feuilles que j'ai créées (car plusieurs fichiers sources), je veux créer des formules dans une feuille appelée "feuilleFormula" qui reprendront les valeurs fréquences et données et qui seront de ce type :


sheets("feuilleFormule").Cells(2,2).FormulaR1C1 = "=RiskDiscrete({Donnée1,Donnée2,Donnée3,.....,DonnéeX},{Freq1,Freq2,Freq3,.....FreqX})"

(Données et fréquence de la feuille 1 par exemple)

sheets("feuilleFormule").Cells(2,2).FormulaR1C1 = "=RiskDiscrete({Donnée1,Donnée2,Donnée3,.....,DonnéeY},{Freq1,Freq2,Freq3,...FreqY})"

(Données et fréquence de la feuille 2 par exemple)

Donc ma question serait quelle macro pour intégrer toutes les données et fréquences dans ma formule tout en faisant référence à la bonne feuille.

Merci
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 607
Bonjour,

Je ne connais pas la formule RiskDiscrete... Cela correspond à qu'elle fonction d'Excel???
Messages postés
12
Date d'inscription
mercredi 22 mai 2013
Statut
Membre
Dernière intervention
21 octobre 2014
>
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021

Ce n'est pas important le Risk ici dans la formule. Ce qui importe c'est comment intégrer cette formule dans une boucle et la remplir au fur et à mesure.

Sinon risk correspond à une formule d'un logiciel complémentaire à Excel : @risk
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 607
Pas besoin de boucle, ... selon le type de formule.
Tu peux, sans doute, y intégrer un Array... Un peu comme ceci :

Dim dl As Long, ArrayDonnees(), ArrayFreq()
dl = Sheets("Feuil2").Range("C" & Rows.Count).End(xlUp).Row
ArrayDonnees = Sheets("Feuil2").Range("C2:C" & dl).Value 'Données
ArrayFreq = Sheets("Feuil2").Range("D2:D" & dl).Value 'Fréquences
Sheets("Feuil2").Cells(2, 6).FormulaLocal = "=RiskDiscrete(ArrayDonnees, ArrayFreq)"
Messages postés
12
Date d'inscription
mercredi 22 mai 2013
Statut
Membre
Dernière intervention
21 octobre 2014

Je n'arrive pas à savoir ce que renvoie Array.

Renvoie t'elle une ligne du type : {donnée1,donnée2,..} ?

Car lorsque j'exécute le code ça ne fonctionne pas.
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 607
Je t'ai dit que tout dépendais de la formule elle même...
Sans en savoir davantage, je ne peux rien faire de plus.
Messages postés
12
Date d'inscription
mercredi 22 mai 2013
Statut
Membre
Dernière intervention
21 octobre 2014

Oui j'ai bien compris mais ici Array me renvoie bizarrement la 1ère valeur de la plage. Connais tu une fonction qui permet de récupérer toute une plage d'une colonne et de l'écrire sous cette forme :

{1,5,6,9,10}

Merci
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 607
Décidément, je ne comprends pas du tout.
Désolé, ça doit être moi, mais je saisis de moins en moins ce que tu souhaites réaliser.

Bon.
Reprenons, juste pour moi.
Tu as réalisé une macro qui te donne les données avec leur fréquence. Que veux tu faire avec ces données et fréquences?
Messages postés
12
Date d'inscription
mercredi 22 mai 2013
Statut
Membre
Dernière intervention
21 octobre 2014

C'est bon pijaku,

Je suis resté sur ma 1ère idée avec une boucle for et j'ai enfin réussi!

L'incrémentation se fair plutôt comme ca :

For I = 1 to 50
Expression = Expression & "," & Worksheets("MaFeuille").cells(i, 1)
Next I

Du coup je récupère ma plage que je peux écrire directement dans ma formule.

Merci beaucoup a toi pour ton aide
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 607
Je n'avais décidément pas compris...
Le principal est que cela fonctionne...
A+