XL 2016 Actualisation requête sélection tableau struturé

  • Initiateur de la discussion Initiateur de la discussion ZZ59264
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

ZZ59264

XLDnaute Occasionnel
Bonjour à tous,

J'ai un souci avec ma version Excel 2016 : suite à la mise en place d'un code qui permet l'actualisation d'une requête, je souhaite qu'on passe à la cellule du dessous,

Le hic, c'est qu'à la fin de la procédure VBA, il sélectionne tout le tableau structuré,

Merci d'avance pour votre aide,

Cordialement,
 

Pièces jointes

Solution
Re-,
Essaie avec ce code : (juste modifié l'évènement SelectionChange, mais je mets l'entièreté)

VB:
Dim KeyCells As Range, Tgt As Range
Dim Flag As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Flag Then Exit Sub
Set KeyCells = Union(Me.Range("t_Exemple[Exemple 1]"), Me.Range("t_Exemple[Exemple 2]"))
If Not Intersect(Target, KeyCells) Is Nothing Then
    Set Tgt = Target.Offset(1)
    Flag = True
    Me.Range("t_Exemple").ListObject.QueryTable.Refresh BackgroundQuery:=False
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("t_Exemple[#All]").Address Then
    If Not Tgt Is Nothing Then
        Tgt.Select
    Else...
@Dan, une fois qu'on a vérifier que le TS n'est plus sélectionné en pas à pas, quel code VBA permettrait à la procédure de sélectionner la cellule en dessous au lieu du TS ?,
Désolé pour mon retour tardif

C'est la ligne avec le Select que je vous ai proposée avant mais j'admets que c'est un peu curieux de mettre cela dans le code

A tout hasard essayez un peu ceci. Remplacez toutes les lignes de code par ceci
VB:
Dim encours As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim keycells As Range

If encours = True Then Exit Sub
Set keycells = Union(Me.Range("t_Exemple[Exemple 1]"), Me.Range("t_Exemple[Exemple 2]"))
If Not Intersect(Target, keycells) Is Nothing Then
    encours = True
    Range("t_Exemple").ListObject.QueryTable.Refresh BackgroundQuery:=False
    Range("t_Exemple").ListObject.DataBodyRange(Target.Row, Target.Column).Select
End If
encours = False
End Sub
Veillez bien à ce que la première ligne soit bien la déclaration Dim

NB : Juste pour voir, après faites aussi l'essai en ajoutant +1 à l'instruction Target.row. donc ceci --> Target.row+1
Là si vous changez D6, est-ce que le code vous sélectionne D8 ou pas ?

EDIT : oups désolé je n'avais pas vu votre réponse sur la proposition de Cousinhub. je laisse pour l'essai. Après je supprimerai éventuellement ma réponse
 
Salut @Cousinhub ,
Le code ne fonctionne que si le target est unique .
Il ne refresh pas les valeurs si on efface l'ensemble de la colonne [Exemple 2] par exemple .
Hi,
Oui, c'était juste pour confirmer le fonctionnement (Sélection de Target.Offset(1))
La condition Target.CountLarge > 1 empêche effectivement une modification multiple.
Une adaptation devrait être possible, mais à priori, pas nécessaire.
Bonne journée
 
Salut @Cousinhub ,
Le code ne fonctionne que si le target est unique .
Il ne refresh pas les valeurs si on efface l'ensemble de la colonne [Exemple 2] par exemple .
Re-,
Peut-être ainsi, mais seul le demandeur (ou toute autre personne disposant de 2016 64bit) pourra tester...(du moins, pour la sélection)
VB:
Dim KeyCells As Range, Tgt As Range
Dim Flag As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Flag Then Exit Sub
Set KeyCells = Union(Me.Range("t_Exemple[Exemple 1]"), Me.Range("t_Exemple[Exemple 2]"))
If Not Intersect(Target, KeyCells) Is Nothing Then
    Set Tgt = Target.Offset(1)
    Flag = True
    Me.Range("t_Exemple").ListObject.QueryTable.Refresh BackgroundQuery:=False
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("t_Exemple[#All]").Address Then Tgt.Select
Flag = False
End Sub
 
Bonjour à tous,

