Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problme d'extraction de position dans une cellule ˆ valeurs sŽparŽes par virgules

4 réponses
Avatar
GARREC Charles
Bonjour à tous !

Je viens vers vous pour vous faire part d'un soucis que je rencontre
actuellement.

Je possède une liste d'auteurs de publication, et je souhaite faire un
classement des auteurs et participants.

En gros :

(revue 1) cellule 1 = x noms d'auteurs séparés par des virgules
(revue 2) cellule 2 = y noms d'auteurs séparés par des virgules
..

Dans chaque cellule les noms sont uniques. Un auteur ne peut pas etre
présent deux fois dans une meme cellule, mais il peut etre present dans
différentes cellules en positions différentes.

Ce que je cherche à faire c'est obtenir :

Le classement d'un auteur dans les revues présentes et attibuer une
valeur selon la place.
Exemple :

revue1 : a,b,c,d,e,f,g
revue2 : b,g,f,e,d,a,c
...

La formule/macro me donnerais le premier, le deuxième, le dernier et
l'avant dernier auteur :
position_1_Revue_1 = a
position_2_Revue_1 = b
position_n_Revue_1 = g
postion_(n-1)_Revue_1 = f

position_1_Revue_1 = b
position_2_Revue_1 = g
position_n_Revue_1 = c
postion_(n-1)_Revue_1 = a
..

Une fois cela obtenue pour toutes les revues je dois additionner le
tout de la façon suivante :
Si premier ou dernier = +1
Si deuxième ou avant-dernier = +0.5
Si entre le deuxième et l'avant dernier = +025
(dans l'exemple précédent, l'auteur
a aurait +2
b aurait +1,5
c aurait +0,75
d aurait +0,5
e aurait +0,5
f aurait +1,25
g aurait +2

Ceci me permet à terme d'avoir un classement des auteurs selon leurs
position de citation dans les crédits d'une revue (ces positions étant
normalisées).

Quelqu'un peut-il m'aider ? Car j'ai franchement beaucoup de mal à
faire ça autrement que manuellement ....

PLEASE HELP !!!!!!!!!!!!!!

4 réponses

Avatar
isabelle
bonjour Garrec,

avec les positions suivante :

a b c d e f g
revue1 : 1 2 3 4 5 6 7
revue2 : 6 1 7 5 4 3 2

je ne comprend pas comment tu peux arriver au resultat suivant :

a b c d e f g
2 1.5 0.75 0.5 0.5 1.25 2

isabelle



Bonjour à tous !

Je viens vers vous pour vous faire part d'un soucis que je rencontre
actuellement.

Je possède une liste d'auteurs de publication, et je souhaite faire un
classement des auteurs et participants.

En gros :

(revue 1) cellule 1 = x noms d'auteurs séparés par des virgules
(revue 2) cellule 2 = y noms d'auteurs séparés par des virgules
..

Dans chaque cellule les noms sont uniques. Un auteur ne peut pas etre
présent deux fois dans une meme cellule, mais il peut etre present dans
différentes cellules en positions différentes.

Ce que je cherche à faire c'est obtenir :

Le classement d'un auteur dans les revues présentes et attibuer une
valeur selon la place.
Exemple :

revue1 : a,b,c,d,e,f,g
revue2 : b,g,f,e,d,a,c
...

La formule/macro me donnerais le premier, le deuxième, le dernier et
l'avant dernier auteur :
position_1_Revue_1 = a
position_2_Revue_1 = b
position_n_Revue_1 = g
postion_(n-1)_Revue_1 = f

position_1_Revue_1 = b
position_2_Revue_1 = g
position_n_Revue_1 = c
postion_(n-1)_Revue_1 = a
..

Une fois cela obtenue pour toutes les revues je dois additionner le
tout de la façon suivante :
Si premier ou dernier = +1
Si deuxième ou avant-dernier = +0.5
Si entre le deuxième et l'avant dernier = +025
(dans l'exemple précédent, l'auteur
a aurait +2
b aurait +1,5
c aurait +0,75
d aurait +0,5
e aurait +0,5
f aurait +1,25
g aurait +2

Ceci me permet à terme d'avoir un classement des auteurs selon leurs
position de citation dans les crédits d'une revue (ces positions étant
normalisées).

