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...
Si je comprend bien la requête et les précisions que vous avez apportées,

Vous récupérez des données sur un ficher externe au classeur .
Ces données sont retournées sous format de table avec les colonnes Index,Date et Ca

Vous vous servez ensuite de PQ pour transformer la table en
l' étendant avec 2 colonnes étrangères numériques (Exemple 1,Exemple 2).
et enfin une colonne (ca corrigée) est ajoutée, faisant la somme de Ca, exemple 1 et exemple 2 .

En cas de saisie dans les colonnes exemple 1 et exemple 2, la requête ne vous sert finalement qu'à faire les sommes .

Ai-je bon ?
Bonjour Fanch55,

Oui c'est exactement cela, les colonnes Exemple 1, 2 et CA Corrigée n'existent pas dans la source, elles sont ajoutées dans la procédure de la requête.

Le self référencing consiste en la fusion de la source avec le TS en ayant une clé unique (ici index).

Mais en quoi cela pourrait vous aider, car mon problème se situe bien au chargement de la requête? ... avez vous une autre idée?,

Je pense, peut être à tort, que la solution passera par le code VBA :

garder en mémoire l'adresse de la cellule modifiée,
détecter que l'actualisation est terminée et que le TS soit sélectionné,
puis de revenir à la l'adresse en dessous de la cible.

Vous l'aurez comprit je n'ai pas cette compétence VBA,

Merci d'avance pour votre aide,

Cordialement,
 
Bonjour à tous, désolé pour le retard mais je vais tenter de répondre à chaque intervenant :

@Dan : désolé de remettre le fichier, c'est pour voir que je mets bien en place la même procédure et sur le même fichier test puisque vous aviez un doute sur le fichier utilisé,

En remplaçant la ligne Target par :

VB:
Range("t_Exemple").ListObject.DataBodyRange(Target.Row, Target.Column).Select

Un nombre saisi en D6, la cellule sélectionné automatiquement en faisant Entrée est D8, la requête s'actualise et le TS est de nouveau sélectionné,

Le fichier test que j'utilise pour la mise en place de la procédure est strictement le même que celui posté : c'est mon fichier de travail qui fait référence à un fichier externe, c'était uniquement pour préciser le contexte dans lequel j'utilise Power Query plutôt qu'un simple tableau avec des formules,
C'est tout de même curieux que si vous sélectionnez D6, le code va automatiquement en D8 ?? parce que si vous vous déplacez dans le tableau via clic ou les flèches droites gauche de votre clavier, le tableau ne va pas être sélectionné...

Faites aussi un essai en mettant un STOP juste avant la ligne SELECT. Là le code s'arrêtera sur le STOP et vous pouvez continuer en mode pas à pas pour tester ce qui se passe.
Donc comme ceci
VB:
    Range("t_Exemple").ListObject.QueryTable.Refresh BackgroundQuery:=False
    Stop
    Range("t_Exemple").ListObject.DataBodyRange(Target.Row, Target.Column).Select

NB : tant qu'à faire j'ai aussi testé en mettant Target.row-1

Au final, je me demande si le souci ne vient pas du fait que l'on a pas le fichier source qui sert à la création du tableau via PQ.
 
C'est tout de même curieux que si vous sélectionnez D6, le code va automatiquement en D8 ?? parce que si vous vous déplacez dans le tableau via clic ou les flèches droites gauche de votre clavier, le tableau ne va pas être sélectionné...

Faites aussi un essai en mettant un STOP juste avant la ligne SELECT. Là le code s'arrêtera sur le STOP et vous pouvez continuer en mode pas à pas pour tester ce qui se passe.
Donc comme ceci
VB:
    Range("t_Exemple").ListObject.QueryTable.Refresh BackgroundQuery:=False
    Stop
    Range("t_Exemple").ListObject.DataBodyRange(Target.Row, Target.Column).Select

NB : tant qu'à faire j'ai aussi testé en mettant Target.row-1

Au final, je me demande si le souci ne vient pas du fait que l'on a pas le fichier source qui sert à la création du tableau via PQ.
Bonjour Dan,

J'ai mis le code proposé et à la saisie d'un nombre en D6, la fenêtre VBA s'ouvre et surligne en jaune Stop mais je vois que l'actualisation de la requête se poursuit et le TS est sélectionné,

Puis en pas à pas détaillé, D6 est sélectionné, malgré que j'ai mis le code :

VB:
Range("t_Exemple").ListObject.DataBodyRange(Target.Row-1, Target.Column).Select
Au final, je me demande si le souci ne vient pas du fait que l'on a pas le fichier source qui sert à la création du tableau via PQ.

Non vu que j'utilise le fichier test fournit et que celui ci ne fait pas référence à un fichier externe, malgré tout j'ai ce problème d'actualisation que sélectionne le TS à la fin de celle ci,

Merci pour votre aide, je n'en vois pas le bout de cette coquille !!

Cordialement,
 
As-tu bien attendu que la requête soit terminée avant d'appuyer sur <F8> ?
Oui, bien sur !
Donc je saisi un nombre en D6, la fenêtre VBA s'ouvre du fait du Stop surligné en jaune, mais sur Excel l'actulasiation se poursuit et le TS est sélectionné,
J'attends que le TS soit sélectionné, puis pas a pas détaillé et sur la ligne End if, la sélection se fait sur D6 malgré ce code :

VB:
Range("t_Exemple").ListObject.DataBodyRange(Target.Row-1, Target.Column).Select

Merci d'avance,

