[résolu] petit souci sur une macro VBA ici-même (Robert)

stephsteph

XLDnaute Occasionnel
Bonjour,
J'ai trouvé dans ce fil...
https://www.excel-downloads.com/thr...ages-noms-definies-avec-une-condition.209615/
une macro qui me convient et je l'ai adaptée comme ci-après...
Elle fonctionne (c'est encore plus simple, il n'y a qu'une seule colonne), les champs sont créés... mais ils ne vont pas de la 1ère à la dernière ligne concernée, ils ne contiennent chacun que la dernière ligne (soit une seule cellule).
Des pistes s'il vous plait... cela doit me sauter aux yeux mais j'ai trituré pas mal, et je déclare forfait.

Merci, Steph

Sub Fieldsabstracts()
'
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim d As Object 'déclare la variable d (Dictionnaire)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim tmp As Variant 'déclare la variable tmp (tableau TeMPoraire)
Dim tp() As Range 'déclare le tableau de variables indéxées tp (Tableau des Plages)
Dim n() As String 'déclare le tableau de variables indéxées n (tableau des Noms)
Dim x As Integer 'déclare la variable x
Set o = Sheets("abstracts") 'définit l'onglet o
dl = o.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A)
Set pl = o.Range("A1:A" & dl) 'définit la plage pl
Set d = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
If cel.Value <> "" Then d(cel.Value) = "" 'alimente le dictionnaire des cellules non vides
Next cel 'prochaine cellule cel de la plage pl
tmp = d.keys 'récupère la liste sans doublons dans le tableau temporaire tmp
ReDim tp(d.Count) 'redimensionne le tableau des plages tp
ReDim n(d.Count) 'redimensionne le tableau des nom n
For x = 0 To UBound(tmp) 'boucles sur toutes les valeurs uniques du tableau tmp
Set tp(x) = Range("A1") 'pré définit la plage tp(x)
For Each cel In pl 'boucle 2 sur toutes les cellules de la plage pl
If cel.Value = tmp(x) Then 'condition : si la valeur de la cellule est égale à la valeur unique du tableau tmp
'définit la plage tp(x)
Set tp(x) = IIf(tp(x).Cells.Count = 1, o.Cells(cel.Row, 2).Resize(1, 1), Application.Union(tp(x), o.Cells(cel.Row, 2).Resize(1, 1)))
' 2 correspond à la colonne de départ et le 2ème 1 de resize le nombre de colonnes jusqu'à la dernière du champ
n(x) = cel.Offset(0, 0).Value 'définit le nom n(x)
' alternative n(x) = o.Cells(cel.Row, 7).Value si pas contiguë
End If 'fin de la condition
Next cel 'prochaine cellule de la plage
tp(x).Name = " __" & n(x) 'attribue le nom n(x) à la plage tp(x)
Next x 'prochaine valeur unique du tableau tmp
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : petit souci sur une macro VBA ici-même (Robert)

Bonjour à tous