Quelqu'un peut-il m'aider ? Car j'ai franchement beaucoup de mal à
faire ça autrement que manuellement ....

PLEASE HELP !!!!!!!!!!!!!!


Avatar
Chris MICHEL
Bonjour,

voici une solution complète. Fais simplement gaffe: le
fomat des messages du forum force des passages à la ligne
qui font bugger le code. Il faudra donc que tu retouches
un peu la forme du code, mais normalement ça marche.

J'a en fait créer 4 fonctions que tu pourras utiliser dans
les feuilles Excel directement comme tu utilises SOMME ou
NBVAL par exemple. Elles sont aussi accessibles via le
petit fx de ta barre d'outils.

une fonction nb_virgules. Tu fournis un texte (ou une case
contenant du texte) et la fonction renvoie le nombre de
virgules (pas très utile pour toi, mais je m'en sers pour
les autres fonctions)

une fonction get_xème. Tu fournis un texte (une case
représentant une revue par exemple) et une position
(1,2...) et la fonction renvoie le nom de l'auteur
occupant cette position dans la revue.

Une fonction isIn. Tu fournis une revue et un nom, la
fonction renvoie VRAI si l'auteur est cité, FAUX sinon.

Une fonction points. Tu founis une plage de cellules
(chaque cellule représentant une revue) et un nom d'auteur
et la fonction renvoie le nombre de points selon les
critères que tu as énoncés.

avec tout ça, tu devrais pouvoir t'en sortir sans trop de
souci.

si as des questions n'hésite pas (j'ai testé les fonctions
et elles semblent marcher, mais je n'y ai pas passé des
heures non plus) et si tu as deux minutes, n'hésite pas à
expliquer comment l'ordre des citations est normalisé dans
les revues littéraires, je trouve rigolo.

Le code (à coller dans un module standard):



Function nb_virgules(ByVal revue As String) As Integer

Application.Volatile

Dim i, nb As Integer

For i = 1 To Len(revue)
If Mid(revue, i, 1) = "," Then nb = nb + 1
Next

nb_virgules = nb

End Function

Function get_xème(ByVal revue As String, ByVal index As
Integer) As String

Application.Volatile

If index > nb_virgules(revue) + 1 Then
get_xème = "index trop long"
Else
Dim deb, fin, virgindex, i As Integer
Dim continue As Boolean
continue = True
deb = 0
fin = 0
virgindex = 0
While continue
i = i + 1
If Mid(revue, i, 1) = "," Then virgindex =
virgindex + 1
If virgindex = index - 1 And deb = 0 And Not index
= 1 Then deb = i + 1
If virgindex = index And fin = 0 Then
fin = i - 1
continue = False
End If
If i = Len(revue) Then continue = False
Wend
If fin = 0 Then fin = Len(revue)
If deb = 0 Then deb = 1
get_xème = Mid(revue, deb, fin - deb + 1)

End If
End Function

Function isIn(ByVal revue As String, ByVal nom As String)
As Boolean
Application.Volatile

Dim i As Integer
Dim dedans As Boolean

i = 1
dedans = False

While i <= nb_virgules(revue) + 1 And Not dedans
If get_xème(revue, i) = nom Then dedans = True
i = i + 1
Wend

isIn = dedans

End Function


Function points(ByVal revues As Range, ByVal nom As
String) As Double
Application.Volatile

Dim c As Range
Dim score As Double
score = 0

For Each c In revues
If isIn(c.Value, nom) Then
If get_xème(c.Value, 1) = nom Or get_xème(c.Value,
nb_virgules(c.Value) + 1) = nom Then
score = score + 1
Else
If get_xème(c.Value, 2) = nom Or get_xème
(c.Value, nb_virgules(c.Value)) = nom Then
score = score + 0.5
Else
score = score + 0.25
End If
End If
End If
Next

points = score

End Function



Voila!

Chris.
-----Message d'origine-----
Bonjour à tous !

Je viens vers vous pour vous faire part d'un soucis que
je rencontre

actuellement.

Je possède une liste d'auteurs de publication, et je
souhaite faire un

classement des auteurs et participants.

En gros :

(revue 1) cellule 1 = x noms d'auteurs séparés par des
virgules

(revue 2) cellule 2 = y noms d'auteurs séparés par des
virgules

...

