6
votes

Tables de requête (QueryTables) dans Excel 2010 avec VBA avec VBA Créer de nombreuses connexions

Je suis 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


0 commentaires

8 Réponses :


1
votes

Vous devez déclarer la connexion en tant qu'objet distinct, vous pouvez le fermer une fois que la requête de la base de données est terminée.

Je n'ai pas le VBA IDE devant moi, alors excusez-moi s'il y a des inexactitudes, mais Il devrait vous indiquer dans la bonne direction. P>

EG P>

Dim SQL As String
Dim con As connection

Set con = New connection
con.ConnectionString = "ODBC;DSN=DB01;UID=;PWD=;Database=MyDatabase"

Worksheets("Received").QueryTables.Add(Connection:=con, Destination:=Worksheets("Received").Range("A5"), SQL:=SQL).Refresh

con.close
set con = nothing


2 commentaires

Lorsque j'essaie cela, les feuilles de calcul ("reçues") ... La ligne donne une erreur de temps d'appel de procédure non valide 5. J'ai également essayé de la modifier de la nouvelle connexion à une nouvelle connexion Adodb et de l'utiliser en conséquence. Pas de dé.


Eh bien, tout ce que j'ai fait était la réponse de Reformat ST0000, mais cette est la réponse à votre question initiale à propos de traiter des connexions de fermeture. Je ne travaille pas dans Excel, donc je ne peux pas m'empêcher de tout ce qui est faux.



11
votes

Vous pouvez vous demander pourquoi vous créez une query à chaque fois dans votre code. Il y a des raisons de le faire, mais ce n'est généralement pas nécessaire.

QueryTables sont plus typiquement des objets de conception. C'est-à-dire que vous créez votre queyTable une fois (via le code ou l'interface utilisateur) et vous rafraîchissez la requête pour obtenir des données mises à jour. P>

Si vous devez modifier l'instruction SQL sous-jacente, vous avez des options. Vous pouvez configurer des paramètres qui invitent une valeur ou l'obtenir d'une cellule. Une autre option de modification du SQL est la modifie en code de la requête existante. P>

Sheet1.QueryTables(1).CommandText = "Select * FROM ...."
Sheet1.QueryTables(1).Refresh


0 commentaires

7
votes

J'ai eu le même problème. La réponse précédente tandis qu'une étape définie dans la bonne direction est un pita.

Il m'a cependant permis de préciser ma recherche et que le gagnant est ... p>

Http://msdn.microsoft.com/en-us/library/bb213491(v=Office.12).aspx p>

IE Pour votre objet QueryTable existant, faites cela: P>

.MaintainConnection = False


0 commentaires

1
votes

J'ai trouvé que par défaut, de nouvelles connexions créées de cette manière sont appelées "Connexion". Ce que j'utilise est cet extrait de code pour supprimer la connexion, mais conserver la liste ListObject.

Application.DisplayAlerts = False
ActiveWorkbook.Connections(ActiveWorkbook.Connections.Count).Delete
Application.DisplayAlerts = True


0 commentaires

0
votes

Si vous souhaitez supprimer si juste après l'actualisation, vous devez effectuer l'actualisation non en arrière-plan (à l'aide du premier paramètre -> Actualiser false) afin que vous ayez une séquence appropriée d'actions


0 commentaires

0
votes

Essayez de définir la propriété QueryTable.MaintainConnection sur FALSE ...

"Définir maintenueConnection sur true si la connexion à la source de données spécifiée doit être maintenue après l'actualisation et jusqu'à ce que le classeur soit fermé. La valeur par défaut est vraie! Et il ne semble pas y avoir une case à cocher UI pour cela. (Lire / écrire booléen) "


0 commentaires

0
votes

Toujours des années pertinentes plus tard ... Combattre le même problème et c'est le fil le plus utile. Ma situation est une variante de ce qui précède et je vais ajouter ma solution quand je le trouve.

J'utilise une base de données d'accès pour ma source de données et établissez une requête sur une nouvelle feuille. J'ajoute ensuite deux autres nouvelles feuilles et essayez d'établir une quey de la même connexion sur chacune d'elles, mais à une table d'accès différente. La première query fonctionne bien et j'utilise .QueryTables (1) .Delete et réglage de l'objet QueryTable à rien pour le rendre déconnecté.

Cependant, la feuille suivante échoue à la mise en place d'une nouvelle requête en utilisant la même connexion, qui n'était pas fermée. Je suppose que je suppose (et ajoutera la solution ci-dessous) que je dois déposer la connexion avant de supprimer la requête. Le code de Rasmus ci-dessus ressemble à la solution probable.


0 commentaires

1
votes

au lieu d'ajouter une autre table de requête avec la méthode Ajouter , vous pouvez simplement mettre à jour la propriété CommandText de la connexion. Cependant, vous devez savoir qu'il existe un bug lors de la mise à jour de la propriété CommandText d'une connexion ODBC. Si vous passez temporairement sur une connexion OLEDB, mettez à jour votre propriété CommandText , puis revenez à ODBC, il ne crée pas la nouvelle connexion. Ne me demandez pas pourquoi ... cela fonctionne simplement pour moi.

Créez un nouveau module et insérez le code suivant: xxx

Ce updateworkbookConnection Le sous-programme ne fonctionne que sur la mise à jour des connexions OLDED ou ODBC. La connexion ne doit pas nécessairement être liée à une table pivot. Il corrige également un autre problème et vous permet de mettre à jour la connexion même s'il existe plusieurs tables de pivotement en fonction de la même connexion.

Pour initier la mise à jour, appelez simplement la fonction avec l'objet de connexion et les paramètres de texte de commande comme celui-ci. : xxx

Vous pouvez éventuellement mettre à jour la chaîne de connexion également.


0 commentaires