Requête Tables (tables de requête) dans Excel 2010 avec VBA de VBA de la création de nombreuses connexions
Je suis en suivant le code que j'ai trouvé sur un autre site. Voici les bases de mon code:
Dim SQL As String
Dim connString As String
connString = "ODBC;DSN=DB01;UID=;PWD=;Database=MyDatabase"
SQL = "Select * from SomeTable"
With Worksheets("Received").QueryTables.Add(Connection:=connString, Destination:=Worksheets("Received").Range("A5"), SQL:=SQL)
.Refresh
End With
End Sub
Le problème avec cela est que chaque fois ils ont frappé le bouton assigné à ce qu'il crée une nouvelle connexion et de ne jamais le laisser tomber. J'ouvre la feuille de calcul après le test et il existe de nombreuses versions de la connexion répertoriée sous Connexions.
Connexion
Connection1
Connection2
Je n'arrive pas à trouver un moyen de fermer ou de supprimer les connexions. Si j'ajoute ".supprimer" après ".Actualiser", j'obtiens une erreur 1004. Cette opération ne peut pas être fait, parce que les données sont rafraîchissant dans l'arrière-plan.
Toute idées sur la façon de fermer ou de supprimer la connexion?
OriginalL'auteur DavidStein | 2011-02-07
Vous devez vous connecter pour publier un commentaire.
Vous pourriez vous demander pourquoi vous êtes en train de créer une table de requête à chaque fois dans votre code. Il y a des raisons de le faire, mais elle n'est généralement pas nécessaire.
QueryTables sont plus généralement au moment de la conception des objets. Qui est, vous créez votre table de requête une fois (à l'aide de code ou de l'INTERFACE utilisateur) et la réactualisation de la table de requête pour obtenir des données à jour.
Si vous avez besoin de modifier l'instruction SQL sous-jacente, vous avez quelques options. Vous pouvez configurer les Paramètres d'invite pour une valeur ou l'obtenir à partir d'une cellule. Une autre option pour changer le SQL est en train de changer dans le code pour que la table de requête.
Vous pouvez sélectionner les différentes colonnes, ou encore les différentes tables en changeant CommandText. Si c'est une autre base de données, vous aurez besoin d'une nouvelle connexion, mais c'est assez rare.
Je sais que de ne pas répondre directement à votre question, mais je pense que déterminer si vous avez vraiment besoin d'ajouter de la table de requête à chaque fois est la première étape.
Pour en savoir plus sur les Paramètres, consultez la http://dailydoseofexcel.com/archives/2004/12/13/parameters-in-excel-external-data-queries/ C'est pour 2003, donc il y a quelques incohérences avec les versions ultérieures. Les bases sont les mêmes, vous avez juste besoin d'apprendre à propos de l'objet ListObject si vous êtes à l'aide de 2007 ou plus tard.
OriginalL'auteur Dick Kusleika
J'ai eu le même problème. La réponse précédente tout en un pas décisif dans la bonne direction est un pain PITA.
Il n'a toutefois me permettre d'affiner mes recherches et le gagnant est...
http://msdn.microsoft.com/en-us/library/bb213491(v=office.12).aspx
c'est à dire pour votre Objet QueryTable viens de le faire:
Travaille jamais à la houle. Pas plus d'Accès DB fichier de verrouillage après l'actualisation des données.
OriginalL'auteur Yotool
Vous devez déclarer la connexion comme un objet distinct, alors vous pouvez le fermer une fois la requête de base de données est complète.
Je n'ai pas le VBA IDE en face de moi, donc excusez-moi si il y a des inexactitudes, mais il faut vous diriger dans la bonne direction.
E. g.
Eh bien, j'ai tout reformater st0000 réponse, mais ce est la réponse à votre question initiale sur la façon de traiter avec la fermeture des connexions. Je ne travaille pas dans Excel donc je ne peux pas aider avec tout ce qui est mauvais.
OriginalL'auteur st0000
J'ai trouvé que, par défaut, de nouvelles connexions créées de cette façon sont appelés "Connexion". Ce que j'utilise est cet extrait de code pour supprimer la connexion, mais de conserver le listobject.
Il peut facilement être modifié pour supprimer le dernier ajout de la connexion (ou si vous garder la trace des connexions par leur index).
OriginalL'auteur Rasmus Remmer Bielidt
Au lieu d'ajouter une autre table de requête avec la
add
méthode, vous pouvez simplement mettre à jour la Propriété CommandText de la connexion. Cependant, vous devez être conscient qu'il y a un bug lors de la mise à jour de laCommandText
propriété d'une connexion ODBC. Si vous passer temporairement à une connexion OLEDB, mise à jour de votreCommandText
de la propriété, puis revenez à ODBC, il ne crée pas de la nouvelle connexion. Ne me demandez pas pourquoi... cela fonctionne pour moi.Créer un nouveau module et insérez le code suivant:
Ce
UpdateWorkbookConnection
sous-programme ne fonctionne que sur la mise à jour OLEDB ou ODBC connexions. La connexion ne doit pas nécessairement être liée à un tableau croisé dynamique. Il résout également un autre problème et permet de mettre à jour la connexion, même si il y a plusieurs tableaux croisés dynamiques basés sur la même connexion.Pour lancer la mise à jour il suffit d'appeler la fonction avec l'objet de connexion et de commande les paramètres de texte comme ceci:
Vous pouvez éventuellement mettre à jour la chaîne de connexion.
OriginalL'auteur Brian Pressler
Si vous souhaitez supprimer si juste après vous rafraîchir devrait faire l'actualisation de ne pas en arrière-plan (à l'aide de premier paramètre -> Actualiser les Faux), de sorte que vous avez la bonne séquence d'actions
OriginalL'auteur Kodak
Essayer le réglage de la table de requête.MaintainConnection valeur False à la propriété...
"Set MaintainConnection True si la connexion à la source de données spécifiée doit être maintenue après l'actualisation et jusqu'à la fermeture du classeur. La valeur par défaut est True! Et il ne semble pas être une INTERFACE utilisateur case à cocher pour ce (Lecture/écriture Boolean)"
OriginalL'auteur Leighton
Encore des années plus tard...luttant contre le même problème et c'est le plus utile thread là-bas. Ma situation est une variante de ce qui précède et je vais ajouter ma solution quand je le trouve.
Je suis en utilisant une base de données Access pour ma source de données et d'établir une table de requête sur une nouvelle feuille. Je puis ajouter deux nouvelles feuilles et de tenter d'établir une table de requête en utilisant la même connexion sur chacun d'eux, mais dans une autre table Access. La première table de requête fonctionne très bien et je l'utilise .QueryTables(1).Supprimer et en définissant l'objet querytable à Rien à faire déconnecté.
Toutefois, la feuille suivante échoue sur la création d'une nouvelle table de requête en utilisant la même connexion, ce qui n'était pas fermée. Je soupçonne (et ajouter la solution ci-dessous) que j'ai besoin de supprimer la connexion avant de supprimer la table de requête. Rasmus code ci-dessus ressemble probablement la solution.
OriginalL'auteur Jim Snyder