stepsteph
Était-il vraiment nécessaire de créer un second fil?
Un petit up dans ton fil d'origine pouvait suffire, non ?
(avec l'avantage de voir tout le déroulé du fil)

PS:
J'ai trouvé dans ce fil...
http://www.excel-downloads.com/forum...condition.html
une macro qui me convient et je l'ai adaptée comme ci-après...
Tu es l'initiatrice du dit fil ;)!
La formulation est pour le moins bizarre :confused:
 
Dernière édition:

stephsteph

XLDnaute Occasionnel
Re : petit souci sur une macro VBA ici-même (Robert)

Bonjour Staple 1600
Pourtant c'est bien moi, rien de bizarre.
Je suis désolée si c'est ambigu.
Si le modérateur veut déplacer, pour moi c'est OK.
En fait j'ai hésité mais il y avait des plus et des moins.
Aujourd'hui où tout va trop vite j'ai pensé que du neuf c'était mieux plutôt qu'obliger ceux qui aident à lire tout le fil précédent.
L'os doit être tout simple mais avec mes yeux de guêpe je ne le vois pas.
Merci d'avance
A+
Steph
 

stephsteph

XLDnaute Occasionnel
Re : petit souci sur une macro VBA ici-même (Robert)

Bonjour,
Je pensais que je ne voyais pas une erreur...
Mais en réalité il s'agit d'un problème de code (plus excactement dans l'adaptation du code précédent).
Le code précédent permettait de sélectionner une plage de plusieurs colonnes et de plusieurs lignes.
Mais ici ma plage n'a qu'une seule colonne (et plusieurs lignes).
Si j'écris le code suivant,
Code:
Set tp(x) = IIf(tp(x).Cells.Count = 1, o.Cells(cel.Row, 2).Resize(1, 1), Application.Union(tp(x), o.Cells(cel.Row, 2).Resize(1, 1)))
je n'obtiens que le dernière ligne de la plage nommée (sur une seule colonne, soit une seule cellule).
Mais si je modifie en :
Code:
Set tp(x) = IIf(tp(x).Cells.Count = 1, o.Cells(cel.Row, 2).Resize(1, 2), Application.Union(tp(x), o.Cells(cel.Row, 2).Resize(1, 2)))
Alors là c'est OK (j'ai bien mes plages avec toute les lignes sélectionnées)... mais j'ai une 2ème colonne dont je ne veux pas.
Donc c'est bien le code de cette ligne qui n'est plus correct pour mon adaptation...
Et là je ne suis plus compétente en VBA por ré-écrire cette ligne de code.

Quelqu'un peut-il aider?
(j'ai regardé la fonction resize sur Internet mais cela dépasse mes compétences et j'ai même essayé de supprimer ce bout de code, sans succès).
Merci d'avance
A+, Steph
 

stephsteph

XLDnaute Occasionnel
Re : petit souci sur une macro VBA ici-même (Robert)

Bonjour,
Sans aucune réponse je fais une autre tentative.
Regardez le fichier Excel ci-joint.
J'ai fait tourner la macro.
Maintenant si vous visionnez le contenu de la plage __1980, le résultat ne pointe que sur la cellule L23C2.
Alors que j'attend L15C2-L23C2.
Je ne me suis pas trompée, la macro fonctionne mais l'adaptation ne doit pas pouvoir se faire pour une plage d'une seule colonne.
Comment faire?
Merci d'avance, Steph
 

Pièces jointes

  • testabstract.xlsm
    28.2 KB · Affichages: 33

Efgé

XLDnaute Barbatruc
Re : petit souci sur une macro VBA ici-même (Robert)

Bonjour stephsteph , Salut Staple

En espérant que Robert ne m'en voudra pas trop;
Une modif, pas très belle, mais qui fonctionne.
Sous 2003, le Iif fait mauvais ménage avec le Set.
Les lignes modifiées sont suivies d'astérisques.

Si Robert passe par ici, je pense qu'il trouvera bien mieux
Cordialement
 

Pièces jointes

  • test.xls
    101.5 KB · Affichages: 39
  • test.xls
    101.5 KB · Affichages: 41
  • test.xls
    101.5 KB · Affichages: 36

stephsteph

XLDnaute Occasionnel
Re : petit souci sur une macro VBA ici-même (Robert)

Ah Efgé merci de ton aide.
Cela marche en effet, même sur Excel 2007, que j'ai moi.
Pourrais-tu m'éclairer (sans m'éblouir... je blague)?
sur tes modifs.
La macro VBA de Robert continue à marcher nickel sur un autre fichier avec des plages sur plusieurs colonnes (toujours avec 2007).
Je n'arrive pas à comprendre (c'est juste pour me faire progresser... je serai un peu moins nulle).
Bon en tout cas c'est OK et je te remercie beaucoup.
A+
Steph
 

Efgé

XLDnaute Barbatruc
Re : petit souci sur une macro VBA ici-même (Robert)

Re
Je pense avoir trouvé:
Dans le code d'origine, on agrandi le range tp(x) si ce range n'a qu'une cellule.
Donc dans la nouvelle version, comme on ne prend qu'une cellule, on ne l'agrandi jamais.
On peux jouer sur le fait que les cellules a prendre en compte sont en colonne B
Cela permet de vérifier l'adresse de tp(x)
Résultat :
On attribu le range $A$1 à Tp(x)
Si ensuite on vérifie la situation et si besoin on agrandis :
Set tp(x) = IIf(tp(x).Address = "$a$1", o.Cells(cel.Row, 2), Application.Union(tp(x), o.Cells(cel.Row, 2)))
Voir exemple
Cordialement
 

Pièces jointes

  • test.xls
    100 KB · Affichages: 36
  • test.xls
    100 KB · Affichages: 39
  • test.xls
    100 KB · Affichages: 39

stephsteph

XLDnaute Occasionnel
Re : petit souci sur une macro VBA ici-même (Robert)

Bonjour Efgé,

Merci, c'est beaucoup plus clair avec ton nouveau fichier et tes explications.
La nouvelle macro est cependant moins performante que la précédente car (par exemple pour 1991):
la plage est définie par =abstracts!$a$1;abstracts!$b$157:$b$163, et la 1ère cellule est encadrée et les suivantes sont bleutées (avec Excel 2007),
alors que dans la verion précédente la plage était simplement =abstracts!!$b$157:$b$163 sans cadre ni bleuté.
Bon, merci encore, l'essentiel est que le souci soit résolu.

Et merci encore aussi à Robert qui a permis cette très utile macro.

Steph
 

Staple1600

XLDnaute Barbatruc
Re : [résolu] petit souci sur une macro VBA ici-même (Robert)

Bonjour à tous

Il peut arriver que les majuscules déclenchent des phobies chez certains sujets végétaliens nés les années impaires.
Dans ce cas, utilisez cette variante, mais uniquement les nuits de pleine lune.
IIf(Lcase(tp(x).Address) = "$a$1"

OK je sors ;)
 

Discussions similaires

Réponses
1
Affichages
160

Statistiques des forums

Discussions
312 103
Messages
2 085 325
Membres
102 862
dernier inscrit
Emma35400