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

Nommer si

13 réponses
Avatar
Misange
Bonjour,
J'ai un tableau comportant de grandes séries de données triées par
catégorie d'échantillon
les catégories sont les unes en dessous des autres sans espace
j'aurais besoin de nommer les plages de la colonne B en fonction du
critère de la colonne A
Et pour arranger le tout, ce serait encore mieux si c'était dynamique,
ce tableau grossissant de jour en jour...
A B
1 d
1 f
1 e
1 e
2 f
2 f
2 j
5 y
5 o
3 j
3 r
3 t

Si vous avez une idée, je suis très preneuse !
merci

--
Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

3 réponses

1 2
Avatar
Misange
Bonjour Daniel ;-)

J'ai un plantage "nom non valide" sur
ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Range("LesTitres")(1, 1)(1, j), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address

j'ai viré de mon tableau tout ce qui pouvait poser un problème
particulier mais ça plante toujours à cet endroit (excel 2002)
Merci de t'intéresser à cette question.
Amicalement
Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonsoir Misange,

Voici du code VBA pour la même idée (en itérant sur l'ensemble des
colonnes).

Ici, on considère que la première rangée contient les titres des colonnes
(A1:J1 par exemple) et est nommée LesTitres.

Sub Nomme2()

Dim Plg As Range
Dim i As Long, j As Long
Dim Prev As Variant
Dim V As Variant

'' Enleve les Noms courants (au cas où les Plages rétrécissent)
'For i = ActiveWorkbook.Names.Count To 1 Step -1
' If ActiveWorkbook.Names(i).Name Like "Crit_*" Then
' ActiveWorkbook.Names(i).Delete
' End If
'Next i

' Ligne 1 contient les Titres => Donc, Plg commence en ligne A2
Set Plg = Range([A2], [A65000].End(xlUp))
ReDim V(1 To Plg.Rows.Count + 1) ' max d'entrées

Prev = ""
j = 1

For i = 1 To Plg.Rows.Count
If Plg(i).Value <> Prev Then
Prev = Plg(i).Value
V(j) = i
j = j + 1
End If
Next i
V(j) = i ' sentinelle servant au calcul de la dernière entrée

ReDim Preserve V(1 To j)

For i = 1 To UBound(V) - LBound(V)
For j = 1 To Range("LesTitres").Columns.Count
ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Range("LesTitres")(1, 1)(1, j), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address
Next j
Next i

End Sub

Salutations,

Daniel M.

"Misange" wrote in message
news:
la très jolie soluce proposée par JB :

Nommage de champs par VBA:

Sub Nomme()
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In Range([A1], [A65000].End(xlUp))
If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value Next c
For Each c In MonDico.items
Set cellule = [A:A].Find(What:=c, After:=[A65000], LookIn:=xlFormulas,
SearchOrder:=xlByRows, SearchDirection:=xlNext)
ActiveWorkbook.Names.Add Name:="critere" & c, _
RefersTo:="=" & cellule.Offset(0,
1).Resize(Application.CountIf([A:A],
c), 1).Address
Next c
End Sub

court efficace, adopté et surement bientôt en ligne sur excelabo !

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

salut AV
De fait ma base est organisée suivant les règles de bonnes pratiques du
MPFE ;-)

ta réflexion est frappée au coin du bon sens en ce qui concerne la
gestion des ressources.
La soluce que tu proposes ne me convient pourtant pas car ce n'est pas
une base de données que j'ai besoin de nommer. Ce qui change c'est bien
sur la taille globale de la base mais surtout le nombre d'échantillons de
chaque type
ex : lundi
A B C D E
1 3.2 4 90 67
1 4
1 7
2 1.1
2 9
3 0

mardi
1 3.2
1 4
1 7
1 18
2 1.1
2 9
3 0
3 2
4 7

lundi je dois avoir 3 plages nommées contenant les valeurs de la colonne
B qui ont respectivement 1, 2 et 3 en colonne A (+ 3 pour la colonne C
avec 1 en colonne A + 3 en colonne D....)
idem mardi. En fait il y a une vingtaine de plages nommées dans chaque
colonne x une dizaine correspondant aux différents types de valeurs pour
un même échantillon !
Mais ta réflexio me fait réaliser que mon classeur va très vite bouffer
toutes mes ressources.
Finalement je vais peut être nommer mes plages par VBA à chaque mise à
jour des données...
merci de la réflexion

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Ave zoziau,

