XL 2019 Vérification de l'utilisation d'un menu

Sheldor

XLDnaute Occasionnel
Bonjour à tous,
j'ai besoin de vérifier si des cellules contiennent bien les éléments "autorisés" par la validation via une liste car un copier coller peut passer par dessus cette contrainte de saisie.

J'étais parti sur quelque chose sous la forme Cells(aa, bb).Validation.Value en true ou false mais j'ai eu des cas où certains éléments n'étaient pas détectés sans que j'arrive à m'expliquer pourquoi.
En plus ça ne détecte pas (d'après mes tests en tout cas) une différence de casse.

je souhaiterais donc changer de méthode et charger les cellules dans un array ou un dico pour que ça me sorte rapidement le résultat (j'ai 500 colonnes concernées et une centaine de listes) mais, débutant, je n'ai pas réussi à adapter des codes pour y arriver....

merci d'avance pour votre aide ;)
 

Pièces jointes

  • question_excel_verif_menu.xlsx
    11.7 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Sheldor,
Une possibilité :
1- Appeler dans ma_liste la plage de données : Liste.
2- Dans Mes_données mettre une MFC en I3 avec :
VB:
=ET($I3<>"";NB.SI(Liste;$I3)=0)
et s'applique à =$I$3:$I$28
 

Pièces jointes

  • question_excel_verif_menu.xlsx
    11.8 KB · Affichages: 2

Sheldor

XLDnaute Occasionnel
Bonjour Sylvanu,
merci beaucoup pour cette réponse, je ne savais pas qu'on pouvait appeler la liste dans une mefc, super intéressant et ça me servira pour d'autres choses.

Pour mon "problème" je voudrais le faire par VBA pour que ça me sorte la réponse dans une feuille "résultat" car je peux avoir des colonnes avec des milliers de lignes de remplies, désolé j'aurais dû être plus précis

merci encore
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Sorry, pas vu pour le VBA.
Un essai en PJ, la macro s'exécute automatiquement lorsqu'on sélectionne la feuille "résultat", avec :
VB:
Sub Worksheet_Activate()
    Dim L%, i%, T
    Application.ScreenUpdating = False
    With Sheets("mes_donnees")
        T = .Range("I1:I" & .[I50000].End(xlUp).Row)
    End With
    [G3:H1000].ClearContents: L = 3
    For i = 3 To UBound(T)
        If Application.CountIf([Liste], T(i, 1)) = 0 And T(i, 1) <> "" Then
            Cells(L, "G") = i
            Cells(L, "H") = T(i, 1)
            L = L + 1
        End If
    Next i
End Sub
 

Pièces jointes

  • question_excel_verif_menu (1).xlsm
    18.7 KB · Affichages: 4

Sheldor

XLDnaute Occasionnel
Bonjour, suite...
j'adapte ce code pour le faire tourner dans une boucle, le nom de ma liste change et j'aimerais remplacer [Liste] par une variable nom_menu mais si j'enlève les crochets ça ne fonctionne plus.. je ne trouve pas la bonne syntaxe

merci
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
mais si j'enlève les crochets ça ne fonctionne plus
Normal, "Liste" est une variable VBA, [Liste] est le nom d'une plage dans la feuille.
Si votre liste est modifiable, et pour être tranquille faites Set Liste = Sheets("ma_liste").[H2:H1000] :
VB:
Sub Worksheet_Activate()
    Dim L%, i%, T
    Application.ScreenUpdating = False
    With Sheets("mes_donnees")
        T = .Range("I1:I" & .[I50000].End(xlUp).Row)
    End With
    [G3:H1000].ClearContents: L = 3
    Set Liste = Sheets("ma_liste").[H2:H1000]
    For i = 3 To UBound(T)
        If Application.CountIf(Liste, T(i, 1)) = 0 And T(i, 1) <> "" Then
            Cells(L, "G") = i
            Cells(L, "H") = T(i, 1)
            L = L + 1
        End If
    Next i
End Sub
 

Pièces jointes

  • question_excel_verif_menu (V2).xlsm
    18.9 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
le code dans la feuille resultat ne se déclenche plus quand on sélectionne cette feuille
Regardez dans toutes vos macros si vous n'avez pas un "Application.EnableEvents = False"
Il arrive qu'en bricolant on interrompe une macro, que ce flag soit False et qu'il n'est par repassé à True à cause de l'arrêt. Dans ce cas aucune macro événementielle ne peut être déclenchée.
récupérer le nom de la liste sur la première cellule
Si vous utilisez ajuster automatiquement la Liste à la plage, vous pouvez faire :
VB:
    With Sheets("ma_liste")
        DL = .[H10000].End(xlUp).Row
        .Names("Liste").RefersToR1C1 = "=ma_liste!R2C8:R" & DL & "C8"
    End With
Quand à récupérer le nom de la liste dans une cellule, dans ce cas elle s'appellerait toujours Liste.
 

Sheldor

XLDnaute Occasionnel
rebonjour,
je suis resté coincé sur :

With Sheets("ma_liste")
DL = .[H10000].End(xlUp).Row
.Names("Liste").RefersToR1C1 = "=ma_liste!R2C8:R" & DL & "C8"
End With

erreur définie par l'application ou par l'objet

j'ai réussi à m'en sortir avec quelque chose de la forme Set liste = Range(Cells(11, COL), Cells(r33, COL))
qui me permet de jouer facilement sur l'emplacement de ma liste

après être resté bloqué longtemps sur :
Set liste = sheets("ma_liste").Range(Cells(11, COL), Cells(r33, COL))
il faut que je sois dans la feuille ma_liste, lui demander de définir ma liste à "distance" ne lui plait pas...

merci beaucoup Sylvanu pour votre aide !
 

Statistiques des forums

Discussions
315 083
Messages
2 116 041
Membres
112 641
dernier inscrit
chab77