Petite traduction en VBA...

Résolu
Anthelm Messages postés 202 Statut Membre -  
Anthelm Messages postés 202 Statut Membre -
Bonjour, à tous!

J'aimerais expliquer à Excel la chose suivante, mais il ne me comprend pas...

"Si dans la plage G2:R2 une donnée est saisie, et qu'elle est déjà présente dans G2:R2, renvoyer un message d'erreur"
Pourriez vous me le traduire svp? :)

Ce sont des entêtes d'un tableau et le fait qu'elle se renomme avec un indice "2" quand on saisi un doublon, ça me pose problème.

Il s'agit de listes déroulantes, donc impossible de passer par la validation de données, qui est déjà utilisée pour ça.

Merci!

Configuration: Windows / Firefox 63.0

3 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonsoir,
    'déclenche la macro quand une valeur de la feuille change
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim Rng As Range
        Set Rng = ActiveSheet.Range("G2:R2")
        'Vérifie si dans la plage choisie
        If Not Application.Intersect(Target, Rng) Is Nothing Then
            'verifie si la valeur existe déjà dans la plage
            ValueToSearchFor = Target.Value 'récupère la valeur saisie
            If Application.CountIf(Rng, ValueToSearchFor) > 1 Then
                MsgBox "La valeur " & ValueToSearchFor & " existe déjà"
            End If
        End If
    End Sub
    

    1
    1. Anthelm Messages postés 202 Statut Membre 1
       
      J'ai l'impression que ça ne marche pas... Peut être une interaction avec une autre macro? sur la feuille ça donne ça:


      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

      If Not Intersect(Target, Range("A3:AN502")) Is Nothing Then

      Range("S1").Value = Target.Row

      End If


      End Sub

      'déclenche la macro quand une valeur de la feuille change
      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim Rng As Range
      Set Rng = ActiveSheet.Range("G2:R2")
      'Vérifie si dans la plage choisie
      If Not Application.Intersect(Target, Rng) Is Nothing Then
      'verifie si la valeur existe déjà dans la plage
      ValueToSearchFor = Target.Value 'récupère la valeur saisie
      If Application.CountIf(Rng, ValueToSearchFor) > 1 Then
      MsgBox "La valeur " & ValueToSearchFor & " existe déjà"
      End If
      End If
      End Sub


      Et j'ai bien une ligne entre les deux. ça devrait marcher, non?
      0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    une proposition qui t'affiche la liste épurée des items déjà présents.
    Créer une listbox sous la ligne de titres et :
    Private Sub ListBox1_Click()
        ActiveCell.Value = ListBox1.Text
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim c      As Range
        If Not Intersect(Target, [A2:E2]) Is Nothing Then
            With ListBox1
                .Left = Target.Left
                .Clear
                .AddItem
                For Each c In [liste]
                    If Application.CountIf([A2:E2], c.Value) = 0 Then .AddItem c.Value
                Next c
                .Visible = True
            End With
        Else
            ListBox1.Visible = False
        End If
    End Sub

    https://www.cjoint.com/c/HKvjPHqC6ZU
    eric
    1
    1. Anthelm Messages postés 202 Statut Membre 1
       
      Bonjour eric, désolé d'avoir mis autant de temps à répondre. J'ai bien noté ta solution et j'essaye d'approfondir cette histoire de listbox. Merci du conseil en tout cas, c'est peut être ça la solution en effet.

      Je me fait quelques tutos concernant les listbox et j'essayerais :)

      Merci beaucoup
      0
  3. Anthelm Messages postés 202 Statut Membre 1
     
    Non effectivement ça marche mais dans la mesure ou c'est un tableau, l'entête prend un indice 2 avant le déclenchement de la macro :'(

    Le message d'erreur n’empêche pas la saisie mais ça c'est moi qui n'en avait pas parlé...!
    0