Le but c'est de faire tout ça automatiquement avec des plages qui
changent de jour en jour.....
Un avis...

Si la fonction DECALER présente un incontestable intérêt, ça n'est pas
pour autant la panacée quand il s'agit de définition de noms dans une
base de données car elle a un inconvénient de taille : c'est une
fonction volatile !
Donc je te dis pas le nombre de recalculs qu'implique l'utilisation du
fichier surtout si, comme c'est bien souvent le cas, la fonction est
combinée avec d'autres comme NBVAL, NB.SI, EQUIV, MAX.... 1 à X appels
de fonctions par formule de définition des noms ça pèse...
Il me paraît plus intéressant et, à terme, plus efficace, de renommer
les plages à chaque "alimentation".
Si, ta base de données est (comme je le subodore) bien organisée
(A1:XXxx et noms de champ en ligne 1), une toute petite ligne de
commande suffit à renommer l'ensemble des champs en utilisant
"CurrentRegion".
Exemple avec une feuille nommée BD :

[BD!A1].CurrentRegion.CreateNames Top:=True

A bientôt...

AV













Avatar
Daniel.M
Bonsoir Misange,

D'après moi, les noms d'entête qui servent à générer les Noms, puisqu'on
utilise Range("LesTitres"), contiennent des espaces (ou des retour de
charriot) ce qui est illégal pour un nom dans Excel.

Essai avec des noms très peu compliqués (en remplaçant les espaces par des
"_").

En passant, l'utilisation de la plage Range("LesTitres") dans la
constitution des Noms est totalement optionnelle : on pourrait utiliser
seulement les numéros de colonne (voir ci-dessous) mais ça serait moins
clair à mon avis.

ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Format(j, "00"), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address

Salutations,

Daniel M.

"Misange" wrote in message
news:eLVfu%
Bonjour Daniel ;-)

J'ai un plantage "nom non valide" sur
ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Range("LesTitres")(1, 1)(1, j), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address

j'ai viré de mon tableau tout ce qui pouvait poser un problème particulier
mais ça plante toujours à cet endroit (excel 2002)
Merci de t'intéresser à cette question.
Amicalement
Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonsoir Misange,

Voici du code VBA pour la même idée (en itérant sur l'ensemble des
colonnes).

Ici, on considère que la première rangée contient les titres des colonnes
(A1:J1 par exemple) et est nommée LesTitres.

Sub Nomme2()

Dim Plg As Range
Dim i As Long, j As Long
Dim Prev As Variant
Dim V As Variant

'' Enleve les Noms courants (au cas où les Plages rétrécissent)
'For i = ActiveWorkbook.Names.Count To 1 Step -1
' If ActiveWorkbook.Names(i).Name Like "Crit_*" Then
' ActiveWorkbook.Names(i).Delete
' End If
'Next i

' Ligne 1 contient les Titres => Donc, Plg commence en ligne A2
Set Plg = Range([A2], [A65000].End(xlUp))
ReDim V(1 To Plg.Rows.Count + 1) ' max d'entrées

Prev = ""
j = 1

For i = 1 To Plg.Rows.Count
If Plg(i).Value <> Prev Then
Prev = Plg(i).Value
V(j) = i
j = j + 1
End If
Next i
V(j) = i ' sentinelle servant au calcul de la dernière entrée

ReDim Preserve V(1 To j)

For i = 1 To UBound(V) - LBound(V)
For j = 1 To Range("LesTitres").Columns.Count
ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Range("LesTitres")(1, 1)(1, j), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address
Next j
Next i

End Sub

Salutations,

Daniel M.

"Misange" wrote in message
news:
la très jolie soluce proposée par JB :

Nommage de champs par VBA:

Sub Nomme()
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In Range([A1], [A65000].End(xlUp))
If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value Next
c For Each c In MonDico.items
Set cellule = [A:A].Find(What:=c, After:=[A65000],
LookIn:=xlFormulas,
SearchOrder:=xlByRows, SearchDirection:=xlNext)
ActiveWorkbook.Names.Add Name:="critere" & c, _
RefersTo:="=" & cellule.Offset(0,
1).Resize(Application.CountIf([A:A],
c), 1).Address
Next c
End Sub

court efficace, adopté et surement bientôt en ligne sur excelabo !

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

