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 :

Macro lancée depuis batch, Classeur1 s'ouvre à la fin


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Par défaut Macro lancée depuis batch, Classeur1 s'ouvre à la fin
    Bonjour à tous,

    J'aurai besoin d'aide, je ne comprends pas ce qui se passe dans mon code. Je cherche à lancer une macro excel depuis un fichier batch. J'ai trouvé le code sur internet, la macro se lance bien mais il y a un problème à la fin:
    - le fichier excel se ferme (comme demandé dans le code)
    - un autre fichier excel appelé Classeur1 vide avec un onglet nommé Macro1 s'ouvre (je ne sais pas d'où il sort ni à quoi correspond Macro1)

    Je ne sais pas si c'est lié à l'histoire des getobject/createobject ou bien à l'histoire où il faut nommer un onglet avec le nom du classeur le précédent ou bien à complètement autre chose. Tout ce que je sais c'est que quand je mets en commentaires la ligne wbExcel.Close, ça marche. Mais moi, je voudrai que excel sauvegarde tout seul le fichier sans que j'ai à cliquer sur la croix.

    Auriez-vous une idée d'où sortent Macro1 et Classeur1 ?
    Merci de votre aide !

    Voici le code:

    Fichier batch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" /cmd /MAJ "P:\BilanMensuel.xlsm"
    Fichier excel, module ThisWorkbook
    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
     
    Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long
    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (lpString As Any) As Long
    Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long
     
    Private Function GetCmd() As String
       Dim lpCmd As Long
       lpCmd = GetCommandLine()
       GetCmd = Space$(lstrlen(ByVal lpCmd))
       lstrcpy ByVal GetCmd, ByVal lpCmd
    End Function
     
    Private Sub Workbook_Open()
    Dim macmdline As Variant
    Dim monparam As Variant 'déclare une variable
        macmdline = GetCmd 'affecte la valeur de la ligne de commande
        If Not IsNull(macmdline) Then 'si la variable est nulle
            If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée
                If InStr(macmdline, "/cmd") > 0 Then
                    macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare)
                    monparam = Split(macmdline, " /cmd ")
                    Application.Run Mid(monparam(1), 2, Len(monparam(1)) - 3)
                End If
            End If
        End If
    End Sub
    Fichier excel, module Module1
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    Sub MAJ()
        Dim ExcelWasRunning As Boolean
        Dim xlApp As Object
        Dim wbExcel As Object
        Set xlApp = Nothing
        On Error Resume Next
        Set xlApp = GetObject(, "Excel.Application")
        On Error GoTo 0
        If xlApp Is Nothing Then
           Set xlApp = CreateObject("Excel.Application")
           ExcelWasRunning = False
        Else
           ExcelWasRunning = True
        End If
        Set wbExcel = ActiveWorkbook
     
        Dim oAccesS As Access.Application
        Dim db As DAO.Database
        Set oAccesS = GetObject(ML_PATH) 'ML_PATH est une constant declarée Public
        oAccesS.Visible = False
        Set db = oAccesS.CurrentDb
        Call LancementRequêteAccess("MaRequeteAccess", "MonOngletExcelOuExporterLesDonnees", "NomDuRangeSousExcelOuExporterLesDonnees", "A1")
     
        db.Close
        oAccesS.Quit
        Set db = Nothing
        Set oAccesS = Nothing
        If Not ExcelWasRunning Then
            wbExcel.Close True
            xlApp.Quit
            Set wbExcel = Nothing
            Set xlApp = Nothing
        Else
             wbExcel.Close True
            Set wbExcel = Nothing
        End If
    End Sub
     
     
     Sub LancementRequêteAccess(MyQuery As String, MyWorksheet As String, MyDynamicRange As String, MyRangeStart As String)
        On Error GoTo err
        Dim qdf As QueryDef
        Dim rst As DAO.Recordset
        Set qdf = CurrentDb.QueryDefs(MyQuery)
        Set rst = qdf.OpenRecordset(dbOpenSnapshot)
        If IsEmpty(Worksheets(MyWorksheet).Range(MyRangeStart)) <> True Then
            Worksheets(MyWorksheet).Range(MyDynamicRange).ClearContents
        End If
        Worksheets(MyWorksheet).Range(MyRangeStart).CopyFromRecordset rst
     
    Exit_Err:
        rst.Close: qdf.Close
        Set rst = Nothing
        Set qdf = Nothing
     
        Exit Sub
     
    err:
        MsgBox "Une erreur est survenue" & vbCrLf & err.Description, vbCritical, "LancementRequêteAccess"
    End Sub

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    ravi que mon tuto t'ait servi
    http://jpcheck.developpez.com/tutori...ge-parametres/

    Le mieux pour suivre ce que fais ton code, c'est de lancer "manuellement" la fonction Workbook_Open(), en remplaçant la valeur du paramètre :
    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
     
    Private Sub Workbook_Open()
    Dim macmdline As Variant
    Dim monparam As Variant 'déclare une variable
        macmdline = "taligne de commande"
        If Not IsNull(macmdline) Then 'si la variable est nulle
            If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée
                If InStr(macmdline, "/cmd") > 0 Then
                    macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare)
                    monparam = Split(macmdline, " /cmd ")
                    Application.Run Mid(monparam(1), 2, Len(monparam(1)) - 3)
                End If
            End If
        End If
    End Sub
    en mode pas à pas, tu auras ta réponse
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Par défaut
    Hello !

    Oui c'est bien ton tuto que j'avais pris . Il m'a bien servi, merci !

    J'ai déjà fait ce que tu proposes: j'ai tapé en dur la ligne de commande, j'ai mis un breakpoint et j'ai fait du pas à pas. Tout se déroule parfaitement, et quand ça arrive sur le close, ben ça se ferme... et pas de création du Classeur1.

    Par contre, si je lance mon batch, alors création de mon Classeur1.

    Le code est un copié collé donc je vois pas d'où vient le problème.
    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
     
    ' ouverture du fichier excel depuis le fichier batch
    Private Sub Workbook_Open()
    Dim macmdline As Variant
    Dim monparam As Variant 'déclare une variable
        macmdline = GetCmd 'affecte la valeur de la ligne de commande
        If Not IsNull(macmdline) Then 'si la variable est nulle
            If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée
                If InStr(macmdline, "/cmd") > 0 Then
                    macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare)
                    monparam = Split(macmdline, " /cmd ")
                    Application.Run Mid(monparam(1), 2, Len(monparam(1)) - 3)
                End If
            End If
        End If
    End Sub
     
     
    Public Sub Test()
    Dim macmdline As Variant
    Dim monparam As Variant 'déclare une variable
        macmdline = """C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"" /cmd /MAJ ""P:\BilanMensuel.xlsm"""
        If Not IsNull(macmdline) Then 'si la variable est nulle
            If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée
                If InStr(macmdline, "/cmd") > 0 Then
                    macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare)
                    monparam = Split(macmdline, " /cmd ")
                    Application.Run Mid(monparam(1), 2, Len(monparam(1)) - 3)
                End If
            End If
        End If
    End Sub

Discussions similaires

  1. Macro Word avec paramètre lancée depuis Excel
    Par Dreamer84 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/11/2011, 17h12
  2. [XL-97] problème version de word lancé depuis une macro
    Par bahamutdragoon dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/08/2010, 11h15
  3. Macro Word avec paramètre lancée depuis Excel
    Par ouskel'n'or dans le forum Contribuez
    Réponses: 1
    Dernier message: 07/10/2007, 18h50
  4. Batch Java lancé depuis une appli php?
    Par gui38 dans le forum Linux
    Réponses: 16
    Dernier message: 15/11/2006, 09h04
  5. Macro Excel lancée depuis Acces
    Par Invité dans le forum Access
    Réponses: 4
    Dernier message: 18/01/2006, 14h25

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