IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

La connexion ADO excel s'ouvre dans le mauvais processus


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut La connexion ADO excel s'ouvre dans le mauvais processus
    Bonjour
    J'ai un problème très technique sur les connexions ADO. J'ai un classeur .xlsm qui fait des requêtes SQL sur lui-même pour comparer des données entre plusieurs onglets. Pour cela, j'utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim strcon As String
    Dim cn As Object
    Dim rcset As Object
    Dim strSQL As String
    strSQL = "ma requete de comparaison"
    strcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & ActiveWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
    Set cn = CreateObject("ADODB.Connection")
    Set rcset = CreateObject("ADODB.Recordset")
    cn.Open strcon
    rcset.Open strSQL, cn, 3, 1
    Ce code est lancé par une macro autoexec workbook.open via une tâche planifiée.
    Je rappelle que les tâches planifiées ouvrent à chaque fois une nouvelle instance d'excel (nouveau processus).

    1 - si je lance la tâche sans qu'aucun autre excel soit présent, le classeur s'ouvre, lance la macro qui "s'ouvre lui-même" pour faire sa requête. La connexion ADO utilise alors le même processus, et la tâche est très rapide.
    2 - si je lance la tâche alors qu'un autre excel est déjà ouvert, le classeur s'ouvre dans un nouveau processus, lance la macro, et la connexion ADO se fait dans le processus du premier excel (en lançant l'autoexec du premier excel au passage). La tâche est alors soit très lente, soit plante directement (l'excel qui contient la requête reste ouvert dans le premier processus), selon l'excel déjà ouvert.

    Question : comment faire pour que la connexion ADO se fasse dans le même processus que l'instance d'excel qui la créé, même si d'autres processus Excel sont ouverts ?
    Autrement, comment contourner ce problème, sachant que j'ai absolument besoin d'utiliser des requêtes SQL ?

    Merci d'avance pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut bonjour,
    si tu exécute ta macro via le gestionnaire de tache, pourquoi ne pas exécuté cette tache via une macro VBSCRIPT? là tu est chez toi et plus de problème d'instance Excel!

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci, mais je ne vois pas trop comment faire (je ne maîtrise pas VBscript, mais je peux apprendre), ni ce que ça va changer : si je lance ma tâche du type
    excel.exe /r "c:\path\fichier.xlsm" via un VBS, ça n'empêchera pas mon excel d'ouvrir sa connexion ADO dans un processus qui n'est pas le sien, si ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    http://vb.developpez.com/telecharger...45/VBS-Factory

    VBSCRIPT c'est comme VBA une variante de VB6:

    le code que tu as placé sur le forum en VBSCRIPT donnerait ça:
    Code VBSCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim strcon 
    Dim cn
    Dim rcset 
    Dim strSQL 
    strSQL = "ma requete de comparaison"
    strcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & "C:\MonRep\MonXls.xls;Extended Properties=""Excel 12.0;HDR=YES;"""
    Set cn = CreateObject("ADODB.Connection")
    Set rcset = CreateObject("ADODB.Recordset")
    cn.Open strcon
    rcset.Open strSQL, cn, 3, 1
    Dernière modification par AlainTech ; 09/02/2014 à 13h50. Motif: Suppression de la citation inutile

  5. #5
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Ah, tu parlais de lancer mes requêtes dans VB au lieu de VBA. Je ne vois pas comment faire, car le résultat des requêtes est ensuite traité sous Excel.
    Est-ce que c'est possible de lancer depuis Excel un .vbs qui me retournerait un recordset ADO que je pourrais manipuler dans Excel ?
    Le schéma général de mon besoin est
    1-chargement de données dans excel
    2-envoi de la requête de contrôle et récupération du recordset
    3-exploitation de la requête
    4-traitement Excel en fonction du résultat de la requête
    Ca me paraît tiré par les cheveux comme méthode, mais si c'est la seule qui marche, je suis pêt à l'utiliser.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dim Xls 
    dim Wb
    Dim Ws
    dim R
    set Xls=createobject("excel.application")
    set Wb=xls.Workbooks.Open(Fichier)
    set Ws=Wb.sheets(1)
    set R=ws.range("A1")
    Wb.Application.Run "MyMacro"
    ça marche pareil sauf que les variable ne son pas typées et
    que les objets implicite d'excel vba n'existe pas il faut faire une déclinaison d'excel application.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xls.Workbooks(1).Worksheets(1).range("A1")
    le sub ,fonction , classe accepté toutes les instruction qui ne son pas dans un sub son exécutées directement.
    Code exemple VBSCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub a()
    end sub
    sub b()
    end sub
    dim toto
    toto ="moi" 's'exécute directement
    a 'appel sub a
    b 'appel sub b
    idéal pour une tache planifie c'est le fichier .bat du VB!

    ce n'est pas la seule qui marche c'est juste une solution comme une autre; c'est comme ça que je ferrais et que je fais régulièrement.
    Dernière modification par Invité ; 31/01/2014 à 10h58.

  7. #7
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,
    autre idée mais non testée via VBscript, car exemple extrait d'une application Access.

    Vu que tu as un problème si tu as déjà une instance de Excel ouverte, tu peux éventuellement tester si excel est déjà actif via VBscript, et alors soit refaire un schedule de la tache plus tard (retry), tuer excel (.... violent mais parfois.... il faut), ou ... ce que tu trouveras opportun.

    Voici du code VBA access pour excécuter un script excel sur un fichier target.
    Je l'utilise dans tous mes exports Access vers VBA avec reformattage des données exportées via script VBa excel. Si Excel était ouvert avant, je ne fais rien après mon script. S'il ne l'était pas, je le ferme après le script.

    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub Execute_Excel_Script(document As String, Excel_Workbook As String, Script_Folder As String, Excel_Script_File As String, Script_Name As String, Specific_param As Variant)
     
    On Error Resume Next
    Dim xlapp As Object
    Dim ExcelWasNotRunning As Boolean    ' Indicateur de libération finale.
    Dim FullScript As String
     
    FullScript = Trim(Script_Folder) & Trim(Excel_Script_File)
     
    Set xlapp = GetObject(, "Excel.Application")
    If err <> 0 Then
       err.Clear
       ExcelWasNotRunning = True
       Set xlapp = CreateObject("Excel.application")
     Else
        ExcelWasNotRunning = False
    End If
    xlapp.Visible = True
    Set XlWkb = xlapp.Workbooks.Open(FullScript)
     
    XlWkb.RunAutoMacros xlAutoOpen
     
    xlapp.Run Script_Name, document, Excel_Workbook, Excel_Script_File, Specific_param
     
    If ExcelWasNotRunning = True Then  
        xlapp.Application.Quit
    End If
     
    Set XlWkb = Nothing
    Set xlapp = Nothing
     
     
    End Sub
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ce que je te propose c'est de soustrère ton xlsm de l'influence de la macro.

    De gérer les objets ado et xls, qu'ado rencarde xls et/ou l'inverse. C'est posible, c'est un problème de syntaxe mais je voie que nous somme 2 a te soutenir.

    Quands je voie les étoile sure tes épaulette je pense que c'est possible!

  9. #9
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    je voie que nous somme 2 a te soutenir.
    Je ne faisais que passer, mais le sujet m'a interpellé.
    Bon week-end
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

Discussions similaires

  1. Connexion ADO excel xretrieve
    Par spud96 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 30/06/2010, 12h37
  2. ADO Excel, Supprimer Données dans Fichier Fermé
    Par vaucluseimmo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/08/2008, 19h20
  3. Connexion ADO AS400 problème de fermeture EXCEL
    Par JYL74 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/11/2007, 11h16
  4. Excel : Nombre de jours ouvrés dans un mois
    Par repié dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/12/2005, 10h09
  5. [Excel vba + ADO(X)] afficher BDD dans listbox
    Par Emcy dans le forum Access
    Réponses: 4
    Dernier message: 13/12/2005, 12h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo