Problème avec cellule nommée
Bonjour tout le monde,
petit problème en VBA : j'ai nommé la cellule E10 de ma feuille de calcul "NombreParois", et j'execute une macro par la suite qui vérifie que la valeur entrée dans cette cellule est numérique ou pas. Mais il y a un problème pour reconnaitre la cellule par son nom.. Voici le bout de code sous deux versions légérement différentes (seule la première ligne diffère).
If Target.Address = ("$E$10") Then
Dim nbLig As Variant
Dim lig As Long
Dim i As Long
Dim rep As Variant
If Not IsNumeric(Range("NombreParois").Value) Then
MsgBox "La valeur n'est pas numérique", vbExclamation, "Erreur saisie"
Target.Value = ""
Target.Select
End IfIf Target.Address = ("NombreParois") Then
Dim nbLig As Variant
Dim lig As Long
Dim i As Long
Dim rep As Variant
If Not IsNumeric(Range("NombreParois").Value) Then
MsgBox "La valeur n'est pas numérique", vbExclamation, "Erreur saisie"
Target.Value = ""
Target.Select
End IfLa 1ere version du code fonctionne, mais pas la deuxième... Le problème doit donc venir de la 1ere ligne. Quelqu'un sait-il comment faire appel à une cellule par son nom, et pas par son adresse?
Merci d'avance pour vos réponses.
Bonjour,
Essaie -->
If Target.Address = "$E$10" Then MsgBox "tata"Amicalement
Dan
Edit Dan :
Tu peux essayer ceci aussi :
If Not Intersect(Target, Range("Nombreparois")) Is Nothing Thenou
If Not Intersect(Target, Range("E10")) Is Nothing ThenDan
en enlevant les () et/ou les "" ?
edit : salut Nad-Dan
Bonjour, merci pour vos réponses
Nad-Dan : tes suggestions fonctionnent, mais mon problème est à la 1ere ligne. J'aimerai vraiment pouvoir nomer la cellule, et que la macro s'execute si la target.address = NomDeLACellule.address.
Explication : la cellule E10 est nommée "NombreParois", et par la suite on entre une valeur dans cette cellule et on vérifie si elle est bien numérique. Le souci, c'est qu'avant cela il peut y avoir insertion de lignes dans la feuille de calcul. E10 ne se trouve donc plus en E10... C'est pour cela que si ma macro est attachée à la cellule E10, cela ne fonctionnera plus dans ce cas. Alors qu'avec un nom, quelquesoit l'endroit ou la cellule est "balladée", le nom suit et la macro fonctionne.
J'espère avoir été clair...
jmd : j'ai essayé d'enlever () et/ou "", cela ne fonctionne pas..
Quelqu'un aurait-il une idée?
Re,
...J'aimerai vraiment pouvoir nomer la cellule...
Dans ta 1ere demande, tu dis que la cellule est nommée ...
Si tu prends ce que je t'ai donné lorsque j'ai édité mon message (1ere solution), cela devrait fonctionner.
Sinon mets ta macro complète ici ou mieux le fichier avec données non confidentielles.
A te relire
Dan
Re,
je me suis mal exprimé, ma cellule est déjà nommé. Mais malheuresment ton code ne marche pas (erreur Range)
Private Sub CommandButton1_Click()
Dim CaseTest As String
Target = Range("H5")
Select Case Target
Case "Local par local": Exit Sub
Case "Bâtiment":
Range("A14:D14").Select
With Selection
.MergeCells = True
.Font.Bold = True
.Borders.LineStyle = xlContinuous
.Value = "Nombre de parois extérieures :"
.HorizontalAlignment = xlCenter
End With
Range("E14").Select
With Selection
.Interior.ColorIndex = 27
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlCenter
End With
ActiveWorkbook.Names.Add Name:="NombreParois", RefersToR1C1:="=Déperditions!R14C5"
Private Sub Worksheet_Change(ByVal Target As Range)
Set ici = Application.Intersect(Target, Range("H5"))
If Not ici Is Nothing Then
Select Case Target
Case "Local par local": Range("H8:I9").Select
With Selection
.ClearContents
.Interior.ColorIndex = xlNone
.MergeCells = False
.Borders.LineStyle = xlNone
.Font.Italic = False
.Font.Bold = False
End With
Range("A14:N40").Select
With Selection
.Delete
End With
Case "Bâtiment": Range("H8:I8").Select
With Selection
.MergeCells = True
.Value = "Température intérieure °C"
.Font.Bold = True
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlCenter
End With
Range("H9:I9").Select
With Selection
.MergeCells = True
.Interior.ColorIndex = 27
.Borders.LineStyle = xlContinuous
End With
End Select
End If
If Target.Address = Range("NombreParois").Address Then (((PROBLEME)))
Dim nbLig As Variant
Dim lig As Long
Dim i As Long
Dim rep As Variant
Dim TotalPositif As Variant
If Not IsNumeric(Range("Nombreparois").Value) Then
MsgBox "La valeur n'est pas numérique", vbExclamation, "Erreur saisie"
Target.Value = ""
Target.Select
End If
End SubVoila ma macro entière. J'ai marqué la ligne d'ou vient le problème (je rapelle que si je met $E$10 sur cette ligne, cela fonctionne tres bien)
Si cela peut t'aider, merci d'avance
Re,
Premier problème, tes variables ne sont pas définies...
Dans le premier code, tu utilises TARGET comme variable. Ce que tu ne peux jamais faire.
Ton code corrigé est celui ci-dessous :
Private Sub CommandButton1_Click()
Select Case Range("H5")
Case "Local par local": Exit Sub
Case "Bâtiment"
With Range("A14:D14")
.MergeCells = True
.Font.Bold = True
.Borders.LineStyle = xlContinuous
.Value = "Nombre de parois extérieures :"
.HorizontalAlignment = xlCenter
End With
With Range("E14")
.Interior.ColorIndex = 27
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlCenter
End With
End select
ActiveWorkbook.Names.Add Name:="NombreParois", RefersToR1C1:="=Déperditions!R14C5"
End SubA noter que :
- L'instruction "Dim CaseTest As String" ne sert à rien.
- Le nom "Nombreparois" dans ton code fait référence à la cellule E14 de la feuille "Déperditions". Est-ce bien correct car tu parles de la cellule E10 ailleurs ?
- A chaque fois tu fais un controle sur les valeurs dans H5. Est-ce correct ?
Merci de tes réponses avant que je ne te donne le deuxième code
Dan
Re,
oui il s'agit de la cellule E14, autant pour moi je m'étais trompé précedemment
je corrige mon code comme tu me l'as donné, et je vais faire attention à mes définitions de variables
Merci
re,
Sur le 2eme code, tu testes sur deux TARGET possible ??
Le premier avec H5 et le second sur E14 ??
J'ai un peu du mal à suivre ce que tu veux faire... dans ce code
A te relire
Dan
Hmmm oui en fait je fais un premier test sur H5, suite auquel vont apparaitre des lignes ou pas. Je fais ensuite la même chose sur E14, dans le même but.
Faut-il un EndSub apres le 1er test, et refaire une autre sub pour l'autre. Le problème c'est que je crois que l'on ne peut pas avoir deux Private Sub Worksheet_Change(ByVal Target As Range)...
Le souci doit venir de là en effet, mais je ne vois pas trop comment le résoudre..
re,
Le problème c'est que je crois que l'on ne peut pas avoir deux Private Sub Worksheet_Change(ByVal Target As Range)...
Effectivement.
Essaie en remplaçant tous les codes par ces deux-ci
Public Ok As Boolean
Private Sub CommandButton1_Click()
Select Case Range("H5")
Case "Local par local": Exit Sub
Case "Bâtiment"
With Range("A14:D14")
.MergeCells = True
.Font.Bold = True
.Borders.LineStyle = xlContinuous
.Value = "Nombre de parois extérieures :"
.HorizontalAlignment = xlCenter
End With
With Range("E14")
.Interior.ColorIndex = 27
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlCenter
End With
End Select
ActiveWorkbook.Names.Add Name:="NombreParois", RefersToR1C1:="=Déperditions!R14C5"
End SubPrivate Sub Worksheet_Change(ByVal Target As Range)
Dim ici As Range
If Ok = True Then Exit Sub
Set ici = Application.Intersect(Target, Range("H5"))
If Not ici Is Nothing Then
Ok = True
Select Case Target
Case "Local par local"
With Range("H8:I9")
.ClearContents
.Interior.ColorIndex = xlNone
.MergeCells = False
.Borders.LineStyle = xlNone
.Font.Italic = False
.Font.Bold = False
End With
Range("A14:N40").Delete
Case "Bâtiment"
With Range("H8:I8")
.MergeCells = True
.Value = "Température intérieure °C"
.Font.Bold = True
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlCenter
End With
With Range("H9:I9")
.MergeCells = True
.Interior.ColorIndex = 27
.Borders.LineStyle = xlContinuous
End With
End Select
End If
If Not Intersect(Target, Range("NombreParois")) Is Nothing Then
If Not IsNumeric(Target) Then
MsgBox "La valeur n'est pas numérique", vbExclamation, "Erreur saisie"
Target.Value = ""
Target.Select
End If
End If
Ok = False
End SubLa macro Private sub command agit sur le clique de ton bouton
La macro Private sub change agit sur le changement de valeur dans la cellule H5 ou E14.
Dan
Bonjour Dan, et merci pour ta réponse
J'ai remplacé mon code avec les tiens, mais je me confronte toujours au même problème, à savoir qu'il y a une erreur au niveau de :
If Not Intersect(Target, Range("NombreParois")) Is Nothing Thenil me sort encore une fois l'erreur "Erreur d'execution 1OO4 ; la méthode "Range" de l'objet "_Worksheet" a échoué"
J'ai essayé sur une autre feuille de calcul de copier coller uniquement les deux derniers bout de code que tu m'a donné, résultat même erreur au même endroit...
Cela commence à devenir désepserant car j'ai l'impression qu'il n y a que chez moi que cela ne marche pas..
Je suis reparti pour une journée de recherche...
Merci beaucoup pour ta réponse en tout cas, et si tu me confirmes que cela fonctionne chez toi il va falloir que je revois mon code en entier, voir que le rééecrives peut-etre..
A bientot
-- 07 Avr 2010, 14:01 --
Je relance le sujet car je crois savoir d'ou vient le problème : il s'agit du moment ou je supprime tout
Case "Local par local"
With Range("H8:I9")
.ClearContents
.Interior.ColorIndex = xlNone
.MergeCells = False
.Borders.LineStyle = xlNone
.Font.Italic = False
.Font.Bold = False
End With
Range("A14:N40").DeleteA ce moment la les noms des cellules sont supprimés, d'ou problème dans la macro. J'ai essayé donc directement apres ce bout de code de nommer mes cellules, de façon à ce qu'elles soient renommé aussitot effacées. Mais ca ne fonctionne pas. Si quelqu'un a une idée sur cette piste je suis preneur ^^
Merci d'avance, bonne journée
re,
Bon j'avais vu ce pb mais sans voir ton fichier ce n'est pas simple. On l'a déjà dit sur ce forum à plusieurs reprises... mais bon on ne peut pas non plus exiger.
Ton souci vient du fait que dans cette instruction --> Range("A14:N40").Delete, tu supprimes le nom que tu as donné et que plus loin tu veux réutiliser ce nom dans l'instruction qui buggue. Cela se passera à chaque fois que tu sélectionneras H5 et que la valeur sera "Local par Local".
Solution à tester ... après le Range("A14:N40").Delete, tu remets cette instruction -->
ActiveWorkbook.Names.Add Name:="NombreParois", RefersToR1C1:="=Déperditions!R14C5"Sinon donne moi ton fichier avec données non confidentielles, que je comprenne ce que tu veux faire car là je fonctionne un peu à tatillon dans un tunnel partiellement éclairé.
A te relire
Amicalement
Dan