VBA - Reconnaissance d'une cellule

RussellD Messages postés 60 Statut Membre -  
RussellD Messages postés 60 Statut Membre -
Bonjour à tous,

j'ai un petit problème : j'ai nommé une de mes cellules (E14 en NombreParois). J'ai ensuite la macro suivante :

If Target.Address <> "$E$14" Then Exit Sub
If Not IsNumeric(Range("NombreParois").Value) Then
        MsgBox "La valeur n'est pas numérique", vbExclamation, "Erreur saisie"
        Target.Value = ""
        Target.Select
    End If


qui renvoie un message d'erreur si cette cellule est remplie avec autre chose qu'un nombre.

Avant que je renomme ma cellule, tout marchait bien. Le problème, c'est que quand je remplace "$E$14" par "NombreParois" dans la 1ere ligne, il ne reconnait pas la cellule...
Y'a t-il une autre notation à employer dans ce cas précis (car j'ai remplacé dans la suite du code E14 par NombreParois, et cela fonctionne).

Merci d'avance !

13 réponses

  1. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    salut,
    essaie avec : If Target.Address <> Range("NombreParois").address....
    0
  2. RussellD Messages postés 60 Statut Membre 7
     
    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?
    0
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Essai avec :

    If Target.Name <> "NombreParois" Then ...

    0
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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..
    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+

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. RussellD Messages postés 60 Statut Membre 7
     
    Merci pour vos réponses,

    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" Then 
    sans 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?
    0
  7. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    Salut,
    si peux peux, mets ton fichier ou un fichier exemple sur www.cjoint.com histoire qu'on jette un oeil....
    0
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Pour tester si ça provient du nom essaye en mettant l'adresse au lieu du nom..
    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)
    0
  9. RussellD Messages postés 60 Statut Membre 7
     
    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.

    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 !
    0
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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..
    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)
    0
  11. RussellD Messages postés 60 Statut Membre 7
     
    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... "?
    0
  12. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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....
    0
    1. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
       
      Re,
      juste une question, ton code il est bien dans la feuille "Déperditions" ????
      0
    2. RussellD Messages postés 60 Statut Membre 7
       
      Oui tout à fait
      0
    3. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
       
      Re,
      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....
      0
    4. RussellD Messages postés 60 Statut Membre 7
       
      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 ^^
      0
  13. RussellD Messages postés 60 Statut Membre 7
     
    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
    0
  14. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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....
    0
    1. RussellD Messages postés 60 Statut Membre 7
       
      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 :
      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
      0