salut AV
De fait ma base est organisée suivant les règles de bonnes pratiques du
MPFE ;-)

ta réflexion est frappée au coin du bon sens en ce qui concerne la
gestion des ressources.
La soluce que tu proposes ne me convient pourtant pas car ce n'est pas
une base de données que j'ai besoin de nommer. Ce qui change c'est bien
sur la taille globale de la base mais surtout le nombre d'échantillons
de chaque type
ex : lundi
A B C D E
1 3.2 4 90 67
1 4
1 7
2 1.1
2 9
3 0

mardi
1 3.2
1 4
1 7
1 18
2 1.1
2 9
3 0
3 2
4 7

lundi je dois avoir 3 plages nommées contenant les valeurs de la
colonne B qui ont respectivement 1, 2 et 3 en colonne A (+ 3 pour la
colonne C avec 1 en colonne A + 3 en colonne D....)
idem mardi. En fait il y a une vingtaine de plages nommées dans chaque
colonne x une dizaine correspondant aux différents types de valeurs
pour un même échantillon !
Mais ta réflexio me fait réaliser que mon classeur va très vite bouffer
toutes mes ressources.
Finalement je vais peut être nommer mes plages par VBA à chaque mise à
jour des données...
merci de la réflexion

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Ave zoziau,

Le but c'est de faire tout ça automatiquement avec des plages qui
changent de jour en jour.....
Un avis...

Si la fonction DECALER présente un incontestable intérêt, ça n'est pas
pour autant la panacée quand il s'agit de définition de noms dans une
base de données car elle a un inconvénient de taille : c'est une
fonction volatile !
Donc je te dis pas le nombre de recalculs qu'implique l'utilisation du
fichier surtout si, comme c'est bien souvent le cas, la fonction est
combinée avec d'autres comme NBVAL, NB.SI, EQUIV, MAX.... 1 à X appels
de fonctions par formule de définition des noms ça pèse...
Il me paraît plus intéressant et, à terme, plus efficace, de renommer
les plages à chaque "alimentation".
Si, ta base de données est (comme je le subodore) bien organisée
(A1:XXxx et noms de champ en ligne 1), une toute petite ligne de
commande suffit à renommer l'ensemble des champs en utilisant
"CurrentRegion".
Exemple avec une feuille nommée BD :

[BD!A1].CurrentRegion.CreateNames Top:=True

A bientôt...

AV














Avatar
Misange
Je n'ai pas du tout pensé à ça effectivement !
il y avait quelques espaces. En les supprimant, ça marche impec.
Très sympa, ca s'adapte ainsi très facilement à n'importe quel classeur
dans lequel on rencontre ce genre de problématique (c.a.d très souvent
en ce qui me concerne !)
Je stocke précieusement et je mettrai surement en ligne (les cordonniers
ne sont pas toujours les plus mal chaussés, charité bien ordonnée
commence par soi même ... :-)

encore merci

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonsoir Misange,

D'après moi, les noms d'entête qui servent à générer les Noms, puisqu'on
utilise Range("LesTitres"), contiennent des espaces (ou des retour de
charriot) ce qui est illégal pour un nom dans Excel.

Essai avec des noms très peu compliqués (en remplaçant les espaces par des
"_").

En passant, l'utilisation de la plage Range("LesTitres") dans la
constitution des Noms est totalement optionnelle : on pourrait utiliser
seulement les numéros de colonne (voir ci-dessous) mais ça serait moins
clair à mon avis.

ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Format(j, "00"), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address

Salutations,

Daniel M.

"Misange" wrote in message
news:eLVfu%
Bonjour Daniel ;-)

J'ai un plantage "nom non valide" sur
ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Range("LesTitres")(1, 1)(1, j), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address

j'ai viré de mon tableau tout ce qui pouvait poser un problème particulier
mais ça plante toujours à cet endroit (excel 2002)
Merci de t'intéresser à cette question.
Amicalement
Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonsoir Misange,

Voici du code VBA pour la même idée (en itérant sur l'ensemble des
colonnes).

Ici, on considère que la première rangée contient les titres des colonnes
(A1:J1 par exemple) et est nommée LesTitres.

Sub Nomme2()

Dim Plg As Range
Dim i As Long, j As Long
Dim Prev As Variant
Dim V As Variant