@Dan, j'ai testé votre code mais celui ci ne fonctionne pas, le TS reste actualisé à al fin de la procédure évènementielle,

@Cousinhub, je vous confirme que votre nouveau code fonctionne si l'on intervient sur plusieurs cellules, mais je ne comprends pas le sens des étapes ou apparait la variable Flag ?,

Merci d'avance,

Cordialement,
 
Bonjour à tous,

@Dan, j'ai testé votre code mais celui ci ne fonctionne pas, le TS reste actualisé à al fin de la procédure évènementielle,

@Cousinhub, je vous confirme que votre nouveau code fonctionne si l'on intervient sur plusieurs cellules, mais je ne comprends pas le sens des étapes ou apparait la variable Flag ?,

Merci d'avance,

Cordialement,
La valeur booléenne (donc, soit vrai, soit faux) permet d'éviter d'entrer en boucle permanente :
Refresh -> Modification de cellules, donc Change -> Refresh.... indéfiniment
L'idéal est de placer un point d'arrêt au niveau de If Flag, et de dérouler ensuite en mode pas-à-pas (appui sur touche F8)
Et d'enlever cette sécurité, mettre le point d'arrêt au niveau de Set KeyCells, et de dérouler toujours en mode F8
Le code va alors s'exécuter sans fin...
Pour autoriser un nouveau Refresh, on bascule le Flag en False, dans l'évènement Selection_Change, afin de pouvoir dérouler de nouvelles requêtes...
Pas simple à expliquer, même si c'est clair dans ma tête... 🙂
 
La valeur booléenne (donc, soit vrai, soit faux) permet d'éviter d'entrer en boucle permanente :
Refresh -> Modification de cellules, donc Change -> Refresh.... indéfiniment
L'idéal est de placer un point d'arrêt au niveau de If Flag, et de dérouler ensuite en mode pas-à-pas (appui sur touche F8)
Et d'enlever cette sécurité, mettre le point d'arrêt au niveau de Set KeyCells, et de dérouler toujours en mode F8
Le code va alors s'exécuter sans fin...
Pour autoriser un nouveau Refresh, on bascule le Flag en False, dans l'évènement Selection_Change, afin de pouvoir dérouler de nouvelles requêtes...
Pas simple à expliquer, même si c'est clair dans ma tête... 🙂
Merci Cousinhub,

Effectivement c'est pas simple à expliquer, ni à comprendre mais je pense avoir compris,

Merci pour ce retour d'explication,

Cordialement,
 
Re,
Si vous conservez PQ,
préchargez la requête à l'ouverture du classeur,
cela évitera le lag important lors de la première saisie​
1743418953164.png

Cependant, Je ne suis pas sûr de votre besoin de PQ d'où toutes mes questions précédentes .
Pouvez-vous tester le classeur ci-joint sans PQ .
 

Pièces jointes

Dernière édition:
Re-,
quelle ligne est surlignée en jaune, lorsque tu cliques sur "Débogage"?
Ah excuse moi, j'ai oublié de le préciser, ce sont uniquement les mots "Tgt.Select" après le Then du code :

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("t_Exemple[#All]").Address Then Tgt.Select
Flag = False
End Sub

Merci d'avance,

Cordialement,
 
Re-,
Tu as bien mis la déclaration de la variable Tgt en haut de la feuille?
1743420869398.png

ainsi que les 2 autres (bien que KeyCells eût pu rester dans l'évènement "Change"
Par contre, Flag et Tgt, impérativement en haut, pour qu'elles aient la portée sur tous les évènements
 
Re,
Si vous conservez PQ,
préchargez la requête à l'ouverture du classeur,
cela évitera le lag important lors de la première saisie​
Regarde la pièce jointe 1215590

Cependant, Je ne suis pas sûr de votre besoin de PQ d'où toutes mes questions précédentes .
Pouvez-vous tester le classeur ci-joint sans PQ .
Bonjour Fanch55, oui effectivement l'actualisation à l'ouverture permettrait de voir le lag diminué lors de la première saisie,

Cependant, je souhaite absolument passer par PQ, car le fichier est externe, et surtout c'est une partie que je maitrise beaucoup mieux qu'une procédure VBA,

Merci quand même pour votre proposition,

Cordialement,
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
455
Retour