Dans chaque cellule les noms sont uniques. Un auteur ne
peut pas etre

présent deux fois dans une meme cellule, mais il peut
etre present dans

différentes cellules en positions différentes.

Ce que je cherche à faire c'est obtenir :

Le classement d'un auteur dans les revues présentes et
attibuer une

valeur selon la place.
Exemple :

revue1 : a,b,c,d,e,f,g
revue2 : b,g,f,e,d,a,c
....

La formule/macro me donnerais le premier, le deuxième, le
dernier et

l'avant dernier auteur :
position_1_Revue_1 = a
position_2_Revue_1 = b
position_n_Revue_1 = g
postion_(n-1)_Revue_1 = f

position_1_Revue_1 = b
position_2_Revue_1 = g
position_n_Revue_1 = c
postion_(n-1)_Revue_1 = a
...

Une fois cela obtenue pour toutes les revues je dois
additionner le

tout de la façon suivante :
Si premier ou dernier = +1
Si deuxième ou avant-dernier = +0.5
Si entre le deuxième et l'avant dernier = +025
(dans l'exemple précédent, l'auteur
a aurait +2
b aurait +1,5
c aurait +0,75
d aurait +0,5
e aurait +0,5
f aurait +1,25
g aurait +2

Ceci me permet à terme d'avoir un classement des auteurs
selon leurs

position de citation dans les crédits d'une revue (ces
positions étant

normalisées).

Quelqu'un peut-il m'aider ? Car j'ai franchement beaucoup
de mal à

faire ça autrement que manuellement ....

PLEASE HELP !!!!!!!!!!!!!!
.



Avatar
GARREC Charles
Merci beaucoup pour le coup de main.

Je rencontre un petit soucis toutefois dans la dernière fonction :

----------------------------------------------------------------------------------------------------
Function

Function points(ByVal revues As Range, ByVal nom As String) As Double
Application.Volatile

Dim c As Range
Dim score As Double
score = 0

For Each c In revues
If isIn(c.Value, nom) Then
If get_xème(c.Value, 1) = nom Or get_xème(c.Value,
nb_virgules(c.Value) + 1) = nom Then score = score + 1
Else
If get_xème(c.Value, 2) = nom Or get_xème(c.Value,
nb_virgules(c.Value)) = nom Then score = score + 0.5
Else <----------------------------------------
score = score + 0.25
End If
End If
End If
Next

points = score

End Function
----------------------------------------------------------------------------------------------------

Le


Le debogueur d'Excel me dit que le Else (voir fleche) pose soucis et me
renvoie le message suivant "Erreur de compilation : Else Sans If"
quand je fais une compilation VBAProject.

Tu vois comment faire ?

Pour ce qui est du classement, en fait il s'agit de revues
scientifiques, et les auteurs sont des chercheurs.

Le classement se fait de la façon suivante :

Le premier = Manipulateur en labo = +1
Le dernier = instigateur des recherches = +1
Le deuxième = suppléant = +0.5
L'avant dernier = suppléant = +0.5
Les autres = +0.25

En gros ce travail est un travail de pseudo Impact Factor.

A savoir qu'avec les noms et les revues, nous pouvons attribuer un
classement indicatif des activités de chercheurs.
Cela nous permet de mieux affiner nos études et de pouvoir mettre en
avant les chercheurs le plus objectivement , sans être influencés par
les "envois d'ascenseurs" ou autre.
Là on se base sur le travail écrit réellement produit.

Bonjour,

voici une solution complète. Fais simplement gaffe: le
fomat des messages du forum force des passages à la ligne
qui font bugger le code. Il faudra donc que tu retouches
un peu la forme du code, mais normalement ça marche.

J'a en fait créer 4 fonctions que tu pourras utiliser dans
les feuilles Excel directement comme tu utilises SOMME ou
NBVAL par exemple. Elles sont aussi accessibles via le
petit fx de ta barre d'outils.

une fonction nb_virgules. Tu fournis un texte (ou une case
contenant du texte) et la fonction renvoie le nombre de
virgules (pas très utile pour toi, mais je m'en sers pour
les autres fonctions)

une fonction get_xème. Tu fournis un texte (une case
représentant une revue par exemple) et une position
(1,2...) et la fonction renvoie le nom de l'auteur
occupant cette position dans la revue.

