VBA - Reconnaissance d'une cellule
Fermé
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
-
1 avril 2010 à 16:09
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 - 7 avril 2010 à 15:04
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 - 7 avril 2010 à 15:04
A voir également:
- VBA - Reconnaissance d'une cellule
- Aller à la ligne dans une cellule excel - Guide
- Excel compter cellule couleur sans vba - Guide
- Excel cellule couleur si condition texte - Guide
- Reconnaissance musique en ligne sans télécharger - Guide
- Verrouiller cellule excel - Guide
13 réponses
tompols
Messages postés
1273
Date d'inscription
jeudi 29 juillet 2004
Statut
Contributeur
Dernière intervention
25 novembre 2013
435
1 avril 2010 à 16:14
1 avril 2010 à 16:14
salut,
essaie avec : If Target.Address <> Range("NombreParois").address....
essaie avec : If Target.Address <> Range("NombreParois").address....
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
1 avril 2010 à 17:22
1 avril 2010 à 17:22
Merci de ta réponse, mais cela ne fonctionne pas..
qu'est ce qu tu veux dire par ... apres adress , il y a d'autres commandes à ecrire ensuite?
J'avais déjà essayé avec Range("NombreParois"), sans succès...
Quelqu'un a une idée?
qu'est ce qu tu veux dire par ... apres adress , il y a d'autres commandes à ecrire ensuite?
J'avais déjà essayé avec Range("NombreParois"), sans succès...
Quelqu'un a une idée?
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
1 avril 2010 à 18:00
1 avril 2010 à 18:00
Essai avec :
If Target.Name <> "NombreParois" Then ...
If Target.Name <> "NombreParois" Then ...
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 190
1 avril 2010 à 19:45
1 avril 2010 à 19:45
Bonjour,
Il n'y a pas d'erreur dans ton code (j'ai tester), probablement un autre événement de feuille qui est appelé.
Mais contrôle quand même que tu n'a pas une faute d'ortographe dans le nom de ta cellule.
Si non, essaye avec..
Si ça passe faudra chercher où se situe le problème.
A+
Il n'y a pas d'erreur dans ton code (j'ai tester), probablement un autre événement de feuille qui est appelé.
Mais contrôle quand même que tu n'a pas une faute d'ortographe dans le nom de ta cellule.
Si non, essaye avec..
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("NombreParois").Address Then If Not IsNumeric(Range("NombreParois")) Then MsgBox "La valeur n'est pas numérique", vbExclamation, "Erreur saisie" Application.EnableEvents = False Target.Value = "" Target.Select Application.EnableEvents = True End If End If End Sub
Si ça passe faudra chercher où se situe le problème.
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
2 avril 2010 à 13:07
2 avril 2010 à 13:07
Merci pour vos réponses,
malheuresement je n'arrive toujours pas à résoudre mon problème. J'ai essayé de mettre
comme tu me la suggéré lermite222, mais une fois executé j'ai l'erreur suivante qui s'affiche : la méthode "Range" de l'objet "Worksheet" a échoué
J'ai aussi essayé
J'ai vérifié, aucune faute d'orthographe dans le nom de la cellule.
Je ne comprend vraiment pas, le code reconnait le nom de ma cellule dans le prgogramme, SAUF dans cette première ligne...
Je n'ai pourtant pas d'autre évenement lié à cette cellule...
Quelqu'un a-t-il une autre idée?
malheuresement je n'arrive toujours pas à résoudre mon problème. J'ai essayé de mettre
If Target.Address = Range("NombreParois").Address Then
comme tu me la suggéré lermite222, mais une fois executé j'ai l'erreur suivante qui s'affiche : la méthode "Range" de l'objet "Worksheet" a échoué
J'ai aussi essayé
If Target.Name <> "NombreParois" Thensans succès...
J'ai vérifié, aucune faute d'orthographe dans le nom de la cellule.
Je ne comprend vraiment pas, le code reconnait le nom de ma cellule dans le prgogramme, SAUF dans cette première ligne...
Je n'ai pourtant pas d'autre évenement lié à cette cellule...
Quelqu'un a-t-il une autre idée?
tompols
Messages postés
1273
Date d'inscription
jeudi 29 juillet 2004
Statut
Contributeur
Dernière intervention
25 novembre 2013
435
2 avril 2010 à 14:30
2 avril 2010 à 14:30
Salut,
si peux peux, mets ton fichier ou un fichier exemple sur www.cjoint.com histoire qu'on jette un oeil....
si peux peux, mets ton fichier ou un fichier exemple sur www.cjoint.com histoire qu'on jette un oeil....
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 190
Modifié par lermite222 le 2/04/2010 à 16:35
Modifié par lermite222 le 2/04/2010 à 16:35
Pour tester si ça provient du nom essaye en mettant l'adresse au lieu du nom..
par exemple...
Et voir si ça passe.
Edit: voir aussi le format de la cellule, voir que ce n'est pas du texte ou une date ou...
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
par exemple...
If Not IsNumeric(Range("E14").Value) Then
Et voir si ça passe.
Edit: voir aussi le format de la cellule, voir que ce n'est pas du texte ou une date ou...
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
2 avril 2010 à 17:08
2 avril 2010 à 17:08
Le voici. Pour résumé, un select case. Si "effacer", ça efface tout (logique). Si "créer", création d'une ligne et d'une cellule (que l'on nomme "NombreParois"). Ensuite une Box pour vérifier que cette cellule est bien remplie par un chiffre.
Merci d'avance !
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 "Effacer": Range("A14:N40").Select With Selection .ClearContents .Interior.ColorIndex = xlNone .MergeCells = False .Borders.LineStyle = xlNone .Font.Italic = False .Font.Bold = False End With Case "Créer" 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:="=Feuil1!R14C5" If Target.Address = "$E$14" Then ? PROBLEME 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 If
Merci d'avance !
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 190
Modifié par lermite222 le 2/04/2010 à 17:48
Modifié par lermite222 le 2/04/2010 à 17:48
Comprend pas..
D'abord tu teste si Target est sur H5, si oui tu supprime ou tu crée.. MAIS.. dans la condition <Crée> tu teste pour voir si Target est sur la cellule E14 ??
1°) c'est pas possible, puisqu'elle est sur H5
2°) comme c'est une création, cette cellule est vide (du moins je suppose).
3°) Pour voir si target est sur une tel cellule pas besoin de InterSexct..
suffit.
mon avis, il maque le elseIf.. et les end if, End select qui vont avec
Quel que chose comme ça.
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
D'abord tu teste si Target est sur H5, si oui tu supprime ou tu crée.. MAIS.. dans la condition <Crée> tu teste pour voir si Target est sur la cellule E14 ??
1°) c'est pas possible, puisqu'elle est sur H5
2°) comme c'est une création, cette cellule est vide (du moins je suppose).
3°) Pour voir si target est sur une tel cellule pas besoin de InterSexct..
If Target.Address = "$H$5"
suffit.
mon avis, il maque le elseIf.. et les end if, End select qui vont avec
If Target.Address = "$H$5" Then Select Case Target.Text Case "Effacer" '....... Case "Créer" '.... End Select ElseIf Target.Address = "$E$14" Then '..... End If
Quel que chose comme ça.
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
6 avril 2010 à 11:34
6 avril 2010 à 11:34
Re,
désolé mon code est mal recopié, mais les End IF et End Select nécessaires sont bien mis... le problème ne doit pas venir de là.
lermite222 : j'ai déjà essayé cela, et ça marche. Quand je met le nom de la cellule (NombreParois) cela fonctionne, sauf pour la ligne If Target.Address = "$E$14" Then Que veux tu dire par "voir aussi le format de la cellule, voir que ce n'est pas du texte ou une date ou... "?
désolé mon code est mal recopié, mais les End IF et End Select nécessaires sont bien mis... le problème ne doit pas venir de là.
lermite222 : j'ai déjà essayé cela, et ça marche. Quand je met le nom de la cellule (NombreParois) cela fonctionne, sauf pour la ligne If Target.Address = "$E$14" Then Que veux tu dire par "voir aussi le format de la cellule, voir que ce n'est pas du texte ou une date ou... "?
tompols
Messages postés
1273
Date d'inscription
jeudi 29 juillet 2004
Statut
Contributeur
Dernière intervention
25 novembre 2013
435
6 avril 2010 à 14:53
6 avril 2010 à 14:53
salut RussellD,
Bon jviens de tester ton code en mettant les bons end select et end if et en modifiant le test ainsi : If Target.Address = Range("NombreParois").Address Then"
Cela fonctionne très bien (comme je te l'ai déjà dit et lermite222 aussi) !
Maintenant à voir ton code il est clair qu'il y a plusieurs problèmes et je pense que l'erreur vient de ta procédure et non de "Target.Address = Range("NombreParois").Address"; tu dis que tu n'as pas mis ton code en intégralité alors peux-tu stp faire un simple copier/coller de ton code ou nous mettre à dispo un fichier ds lequel le problème se présente ? Il sera difficile de t'aider sans ça....
Bon jviens de tester ton code en mettant les bons end select et end if et en modifiant le test ainsi : If Target.Address = Range("NombreParois").Address Then"
Cela fonctionne très bien (comme je te l'ai déjà dit et lermite222 aussi) !
Maintenant à voir ton code il est clair qu'il y a plusieurs problèmes et je pense que l'erreur vient de ta procédure et non de "Target.Address = Range("NombreParois").Address"; tu dis que tu n'as pas mis ton code en intégralité alors peux-tu stp faire un simple copier/coller de ton code ou nous mettre à dispo un fichier ds lequel le problème se présente ? Il sera difficile de t'aider sans ça....
tompols
Messages postés
1273
Date d'inscription
jeudi 29 juillet 2004
Statut
Contributeur
Dernière intervention
25 novembre 2013
435
6 avril 2010 à 15:48
6 avril 2010 à 15:48
Re,
juste une question, ton code il est bien dans la feuille "Déperditions" ????
juste une question, ton code il est bien dans la feuille "Déperditions" ????
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
6 avril 2010 à 16:35
6 avril 2010 à 16:35
Oui tout à fait
tompols
Messages postés
1273
Date d'inscription
jeudi 29 juillet 2004
Statut
Contributeur
Dernière intervention
25 novembre 2013
435
Modifié par tompols le 7/04/2010 à 10:08
Modifié par tompols le 7/04/2010 à 10:08
Re,
dsl pour la réponse tardive, ton pb est ici :
tu supprimes la plage contenant la cellule E14 à laquelle tu as donné le nom "NombreParois".....d'où l'erreur ensuite sur Range("NombreParois").Address...
voilà essaie plutot de faire un selection.clearcontents ou de redéfinir le nom après ton delete....
dsl pour la réponse tardive, ton pb est ici :
Range("A14:N40").Select With Selection .Delete End With
tu supprimes la plage contenant la cellule E14 à laquelle tu as donné le nom "NombreParois".....d'où l'erreur ensuite sur Range("NombreParois").Address...
voilà essaie plutot de faire un selection.clearcontents ou de redéfinir le nom après ton delete....
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
7 avril 2010 à 10:50
7 avril 2010 à 10:50
Re,
Merci de ta réponse, mais je ne pense pas que se soit cela, j'ai essayé de le remplacer par un "ClearContents" mais cela ne change rien. De toute façon la cellule est censée etre renommée quand la macro arrive au Range("NombreParois").Address.
Je pense que le problème vient d'ailleurs, genre mauvaise utilisation des commandes Private Sub Worksheet_Change(ByVal Target As Range) par exemple...
Je ne sais pas, je continue de creuser ^^
Merci de ta réponse, mais je ne pense pas que se soit cela, j'ai essayé de le remplacer par un "ClearContents" mais cela ne change rien. De toute façon la cellule est censée etre renommée quand la macro arrive au Range("NombreParois").Address.
Je pense que le problème vient d'ailleurs, genre mauvaise utilisation des commandes Private Sub Worksheet_Change(ByVal Target As Range) par exemple...
Je ne sais pas, je continue de creuser ^^
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
Modifié par RussellD le 6/04/2010 à 15:27
Modifié par RussellD le 6/04/2010 à 15:27
Le voila. Il est un peu long,...
Private Sub CommandButton1_Click() Dim CaseTest As String Target = Range("H5") Select Case Target Case "Local par local": Exit Sub Case "Bâtiment": Range("J14:M14").Select With Selection .MergeCells = True .Font.Bold = True .Borders.LineStyle = xlContinuous .Value = "Déperditions totales par transmission" .HorizontalAlignment = xlCenter End With Range("N14").Select With Selection .Font.Bold = True .Borders.LineStyle = xlContinuous .HorizontalAlignment = xlCenter .Font.ColorIndex = 3 .Value = "=TOTAL1" End With ActiveWorkbook.Names.Add Name:="TOTAL", RefersToR1C1:="=Déperditions!R14C14" 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" Range("A17:D17").Select With Selection .MergeCells = True .Font.Bold = True .Borders.LineStyle = xlContinuous .Value = "Nombre de ponts thermiques :" .HorizontalAlignment = xlCenter End With Range("E17").Select With Selection .Interior.ColorIndex = 27 .Borders.LineStyle = xlContinuous .HorizontalAlignment = xlCenter End With ActiveWorkbook.Names.Add Name:="NombrePonts", RefersToR1C1:="=Déperditions!R17C5" Range("A20:D20").Select With Selection .MergeCells = True .Font.Bold = True .Borders.LineStyle = xlContinuous .Value = "Déperditions par le sol :" .HorizontalAlignment = xlCenter End With Range("E20").Select With Selection .Interior.ColorIndex = 27 .Borders.LineStyle = xlContinuous .HorizontalAlignment = xlCenter End With End Select End Sub Private Sub CommandButton2_Click() End Sub 'Range("H8:I8").MergeCells = True 'Range("H8:I8").Select 'With Selection '.Value = "Température intérieure" '.Interior.ColorIndex = 27 '.Font.Italic = True '.Font.Bold = True '.HorizontalAlignment = xlCenter 'End With 'Range("H9:I9").MergeCells = True 'End Sub 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 Not IsNumeric(Range("H9").Value) Then MsgBox "La valeur n'est pas numérique", vbExclamation, "Erreur saisie" Target.Value = "" Target.Select End If If Range("H9") = Empty Then ThisWorkbook.Worksheets("Déperditions").OLEObjects("CommandButton1").Visible = False Else: ThisWorkbook.Worksheets("Déperditions").OLEObjects("CommandButton1").Visible = True End If If Target.Address = Range("NombreParois").Address Then PROBLEMEDim 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 nbLig = Range("Nombreparois").Value nbLig = nbLig + 2 Range("Nombreparois").Font.Bold = True If nbLig = Null Or Not IsNumeric(nbLig) Then Exit Sub lig = ActiveCell.Row + 1 If nbLig = 2 Then Exit Sub Rows(lig & ":" & lig + (CLng(nbLig) - 1)).Select Selection.Insert Shift:=xlDown Selection.HorizontalAlignment = xlCenter Range("A" & lig).Value = "Type de paroi" Range("B" & lig).Value = "Type de matériau" Range("C" & lig).Value = "U (W/m².°C)" Range("D" & lig).Value = "T ext (°C)" Range("F" & lig).Value = "Hauteur (m)" Range("E" & lig).Value = "Longueur (m)" Range("G" & lig).Value = "Surface (m²)" Range("I" & lig).Value = "Déperditions (W)" Range("J" & lig).Value = "Pourcentage (%)" lig = lig + 1 For i = 1 To nbLig - 2 With Cells(lig, 1).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="Paroi extérieure, Paroi intérieure" End With With Cells(lig, 2).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="Liste des matériaux" End With Range("A" & lig).Interior.ColorIndex = 27 Range("B" & lig).Interior.ColorIndex = 27 'Range("D" & lig).Formula = "=ChoixParoi" ' Target = Range("A" & lig) 'Select Case Target 'Case "Paroi extérieure": ChoixParoi = Range("C8") 'Case "Paroi intérieure": ChoixParoi = "Déterminer" ' End Select Range("E" & lig).Interior.ColorIndex = 27 Range("F" & lig).Interior.ColorIndex = 27 Range("G" & lig).FormulaR1C1 = "=RC[-2]*RC[-1]" Range("I" & lig).FormulaR1C1 = "=RC[-6]*RC[-2]*(R9C8-RC[-5])" 'Range("J" & lig).FormulaR1C1 = "=(RC[-1])/TOTAL)*100" lig = lig + 1 Next Range("H" & lig).Value = "TOTAL" 'ActiveWorkbook.Names.Add Name:="TOTAL", RefersToR1C1:="=Feuil1!R18C9" Range("I" & lig).Name = "TOTAL1" Range("I" & lig).Select With Selection .FormulaR1C1 = "=SUM(R[-1]C:R[" & 2 - nbLig & "]C)" .Font.Bold = True .Font.ColorIndex = 3 End With End If End Sub
tompols
Messages postés
1273
Date d'inscription
jeudi 29 juillet 2004
Statut
Contributeur
Dernière intervention
25 novembre 2013
435
7 avril 2010 à 11:34
7 avril 2010 à 11:34
Re,
De toute façon la cellule est censée etre renommée quand la macro arrive au Range("NombreParois").Address. => euh j'ai pas bien compris ce que tu veux dire mais dans ton code Worksheet_Change tu ne redéfinis aucun nom donc pas possible......ensuite le nom est défini après click sur CommandButton1 seulement si H5 = "Bâtiment" (l'utilisation d'un "select case" est d'ailleurs inapropriée, un simple if Range("H5").value = "Batiment' suffit pour conditionner l'exécution de ton code).
Essaie ceci : execute ton codes jusqu'à obtenir l'erreur, click sur fin puis vérifie via le menu Insertion/Noms à quoi correspond NombreParois....
De toute façon la cellule est censée etre renommée quand la macro arrive au Range("NombreParois").Address. => euh j'ai pas bien compris ce que tu veux dire mais dans ton code Worksheet_Change tu ne redéfinis aucun nom donc pas possible......ensuite le nom est défini après click sur CommandButton1 seulement si H5 = "Bâtiment" (l'utilisation d'un "select case" est d'ailleurs inapropriée, un simple if Range("H5").value = "Batiment' suffit pour conditionner l'exécution de ton code).
Essaie ceci : execute ton codes jusqu'à obtenir l'erreur, click sur fin puis vérifie via le menu Insertion/Noms à quoi correspond NombreParois....
RussellD
Messages postés
57
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 septembre 2010
7
7 avril 2010 à 15:04
7 avril 2010 à 15:04
Oui tu as raison, c'est bien ça le problème. J'ai donc essayé de renommer mes cellules juste apres avoir tout effacé, genre :
Mais ca ne fonctionne toujours pas, je continue de chercher! Merci en tt cas pour l'indication
Range("A14:N40").Select With Selection .Delete End With ActiveWorkbook.Names.Add Name:="NombrePonts", RefersToR1C1:="=Déperditions!R17C5" ActiveWorkbook.Names.Add Name:="NombreParois", RefersToR1C1:="=Déperditions!R14C5"
Mais ca ne fonctionne toujours pas, je continue de chercher! Merci en tt cas pour l'indication