Bonjour à tous
Le contexte :
Dans une feuille Excel, j'ai une QueryTable nommé "REQ_1"
Les paramètres Where pour la requête SQL sont générés en fonction de résultats de cellule. Ils sont donc à chaques fois différents (Dim SQLSTring As String).
En résumé voici le code réduit de la création de la QueryTable :
[COde]With ActiveSheet.QueryTables.Add(Connection:=SQLconnect, Destination:=QTDest, Sql:=SQLString)
.Name = "REQ_1"
.Refresh
End With[/COdde]
Le constat :
A chaque regénération de la table par .ADD, je me suis appreçu de 2 choses.
1 - Les noms de requête s’incrémente tous seuls (REQ_1, REQ_2, REQ_3, …)
2 – Les noms de champ de la plage de données aussi idem.
En fouillant j’ai compris que la zone de destination étant toujours la même (ex :A1), les requêtes se supperposées, les anciennes étant toujours en mémorisées dans un « sac à bazard ».
Le petit bout de code me le confirme, en m’affichant le nombre de QT
MsgBox ActiveSheet.QueryTables.Count
Les essaies :
1/ J’ai donc essayé de supprimer en début de procédure tous les QT, je ne régle pas encore le cas des noms de plage, mais au moins la suppression des tables.
Code qui fonctionne :
1 2 3 4
| Dim QT As Excel.QueryTable
For Each QT In ActiveSheet.QueryTables
QT.Delete
Next QT |
2/ Je me suis dis c’est « KifKif » pour les NomsdeChamp.
Et bien ces versions de code fonctionnent bien avec un Nom de champ crée à la main par Insertion/Nom/Définir pas pour les nom de Champ générés automatiquement par la création d’une QT.
Code 1 :
ActiveWorkbook.Names("REQ_1").Delete
Code 2 :
1 2 3 4 5 6
| Dim nomPlage As Object
For Each nomPlage In ActiveWorkbook.Names
If nomPlage.Name = "REQ_1" Then
nomPlage.Delete
End If
Next nomPlage |
3/ Je baisse la tête quand je croise ma femme à qui je n’arrive plus à justifier de passer 20 heures sur deux lignes de code autrement que de lui avouer être une « brèle »
Le code 1 fonctionne bien, si je viens de créer le nom « REQ_1 » à la main. Bug si le nom n’est pas créé.
Par contre le code 1 ne fonctionne pas avec un nom pourtant présent dans le liste des noms de champs, mais créé par la QT.
Le code 2 fait un bide mais ne bug pas.
Remarque : le nom de champ s’affiche dans les menus avec en colonne de droite le nom de la feuille d’où il est issu ‘feuill1’. Comme si il était privé.
Objectif :
Eviter la profusion de nom de champs par incrémentation, et idem pour les noms de Requête QueryTable
1000 Merci de faire en sorte que je ne creuse pas le déficite de Sécu.
Partager