Une fonction isIn. Tu fournis une revue et un nom, la
fonction renvoie VRAI si l'auteur est cité, FAUX sinon.

Une fonction points. Tu founis une plage de cellules
(chaque cellule représentant une revue) et un nom d'auteur
et la fonction renvoie le nombre de points selon les
critères que tu as énoncés.

avec tout ça, tu devrais pouvoir t'en sortir sans trop de
souci.

si as des questions n'hésite pas (j'ai testé les fonctions
et elles semblent marcher, mais je n'y ai pas passé des
heures non plus) et si tu as deux minutes, n'hésite pas à
expliquer comment l'ordre des citations est normalisé dans
les revues littéraires, je trouve rigolo.

Le code (à coller dans un module standard):



Function nb_virgules(ByVal revue As String) As Integer

Application.Volatile

Dim i, nb As Integer

For i = 1 To Len(revue)
If Mid(revue, i, 1) = "," Then nb = nb + 1
Next

nb_virgules = nb

End Function

Function get_xème(ByVal revue As String, ByVal index As
Integer) As String

Application.Volatile

If index > nb_virgules(revue) + 1 Then
get_xème = "index trop long"
Else
Dim deb, fin, virgindex, i As Integer
Dim continue As Boolean
continue = True
deb = 0
fin = 0
virgindex = 0
While continue
i = i + 1
If Mid(revue, i, 1) = "," Then virgindex =
virgindex + 1
If virgindex = index - 1 And deb = 0 And Not index
= 1 Then deb = i + 1
If virgindex = index And fin = 0 Then
fin = i - 1
continue = False
End If
If i = Len(revue) Then continue = False
Wend
If fin = 0 Then fin = Len(revue)
If deb = 0 Then deb = 1
get_xème = Mid(revue, deb, fin - deb + 1)

End If
End Function

Function isIn(ByVal revue As String, ByVal nom As String)
As Boolean
Application.Volatile

Dim i As Integer
Dim dedans As Boolean

i = 1
dedans = False

While i <= nb_virgules(revue) + 1 And Not dedans
If get_xème(revue, i) = nom Then dedans = True
i = i + 1
Wend

isIn = dedans

End Function


Function points(ByVal revues As Range, ByVal nom As
String) As Double
Application.Volatile

Dim c As Range
Dim score As Double
score = 0

For Each c In revues
If isIn(c.Value, nom) Then
If get_xème(c.Value, 1) = nom Or get_xème(c.Value,
nb_virgules(c.Value) + 1) = nom Then
score = score + 1
Else
If get_xème(c.Value, 2) = nom Or get_xème
(c.Value, nb_virgules(c.Value)) = nom Then
score = score + 0.5
Else
score = score + 0.25
End If
End If
End If
Next

points = score

End Function



Voila!

Chris.
-----Message d'origine-----
Bonjour à tous !

Je viens vers vous pour vous faire part d'un soucis que
je rencontre

actuellement.

Je possède une liste d'auteurs de publication, et je
souhaite faire un

classement des auteurs et participants.

En gros :

(revue 1) cellule 1 = x noms d'auteurs séparés par des
virgules

(revue 2) cellule 2 = y noms d'auteurs séparés par des
virgules

...

Dans chaque cellule les noms sont uniques. Un auteur ne
peut pas etre

présent deux fois dans une meme cellule, mais il peut
etre present dans

différentes cellules en positions différentes.

Ce que je cherche à faire c'est obtenir :

Le classement d'un auteur dans les revues présentes et
attibuer une

valeur selon la place.
Exemple :

revue1 : a,b,c,d,e,f,g
revue2 : b,g,f,e,d,a,c
....

La formule/macro me donnerais le premier, le deuxième, le
dernier et

l'avant dernier auteur :
position_1_Revue_1 = a
position_2_Revue_1 = b
position_n_Revue_1 = g
postion_(n-1)_Revue_1 = f

position_1_Revue_1 = b
position_2_Revue_1 = g
position_n_Revue_1 = c
postion_(n-1)_Revue_1 = a
...

Une fois cela obtenue pour toutes les revues je dois
additionner le

