VBA : exécuter la validation de cellule

chris

XLDnaute Barbatruc
Bonjour

J'ai créé un code pour améliorer la gestion des tableaux dans le cas d'une protection de la feuille.

Le principe est de tester lors d'une saisie dans un onglet protégé, si la cellule concernée est juste sous un tableau, quel qu'il soit, et le cas échéant de mettre la valeur saisie de côté, déprotéger l'onglet puis remettre la valeur saisie, ce qui allonge bien le tableau, et de rétablir la protection.

Mon souci est que si une validation existe sur une ou n colonnes du tableau, elle ne s'exécute pas.

Je cherche donc un moyen de déclencher la validation sans avoir à analyser cas par cas ses restrictions et les recontrôler dans le code.
J'ai trouvé une solution qui ne me plait pas : sendkey F2 puis enter
Outre que je ne suis pas fan des senkey, cela ne marche que si on saisit dans une seule cellule mais en cas de saisie simultanée dans plusieurs cellules, ce sendkey déclenche l'impression au lieu de la validation.

Si les XLDiens VBistes pouvaient me donner une solution... Merci
 

chris

XLDnaute Barbatruc
Bonjour
Bise à toi PierreJean :)

Voilà ou j'en suis : les feuilles sont protégées avec le mot de passe toto
Seules les colonnes sans formules (bidons ici les formules !) sont non verrouillées.

Si on tape une ou n valeurs (saisie multiple) dans une cellule, le code cherche si on est sous un tableau et si oui intègre la ligne dans le tableau.
Mon souci est que la ou les valeurs saisies ne passent pas sous les fourches caudines de la validation (onglet UN colonne Titre1 doit être un entier inférieur ou égal à 25) que la bidouille avec sendkey ne marche que si target n'a bien qu'une cellule... :(

Je te passe donc bien volontiers le bébé :D
 

Pièces jointes

  • Tableaux_protection_Xld.xlsm
    36.5 KB · Affichages: 54

chris

XLDnaute Barbatruc
Re

Non a priori cela ne marche pas. Il ne se passe plus rien dans aucun cas...

Le but est d'allonger le tableau quand on saisit sur la ligne juste en dessous quelle que soit la colonne.

Mon code marche mais la saisie n'est pas vérifiée par la validation : je cherche donc à déclencher la validation de la ou des cellules saisies.
 

job75

XLDnaute Barbatruc
Bonsoir chris, Pierre,

A mon avis chris il n'y a pas de solution tel que tu poses le problème.

En effet la validation des données ne fonctionne qu'en mode Edition, sur une seule cellule, par entrée manuelle ou par l'envoi de touches via SendKeys (qui désactive le pavé numérique sur les versions récentes).

On pourrait faire quelque chose en traitant les restrictions de chaque validation mais tu ne le veux pas.

A+
 

chris

XLDnaute Barbatruc
Bonjour job75, Re Pierre

Eureka !

Si j'avais remarqué qu'en manuel , en cas de saisie multiple discontinue la validation ne se déclenche pas, je n'avais même pas remarqué qu'en cas de saisie multiple continue elle n'agit que sur la cellule active dans la sélection.

Ta remarque m'a permis de reconsidérer le problème.

Du coup puisque je ne veux pas être plus royaliste que le roi Excel, il me suffit de tester la propriété Validation.Value de la cellule active sans me compliquer avec les sendkey.

Mais on pourrait même dépasser le roi et tester cette propriété sur chaque cellule de la saisie multiple sans rentrer dans le détail de la ou les validations définies.

Merci job75 de m'avoir sortie de l'ornière où mes œillères m'avaient précipitée.

Je vais un peu peaufiner et comme ce problème de tableaux et protection revient assez régulièrement dans le forum, je le posterai ici.
 

job75

XLDnaute Barbatruc
Bonjour chris, Pierre, le forum,

Voyez le fichier joint avec ce code dans ThisWorkbook :
Code:
Private Sub Workbook_Open()
Dim Sh As Object
For Each Sh In Me.Sheets
  Sh.Protect Monpass, UserInterfaceOnly:=True 'voir Monpass dans Module1
Next
Me.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim r As Range
Application.EnableEvents = False
On Error Resume Next
Set Target = Intersect(Target, Sh.UsedRange) 'limitation
'---interdit les entrées multiples si une cellule non vide a une validation de données---
If Target.Count > 1 Then
  Set r = Target.SpecialCells(xlCellTypeAllValidation)
  If Not r Is Nothing Then
    Set r = r.Find("*", , xlValues)
    If Not r Is Nothing Then Application.Undo: GoTo 1
  End If
End If
'---permet d'agrandir un ou plusieurs tableaux simultanément---
For Each r In Target.Areas
  r = r.Value
Next
1 Application.EnableEvents = True
End Sub
Avec des formules "simples" comme ici, le traitement des entrées est très rapide même sur un grand nombre de cellules.

Edit : chez moi sur Win 10 - Excel 2013 entrée de "aaaa" dans les plages :

- (B26:B10000;H16:J10000) => 0,37 seconde

- (B26:B100000;H16:J100000) => 2,7 secondes

- (B26:B1000000;H16:J1000000) => 25 secondes.

Bien sûr (B27:B1000000;H17:J1000000) => 9,9 secondes puisqu'alors les formules ne suivent pas.

Bonne journée.
 

Pièces jointes

  • Tableaux_protection_Xld(1).xlsm
    34.9 KB · Affichages: 41
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour

J'ai enfin trouvé le temps de me repencher sur ce problème.

Je précise que le code de job75 marche très bien dans la plupart des cas mais dans le cas qui m'occupait, les validations ne sont pas définies en dehors des tableaux d'autant qu'il y a dans certains cas des tableaux les uns sous les autres avec des règles différentes.

Les échanges avec Job75 tant sur le forum qu'en MP ont bien fait avancé mon schmilblick.

Ci-joint un classeur avec les principe retenus et le code.
A priori il fonctionne et peut donc rendre service à ceux qui utilisent les tableaux et la protection.

Si certains ont des remarques ou envie de l'améliorer...
 

Pièces jointes

  • Tableaux_protection_Chris_XLD.xlsm
    39.2 KB · Affichages: 69

Discussions similaires

Réponses
8
Affichages
364

Statistiques des forums

Discussions
311 729
Messages
2 081 966
Membres
101 852
dernier inscrit
dthi16088