La Force de vba pour attendre la requête sql à exécuter avant de continuer
Cela semble être un problème assez courant, mais aucune des solutions que j'ai trouvé l'air de fonctionner.
Je suis en saisissant des données à partir de SQL Server et de le copier dans une feuille de calcul. Alors je veux copier une gamme de nouvelles données et de faire d'autres choses avec elle. Tout cela se produit en une seule fonction vba.
Mon problème est que lorsque la fonction est exécutée à partir d'Excel, il se déplace sur la deuxième partie de la fonction, sans attendre que la requête renvoie les données requises.
Bien sûr la fonction fonctionne très bien quand je le lance à partir de l'IDE vba.
Dim a As New ADODB.Connection
Dim r As New ADODB.Recordset
a.Open (connStr)
Set r = a.Execute(sqlstr)
sht.Range("A2").CopyFromRecordset r
'please wait here until the proc has executed?
checkData = sht.Range("A2").Value
Quand je lance la fonction à partir d'Excel checkdata ce plug-in est toujours vide, quand je le lance avec la touche F5, qu'il a toujours les données requises.
oui, je fais cela dans une fonction vba où sqlStr est une procédure stockée sql qui retourne les données requises.
Ensuite, utilisez simplement
checkData = r.Fields(0).Value
à moins qu'il n'y a plus de données à partir du jeu d'enregistrements dont vous avez besoin. Si vous avez besoin d'autres données, alors vous allez devoir trouver un moyen de faire tourner le code des autres que par le biais d'un fichier UDF.OriginalL'auteur Skrealin | 2012-07-12
Vous devez vous connecter pour publier un commentaire.
Fait ce travail?
Sinon, si cela échoue, vous pouvez essayer de tester certaines propriétés de r, comme des expressions du FOLKLORE ou BOF, et si une erreur se produit, ou si vous obtenez une valeur inattendue vous savez que les données n'a pas encore chargé. Par exemple:
J'ai pensé que peut-être un peu trop évident. Je te suggère de mettre un peu de debug.imprimer les lignes dans votre copyfromrecordset fonction pour vérifier que c'est effectivement arriver à chaque partie du code. Si elle l'est, sortie les valeurs de la variable afin de vérifier que tout est en lecture/traitées correctement.
Le nombre de fois où j'ai assumé le code est exécuté dans une certaine manière et a constaté qu'elle ne l'est pas. Je pense que cela est particulièrement vrai lorsque vous êtes dans un langage de script dans un autre environnement; souvent les objets sous-jacents sont en train de faire des choses que vous n'attendez pas et si vous n'avez pas une bonne compréhension de leur il est facile de rater des choses.
Après une tonne de débogage, il s'est avéré être dans une autre section de code qui avait été un bonheur de travailler pendant des mois avant, j'ai essayé d'ajouter ce nouveau genre de choses. Merci pour l'aide, au moins je sais maintenant beaucoup plus sur les jeux d'enregistrements!
Eh bien, je ne pense pas que j'ai vraiment eu beaucoup à faire avec elle, mais je suis content que vous avez trié! 🙂
OriginalL'auteur mkingston
Essayez d'utiliser:
après l'exécution de l'instruction SQL, mais avant de copier le jeu d'enregistrements
OriginalL'auteur Chris
Cela peut vous aider. Au lieu de définir la source de données dans le code, de le mettre en place sur la cible de la feuille de calcul d'une connexion de données (Excel menu Données | à Partir d'Autres Sources | etc.). Une fois un objet de connexion nommée "(par Défaut)" est créé, vous tapez dans le code le long de ces lignes:
OriginalL'auteur andy holaday
Je pense que vous avez besoin d'un
r.movelast
après l'exécution de assurez-vous que toutes les lignes sont retournées.Quelque chose comme
OriginalL'auteur DJ.
Le long des lignes de andy holaday, j'ai eu ce travail en décochant "Activer l'actualisation en arrière-plan" dans la plage de données externes propriétés. La désactivation de cette fonctionnalité force excel à attendre que la requête est exécutée.
OriginalL'auteur Jeff Larsen
Mais si il n'y a pas de jeu d'enregistrements retournés j'ai trouvé ce code va attendre jusqu'à ce que le code SQL retourne avant de passer à la prochaine instruction VBA. Très pratique lorsqu'il y a dépendance par une commande sur un autre ou si vous avez besoin d'un ensemble complet de données créé avant de passer.
Le code pour ExecuteSql est:
OriginalL'auteur SQLAlan