tout de la façon suivante :
Si premier ou dernier = +1
Si deuxième ou avant-dernier = +0.5
Si entre le deuxième et l'avant dernier = +025
(dans l'exemple précédent, l'auteur
a aurait +2
b aurait +1,5
c aurait +0,75
d aurait +0,5
e aurait +0,5
f aurait +1,25
g aurait +2

Ceci me permet à terme d'avoir un classement des auteurs
selon leurs

position de citation dans les crédits d'une revue (ces
positions étant

normalisées).

Quelqu'un peut-il m'aider ? Car j'ai franchement beaucoup
de mal à

faire ça autrement que manuellement ....

PLEASE HELP !!!!!!!!!!!!!!
.




Avatar
Chris MICHEL
Désolé de ne repasser que si tard:

Je vois le bug. Il faut que tu mettes un saut de ligne
(que tu appuies sur Enter, donc) après chaque "then" car
si tu mets l'instruction dans la même ligne, il considère
le bloc If comme terminé et ne comprend pas que le Else va
avec.

Merci pour l'explication.

Chris.
-----Message d'origine-----
Merci beaucoup pour le coup de main.

Je rencontre un petit soucis toutefois dans la dernière
fonction :


----------------------------------------------------------
------------------------------------------

Function

Function points(ByVal revues As Range, ByVal nom As
String) As Double

Application.Volatile

Dim c As Range
Dim score As Double
score = 0

For Each c In revues
If isIn(c.Value, nom) Then
If get_xème(c.Value, 1) = nom Or get_xème(c.Value,
nb_virgules(c.Value) + 1) = nom Then score = score + 1
Else
If get_xème(c.Value, 2) = nom Or get_xème
(c.Value,

nb_virgules(c.Value)) = nom Then score = score + 0.5
Else <----------------------------------------
score = score + 0.25
End If
End If
End If
Next

points = score

End Function
----------------------------------------------------------
------------------------------------------


Le


Le debogueur d'Excel me dit que le Else (voir fleche)
pose soucis et me

renvoie le message suivant "Erreur de compilation : Else
Sans If"

quand je fais une compilation VBAProject.

Tu vois comment faire ?

Pour ce qui est du classement, en fait il s'agit de
revues

scientifiques, et les auteurs sont des chercheurs.

Le classement se fait de la façon suivante :

Le premier = Manipulateur en labo = +1
Le dernier = instigateur des recherches = +1
Le deuxième = suppléant = +0.5
L'avant dernier = suppléant = +0.5
Les autres = +0.25

En gros ce travail est un travail de pseudo Impact Factor.

A savoir qu'avec les noms et les revues, nous pouvons
attribuer un

classement indicatif des activités de chercheurs.
Cela nous permet de mieux affiner nos études et de
pouvoir mettre en

avant les chercheurs le plus objectivement , sans être
influencés par

les "envois d'ascenseurs" ou autre.
Là on se base sur le travail écrit réellement produit.

Bonjour,

voici une solution complte. Fais simplement gaffe:
le


fomat des messages du forum force des passages la
ligne


qui font bugger le code. Il faudra donc que tu
retouches


un peu la forme du code, mais normalement a marche.

J'a en fait crer 4 fonctions que tu pourras utiliser
dans


les feuilles Excel directement comme tu utilises SOMME
ou


NBVAL par exemple. Elles sont aussi accessibles via
le


petit fx de ta barre d'outils.

une fonction nb_virgules. Tu fournis un texte (ou une
case


contenant du texte) et la fonction renvoie le nombre
de


virgules (pas trs utile pour toi, mais je m'en sers
pour


les autres fonctions)

une fonction get_xme. Tu fournis un texte (une
case


reprsentant une revue par exemple) et une position
(1,2...) et la fonction renvoie le nom de l'auteur
occupant cette position dans la revue.

Une fonction isIn. Tu fournis une revue et un nom, la
fonction renvoie VRAI si l'auteur est cit, FAUX
sinon.



Une fonction points. Tu founis une plage de cellules
(chaque cellule reprsentant une revue) et un nom
d'auteur


et la fonction renvoie le nombre de points selon les
critres que tu as noncs.

avec tout a, tu devrais pouvoir t'en sortir sans
trop de


souci.

si as des questions n'hsite pas (j'ai test les
fonctions


et elles semblent marcher, mais je n'y ai pas pass
des


heures non plus) et si tu as deux minutes, n'hsite
pas