'' Enleve les Noms courants (au cas où les Plages rétrécissent)
'For i = ActiveWorkbook.Names.Count To 1 Step -1
' If ActiveWorkbook.Names(i).Name Like "Crit_*" Then
' ActiveWorkbook.Names(i).Delete
' End If
'Next i

' Ligne 1 contient les Titres => Donc, Plg commence en ligne A2
Set Plg = Range([A2], [A65000].End(xlUp))
ReDim V(1 To Plg.Rows.Count + 1) ' max d'entrées

Prev = ""
j = 1

For i = 1 To Plg.Rows.Count
If Plg(i).Value <> Prev Then
Prev = Plg(i).Value
V(j) = i
j = j + 1
End If
Next i
V(j) = i ' sentinelle servant au calcul de la dernière entrée

ReDim Preserve V(1 To j)

For i = 1 To UBound(V) - LBound(V)
For j = 1 To Range("LesTitres").Columns.Count
ActiveWorkbook.Names.Add Name:="Crit_" & Plg(V(i)) & "_" & _
Range("LesTitres")(1, 1)(1, j), _
RefersTo:="=" & Plg(V(i), j).Resize(V(i + 1) - V(i)).Address
Next j
Next i

End Sub

Salutations,

Daniel M.

"Misange" wrote in message
news:
la très jolie soluce proposée par JB :

Nommage de champs par VBA:

Sub Nomme()
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In Range([A1], [A65000].End(xlUp))
If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value Next
c For Each c In MonDico.items
Set cellule = [A:A].Find(What:=c, After:=[A65000],
LookIn:=xlFormulas,
SearchOrder:=xlByRows, SearchDirection:=xlNext)
ActiveWorkbook.Names.Add Name:="critere" & c, _
RefersTo:="=" & cellule.Offset(0,
1).Resize(Application.CountIf([A:A],
c), 1).Address
Next c
End Sub

court efficace, adopté et surement bientôt en ligne sur excelabo !

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

salut AV
De fait ma base est organisée suivant les règles de bonnes pratiques du
MPFE ;-)

ta réflexion est frappée au coin du bon sens en ce qui concerne la
gestion des ressources.
La soluce que tu proposes ne me convient pourtant pas car ce n'est pas
une base de données que j'ai besoin de nommer. Ce qui change c'est bien
sur la taille globale de la base mais surtout le nombre d'échantillons
de chaque type
ex : lundi
A B C D E
1 3.2 4 90 67
1 4
1 7
2 1.1
2 9
3 0

mardi
1 3.2
1 4
1 7
1 18
2 1.1
2 9
3 0
3 2
4 7

lundi je dois avoir 3 plages nommées contenant les valeurs de la
colonne B qui ont respectivement 1, 2 et 3 en colonne A (+ 3 pour la
colonne C avec 1 en colonne A + 3 en colonne D....)
idem mardi. En fait il y a une vingtaine de plages nommées dans chaque
colonne x une dizaine correspondant aux différents types de valeurs
pour un même échantillon !
Mais ta réflexio me fait réaliser que mon classeur va très vite bouffer
toutes mes ressources.
Finalement je vais peut être nommer mes plages par VBA à chaque mise à
jour des données...
merci de la réflexion

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Ave zoziau,

Le but c'est de faire tout ça automatiquement avec des plages qui
changent de jour en jour.....
Un avis...

Si la fonction DECALER présente un incontestable intérêt, ça n'est pas
pour autant la panacée quand il s'agit de définition de noms dans une
base de données car elle a un inconvénient de taille : c'est une
fonction volatile !
Donc je te dis pas le nombre de recalculs qu'implique l'utilisation du
fichier surtout si, comme c'est bien souvent le cas, la fonction est
combinée avec d'autres comme NBVAL, NB.SI, EQUIV, MAX.... 1 à X appels
de fonctions par formule de définition des noms ça pèse...
Il me paraît plus intéressant et, à terme, plus efficace, de renommer
les plages à chaque "alimentation".
Si, ta base de données est (comme je le subodore) bien organisée
(A1:XXxx et noms de champ en ligne 1), une toute petite ligne de
commande suffit à renommer l'ensemble des champs en utilisant
"CurrentRegion".
Exemple avec une feuille nommée BD :

[BD!A1].CurrentRegion.CreateNames Top:=True

A bientôt...

AV
















1 2