Cordialement,
 
Oui, bien sur !
Donc je saisi un nombre en D6, la fenêtre VBA s'ouvre du fait du Stop surligné en jaune, mais sur Excel l'actulasiation se poursuit et le TS est sélectionné,
J'attends que le TS soit sélectionné, puis pas a pas détaillé et sur la ligne End if, la sélection se fait sur D6 malgré ce code :

VB:
Range("t_Exemple").ListObject.DataBodyRange(Target.Row-1, Target.Column).Select

Merci d'avance,

Cordialement,
Avec Target.row-1, c'est normal que la sélection reste sur D6. Si vous voulez sur D7, enlevez le -1
Je vous ai donné cela juste pour vérifier s'il y avait toujours la sélection du TS ou pas
 
la sélection se fait sur D6 malgré ce code
Non pas "malgré", mais "grâce" à ce code. 😉

Donc ici tu nous dis que D6 est sélectionnée alors que juste avant tu nous disais que c'était le TS complet qui restait sélectionné en pas à pas.
Me trompé-je ?

[edit]
Ben oui, je me trompe, bien sûr ! 🫤
J'avais lu en #33 que le TS complet restait sélectionné... J'ai pourtant cité le message dans lequel il est écrit très clairement que c'est D6 qui est sélectionnée !... 🙄
Donc tout est normal.
C'est exactement ce que j'ai décrit en #26 : en mode pas à pas D6 (ou D7 selon le code VBA) est bien sélectionnée, mais en mode normal c'est le TS qui reste sélectionné. Et cela, même si on met un sleep... ce qui me paraît plus étrange. Peut-être faudrait-il ajouter des "do events" ?
[/edit]
 
Dernière édition:
Bonsoir à tous,
Non pas "malgré", mais "grâce" à ce code. 😉

Donc ici tu nous dis que D6 est sélectionnée alors que juste avant tu nous disais que c'était le TS complet qui restait sélectionné en pas à pas.
Me trompé-je ?

[edit]
Ben oui, je me trompe, bien sûr ! 🫤
J'avais lu en #33 que le TS complet restait sélectionné... J'ai pourtant cité le message dans lequel il est écrit très clairement que c'est D6 qui est sélectionnée !... 🙄

@TooFatBoy, non je n'ai pas écrit que le TS complet restait sélectionné en pas à pas,

A la fin du post #33 je réponds à Dan ayant un doute sur le fait que cela pourrait être dû à la source du code, or que ce soit un fichier externe ou non, d'ailleurs comme dit plusieurs fois, peu importe la requête, à la fin de l'actualisation le TS est sélectionné avec ma version Excel 2016 64 Bits.

Surtout qu'au début de ce post je précise que "Puis en pas à pas détaillé, D6 est sélectionné" et m'étonne qu'il le soit car je pensais que la partie du code
VB:
Target.Row-1
m'aurait amener en D7, mais suite au retour de Dan c'est normal.

Effectivement sur le post #26, vous décrivez ce qui se passe, et votre version d'Excel à le même comportement que le mien, donc vos tests donneront la même chose chez moi,

Cependant, je ne sais pas ou mettre un éventuel Do Events !

@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 ?,

Merci d'avance pour votre aide,

Cordialement,
 
@TooFatBoy, non je n'ai pas écrit que le TS complet restait sélectionné en pas à pas
Oui, c'est ce que j'ai corrigé dans mon "edit".


Surtout qu'au début de ce post je précise que "Puis en pas à pas détaillé, D6 est sélectionné" et m'étonne qu'il le soit car je pensais que la partie du code Target.Row-1 m'aurait amener en D7, mais suite au retour de Dan c'est normal.
Je te l'ai dit que c'était normal !
Est-ce que tu as lu mon message en entier ???
 
Je te l'ai dit que c'était normal !
Est-ce que tu as lu mon message en entier ???
Oui bien sur je l'ai lu, je n'ai testé que le pas à pas que depuis que Dan me l'a demandé ce jour, mais effectivement vous aviez déjà testé et arrivait à la même conclusion,

Lors de votre post concluant que le pas à pas permettait la sélection de la cible, je ne percevait pas l'intérêt de faire cette démarche 😉

Cependant, je n'ai pas la solution qui me permettrait de sélectionner la cellule que je souhaite et non le TS à la fin de l'actualisation, sans passer par le pas à pas avec un Stop au milieu de la procédure évènementielle,

Merci d'avance pour votre aide,

Cordialement,
 
Bonsoir,

Ultimes questions :
cette opération se fait à la demande et écrase entièrement la table existante ?
La source externe est-elle un fichier csv ou excel ?
Bonjour Fanch55,

Je ne comprends pas très bien vos questions mais je vais tenter d'y répondre :

Oui l'opération se fait à la demande c'est à dire qu'a chaque nombre entré dans les colonnes Exemple 1 et 2, la procédure évènementielle se lance,

La source externe est un fichier Excel, mais je ne vois pas en quoi cela aurait été différent si cela aurait été un fichier Csv, la source ne me semble pas être le problème car il se reproduit sur le fichier test envoyé qui n'a pas de source externe, et l'actualisation se termine bien avec la sélection du TS.

Merci d'avance,

Cordialement,
 
Re-,
Un autre essai....
VB:
Dim KeyCells As Range, Tgt As Range

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Target.CountLarge > 1 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)
    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
End Sub
Après, je ne vois plus... Edit, à moins d'essayer de mettre le BackgroundQuery à True....
 
- 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