expliquer comment l'ordre des citations est normalis
dans


les revues littraires, je trouve rigolo.

Le code ( coller dans un module standard):



Function nb_virgules(ByVal revue As String) As Integer

Application.Volatile

Dim i, nb As Integer

For i = 1 To Len(revue)
If Mid(revue, i, 1) = "," Then nb = nb + 1
Next

nb_virgules = nb

End Function

Function get_xme(ByVal revue As String, ByVal index
As


Integer) As String

Application.Volatile

If index > nb_virgules(revue) + 1 Then
get_xme = "index trop long"
Else
Dim deb, fin, virgindex, i As Integer
Dim continue As Boolean
continue = True
deb = 0
fin = 0
virgindex = 0
While continue
i = i + 1
If Mid(revue, i, 1) = "," Then virgindex
=


virgindex + 1
If virgindex = index - 1 And deb = 0 And
Not index


= 1 Then deb = i + 1
If virgindex = index And fin = 0 Then
fin = i - 1
continue = False
End If
If i = Len(revue) Then continue = False
Wend
If fin = 0 Then fin = Len(revue)
If deb = 0 Then deb = 1
get_xme = Mid(revue, deb, fin - deb + 1)

End If
End Function

Function isIn(ByVal revue As String, ByVal nom As
String)


As Boolean
Application.Volatile

Dim i As Integer
Dim dedans As Boolean

i = 1
dedans = False

While i <= nb_virgules(revue) + 1 And Not dedans
If get_xme(revue, i) = nom Then dedans = True
i = i + 1
Wend

isIn = dedans

End Function


Function points(ByVal revues As Range, ByVal nom As
String) As Double
Application.Volatile

Dim c As Range
Dim score As Double
score = 0

For Each c In revues
If isIn(c.Value, nom) Then
If get_xme(c.Value, 1) = nom Or get_xme
(c.Value,


nb_virgules(c.Value) + 1) = nom Then
score = score + 1
Else
If get_xme(c.Value, 2) = nom Or
get_xme


(c.Value, nb_virgules(c.Value)) = nom Then
score = score + 0.5
Else
score = score + 0.25
End If
End If
End If
Next

points = score

End Function



Voila!

Chris.
-----Message d'origine-----
Bonjour tous !

Je viens vers vous pour vous faire part d'un soucis
que



je rencontre
actuellement.

Je possde une liste d'auteurs de publication, et
je



souhaite faire un
classement des auteurs et participants.

En gros :

(revue 1) cellule 1 = x noms d'auteurs spars
par des



virgules
(revue 2) cellule 2 = y noms d'auteurs spars
par des



virgules
...

Dans chaque cellule les noms sont uniques. Un auteur
ne



peut pas etre
prsent deux fois dans une meme cellule, mais il
peut



etre present dans
diffrentes cellules en positions diffrentes.

Ce que je cherche faire c'est obtenir :

Le classement d'un auteur dans les revues prsentes
et



attibuer une
valeur selon la place.
Exemple :

revue1 : a,b,c,d,e,f,g
revue2 : b,g,f,e,d,a,c
....

La formule/macro me donnerais le premier, le
deuxime, le



dernier et
l'avant dernier auteur :
position_1_Revue_1 = a
position_2_Revue_1 = b
position_n_Revue_1 = g
postion_(n-1)_Revue_1 = f

position_1_Revue_1 = b
position_2_Revue_1 = g
position_n_Revue_1 = c
postion_(n-1)_Revue_1 = a
...

Une fois cela obtenue pour toutes les revues je dois
additionner le

tout de la faon suivante :
Si premier ou dernier = +1
Si deuxime ou avant-dernier = +0.5
Si entre le deuxime et l'avant dernier = +025
(dans l'exemple prcdent, l'auteur
a aurait +2
b aurait +1,5
c aurait +0,75
d aurait +0,5
e aurait +0,5
f aurait +1,25
g aurait +2

Ceci me permet terme d'avoir un classement des
auteurs



selon leurs
position de citation dans les crdits d'une revue
(ces



positions tant
normalises).

Quelqu'un peut-il m'aider ? Car j'ai franchement
beaucoup



de mal
faire a autrement que manuellement ....

PLEASE HELP !!!!!!!!!!!!!!
.




.