XL 2016 Comment utiliser des zones (range) nommées ou définies dans un sous-programme

Phillip

XLDnaute Occasionnel
Bonjour,

Je cherche à avoir un sous-programme (SP) qui me définit des zones. Lorsque ce sous-programme se termine, mes zones n'existent pas dans le programme principal qui plante donc. J'ai donc pensé "nommer" mes plages dans mes feuilles grâce à mon sous programme, ça ça marche, mais après, quand je reviens au programme principal, il ne fait pas ce que je voudrais sur la zone définie et nommée dans le SP. Je pense que j'ai un problème de syntaxe, et je me mélange entre les "set " quelque chose et "nommer" quelque chose !

VB:
Sub test()
'
'un certain nombre d'operations

Call sousprogramme
'ce sous-programme est long et je voudrais le mettre à part, et m'en servir avec differentes variables

'ici, ca plante, car mon programme principal, ne semble pas pouvoir chercher dans une zone nommee par mon sousprogramme
somdep = 0

For Each depense In zoneLM
 
    datedep = Format(depense.Offset(, 1), "m")
    If datedep = Vmois Then
    somdep = somdep + depense
    End If
Next depense


End Sub

Sub sousprogramme()
'definit une zone en fonction de bornes (2 cellules)
Set zoneLM = Range(debcellLM, debcellepicerie.Offset(-1, 2))
'je rajoute ce nom dans mon classeur
ActiveWorkbook.Names.Add Name:="zoneLM", RefersTo:=zoneLM
End Sub

Merci de votre aide

Cordialement

phillip
 

Staple1600

XLDnaute Barbatruc
Bonjour à tous

On peut aussi faire ainsi (si il s'agit de nommer une plage de cellules)
Code:
Sub sousprogramme()
'definit une zone en fonction de bornes (2 cellules)
Range([debcellLM], [debcellepicerie].Offset(-1, 2)).Name = "zoneLM"
End Sub
NB: test OK sur mon PC
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Votre variable ZoneLM est elle bien globale au moins ?
(c'est à dire déclarée dans une instruction Private ou Public en tête du module, juste après la Option Explicit)
Remarque: Si elle n'est déclarée nulle part, elle n'est que locale, c'est à dire qu'elle n'a que la version propre à chaque procédure qui l'utilise, indépendante des autres, et n'est plus conservée en dehors de son exécution.
 

Phillip

XLDnaute Occasionnel
Bonjour,

merci à tous de vous pencher sur mon problème. Je prépare un petit fichier avec l'ensemble de mon code, car je comprends que des bouts de questions sans tout voir est compliqué à aider. En attendant, ce que je cherche en gros c'est attribuer un nom dans une feuille et pas dans un classeur (et dans ce cas on peut avoir le même nom pour plusieurs feuilles). Ca marche en enregistrement macro, mais je n'arrive pas à le retranscsrire dans mon code...
VB:
ActiveWorkbook.Worksheets("janvier").Names.Add Name:="toto", RefersToR1C1:= _
        "=janvier!R2C2:R6C2" ' ça ça marche sur un fichier test, en sélectionnant la zone'

ActiveWorkbook.Worksheets.Names.Add Name:="SBalise1", RefersTo:=Range(debcellbalise1, _
debcellbalise2.Offset(-2, 0)) 'zone jaune

'ça ça ne marche pas quand je déclare ma range comme ça'

J'ai un problème de syntaxe visiblement...

merci

Cordialement
 

Phillip

XLDnaute Occasionnel
Dranreb,

Je ne comprends pas la remarque

VB:
ActiveWorkbook.Worksheets("janvier").Names.Add Name:="SBalise1", RefersTo:=????

'J'ai besoin de savoir la syntaxe de ce que je mets APRES refers To, sachant que c'est un range, defini par une cellule debut et une cellule fin, respectivement debcellbalise1 et debcellbalise2.Offset(-2, 0)

Je rajoute un fichier et une copie d'écran. Dans cet exemple, des feuilles toto et tata qui ont une zone jaune, je voudrais définir cette zone jaune en disant à excel que la cellule début de la range jaune est "début" et la cellule de fin est "fin"

Captureexcel.PNG


merci

Cordialement
 

Pièces jointes

  • exemple.xlsm
    19.4 KB · Affichages: 1
Dernière édition:

Dranreb

XLDnaute Barbatruc
Dans une une référence de plage il faut ":" entre début et fin, pas ",".
C'est la méthode Range qui autorise deux expressions Range en arguments tel que Range(Feuil1.[debut], Feuil1.[fin])
Le RefersTo du Add d'une collection Names supporte soit une référence en String soit un Range.
 
Dernière édition:

Phillip

XLDnaute Occasionnel
Merci encore Dranreb,

je n'ai plus d'erreur de syntaxe avec
VB:
Sub coule()

' coule Macro

ActiveWorkbook.Worksheets("toto").Names.Add Name:="jaunate", RefersTo:= _
        Range([debut], [fin])
        
        
ActiveWorkbook.Worksheets("tata").Names.Add Name:="jaunate", RefersTo:= _
        Range([debut], [fin])
        
End Sub

mais ça ne résoud pas mon problème d'avoir le nom jaunate défini dans la feuille toto ET dans la feuille tata, ce qui apparemment est possible, puisque en enregistrement automatique cela marche (puisque j'ai bien début et fin défini sur les 2 feuilles). Sur la copie d'écran, on voit bien que jaunate est défini 2 fois sur toto et pas sur tata...

Ca m'éneeeeerve ! Merci en tous cas !
Captureexcel.PNG
 

Dranreb

XLDnaute Barbatruc
Oui, dans un module standard il applique toujours à la feuille active un Evaluate si on ne précise pas d'expression Worksheet comme dans Range(Feuil2.[debut], Feuil2.[fin]).
Ceci devrait être correct :
VB:
Dim Wsh As Worksheet
Set Wsh = ActiveWorkbook.Worksheets("tata")
Wsh.Names.Add Name:="jaunate", RefersTo:=Wsh.Range(Wsh.[debut], Wsh.[fin])
Mais ça ne prendrait pas comme référence "=tata!debut:tata!fin" mais "=tata:$E$1:$H$6"
 
Dernière édition:

Phillip

XLDnaute Occasionnel
Ben, j'ai une erreur sur la deuxième instruction....

VB:
Sub coule()



'
' coule Macro

ActiveWorkbook.Worksheets("toto").Names.Add Name:="jaunate", RefersTo:= _
        Sheets("toto").Range([debut], [fin])
        
        
ActiveWorkbook.Worksheets("tata").Names.Add Name:="jaunate", RefersTo:= _
        Sheets("tata").Range([debut], [fin])
        
'
'
    
End Sub
 

Dranreb

XLDnaute Barbatruc
Mais bon sang, je vous ai expliqué que si la feuille active n'est pas la "tata" alors vous ne pouvez pas définir un Range Sheets("tata").Range(ActiveSheet.[debut], ActiveSheet.[fin])
C'est en effectivement toujours ActiveSheet si vous ne spécifiez rien devant les méthode Range, Cells ou Evaluate parce que c'est ce qu'assument ces méthodes de l'objet Application. Dans un module d'objet Worksheet par contre il utilise les méthodes de l'objet Worksheet.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
313 309
Messages
2 097 033
Membres
106 812
dernier inscrit
Excellou74