Problème alimentation liste déroulante.

Victor21

XLDnaute Barbatruc
Bonjour à tous.

Je rencontre un problème avec la macro permettant d'ajouter des items à ma liste déroulante.
Le code :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 And Target.Count = 1 Then
        If Target <> "" Then
            If IsError(Application.Match(Target.Value, [Lieudit], 0)) Then
                If MsgBox("Nouveau lieu-dit?", vbYesNo) = vbYes Then
                    [Lieudit].End(xlDown).Offset(1, 0) = Target.Value
                    LambertX
                    LambertY
                    Sheets("BASE").[Lieudit2].Sort key1:=Sheets("BASE").Range("A2")
                Else
                    Application.Undo
                End If
            End If
        End If
    End If
End Sub
'-----------
Sub LambertX()
    Dim Lx As String
    Do Until Lx >= [MinX] And Lx <= [MaxX]
        Lx = InputBox("Entre " & Format([MinX], "##,##0") & " et " & Format([MaxX], "##,##0"), "Coordonnées Lambert X")
    Loop
    [Lieudit].End(xlDown).Offset(0, 1) = Lx
End Sub
'-----------
Sub LambertY()
    Dim Ly As String
    Do Until Ly >= [MinY] And Ly <= [MaxY]
        Ly = InputBox("Entre " & Format([MinY], "##,##0") & " et " & Format([MaxY], "##,##0"), "Coordonnées Lambert Y")
    Loop
    [Lieudit].End(xlDown).Offset(0, 2) = Ly
End Sub

Ce qui coince :
Lorsque je rentre dans la feuille "saisie" les infos correspondant à un nouvel item, la cellule de la 2° colonne (valeur "X") de cette nouvelle entrée reste entourée, comme sélectionnée, même lorsque je sélectionne une autre cellule.
Pas de plantage cependant, donc VBA ne me signale rien...

Ce classeur a planté Excel plusieurs fois, et j'ai dû recopier l'ensemble (feuilles et code) dans un nouveau classeur pour pouvoir l'enregistrer sans plantage.


Si l'un d'entre vous pouvait me conseiller, ce serait bien sympa, car je ne comprends pas où ça coince.
 

Pièces jointes

  • test_AjoutListe.xls
    20 KB · Affichages: 55

Modeste

XLDnaute Barbatruc
Re : Problème alimentation liste déroulante.

Bonsoir Patrick,

Pas réussi à reproduire le problème de "contour persistant" sous Excel 2000.
Par contre, certaines valeurs sont admises, même si elles ne sont pas comprises dans les "fourchettes". Si tu déclares Lx As String, que tu lui affectes ensuite la valeur de ton InputBox, ça reste du texte dans les 2 situations et dans la boucle tu demandes à Excel de comparer la valeur à tes Min et tes Max ... qui sont des données numériques.
Il conviendrait sans doute de convertir les Lx et Ly en faisant (par exemple):
Code:
clng(Lx) >= [MinX] And clng(Lx) <= [MaxX]
... et en les déclarant en Long (par exemple aussi).
Cette manip permettra donc de vérifier au passage que les données sont bien numériques ... mais il faudra prévoir la gestion des erreurs en cas d'encodage non valide.

Pas d'idée hélas pour le reste :(
 

Victor21

XLDnaute Barbatruc
Re : Problème alimentation liste déroulante.

Bonsoir, Modeste.

Merci pour ta réponse.

Tu dis ne pas pouvoir reproduire le pb... Climat local ???
J'avais pourtant pris soin de recréer un fichier, pour le cas où le premier aurait un pb...

PS : Merci pour la déclaration des variables qui ne m'avait pas sauté aux yeux.:eek:
 

Fo_rum

XLDnaute Accro
Re : Problème alimentation liste déroulante.

Bonsoir,

pour le premier problème :

avec Application Undo tu as Target="" donc la procédure se relance et avec mon 2010 : plantage immédiat !

Une autre façon de programmer :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Est As Range
    'pour éviter un tas de If...
    If Target.Column <> 2 Or Target.Count > 1 Then Exit Sub
    If Target = "" Then Exit Sub ' pas d'appel intempestif !
    Set Est = [Lieudit].Find(Target)
    If Est Is Nothing Then
        If MsgBox("enregistrer ce nouveau lieu-dit ?", vbYesNo, "Voulez-vous") = vbYes Then
            [Lieudit].End(xlDown).Offset(1, 0) = Target.Value
            LambertX
            LambertY
            Sheets("BASE").[Lieudit2].Sort key1:=Sheets("BASE").Range("A2")
        Else
            Target = "" 'ou Application.Undo
        End If
    End If
End Sub
 

Softmama

XLDnaute Accro
Re : Problème alimentation liste déroulante.

Bonsoir Victor21 et Modeste,

Je ne constate aucun bug non plus de mon côté : pas de cellule restant sélectionnée (sous Excel 2003). Je pense aussi que le problème est 'local', ou du aux options d'Excel (calcul automatique... ?), ou à des conflits matériels (carte graphique, barrette mémoire...). Est-ce le seul cas où tu as constaté un dysfonctionnement sous Excel ?

[EDIT: Fo_rum a vu juste je pense, je viens d'y songer en postant]
 

Modeste

XLDnaute Barbatruc
Re : Problème alimentation liste déroulante.

Bonsoir ou re-bonsoir,

avec Application Undo tu as Target="" donc la procédure se relance et avec mon 2010 : plantage immédiat !
J'avais testé, sans trop me poser de questions et je confirme que ça passe sans souci en XL2000, mais au-delà de ce simple constat, la procédure se relance, j'en conviens ... mais elle s'arrête bien vite, puisqu'il y avait un
Code:
If Target <> "" Then
dans le code de Patrick. Il y aurait donc un comportement différent à ce niveau sous XL 2000 et 2010 :confused:
 

Victor21

XLDnaute Barbatruc
Re : Problème alimentation liste déroulante.

Bonsoir, Fo_rum, Softmania. Re, Modeste.

clng() permet en effet de ne pas saisir des coordonnées de type 583ààà.
Je vais donc boucler avec :
Code:
Do Until Lx >= [MinX] And Lx <= [MaxX] And IsNumeric(Lx)

Pour ce qui est du pb initial, je testerai sur une autre machine.

En tous cas, merci à vous trois pour vos conseils.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 949
Membres
101 851
dernier inscrit
vaiata