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

VBA Access Discussion :

Automation avec Excel : lancer une macro qui trie les données [AC-2000]


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Points : 28
    Points
    28
    Par défaut Automation avec Excel : lancer une macro qui trie les données
    Bonjour,
    j'ai fait une ListBox de tri sous Access que je souhaite importer sous cellules Excel.
    A partir de là, j'aimerai faire un tri alphabétique sous excel de ce que je viens d'importer, j'ai donc créer la macro sous excel et j'ai voulu la lancer sous excel à partir d'access, mais j'ai l'erreur suivante:

    Erreur d'execution 1004:
    Impossible de trouver la Macro

    en utilisant: xlApp.Run ("Feuil2.CommandButton1_Click")

    La macro se lançait au début, mais depuis que j'ouvre 2 classeur et 3 feuilles Excel à partir d'Access, ça ne marche plus.
    Comment choisir sur quelle feuille et dans quel classeur lancer la Macro?

    Voici mon code actuel

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Public Sub Copie()
     
    Dim xlApp As Excel.Application
        Dim xlSheet11 As Excel.Worksheet
        Dim xlSheet12 As Excel.Worksheet
        Dim xlSheet21 As Excel.Worksheet
        Dim xlBook1 As Excel.Workbook
        Dim xlBook2 As Excel.Workbook
        Dim i As Long, j As Long
        Dim t0 As Long, t1 As Long
     
        t0 = Timer
        Dim rec As Recordset
     
        Set rec = CurrentDb.OpenRecordset("Ouverture", dbOpenSnapshot)
     
        'Initialisations
        Set xlApp = CreateObject("Excel.Application")
        xlApp.Visible = True
     
        'Classeur 1
        Set xlBook1 = xlApp.Workbooks.Open(CurrentProject.Path & "\Bin Packing multiplier (version 1).xls")
     
        'Classeur 2
        Set xlBook2 = xlApp.Workbooks.Add
     
        'Feuil 2 Classeur1
        Set xlSheet12 = xlBook1.Sheets(2)
     
        'Copie de la ListBox sous Excel
     
        For i = 0 To Form_FormulairePrincipal.ListBox0.ListCount - 1
            For j = 0 To 4
     
                xlSheet12.Cells(4, 4).Offset(i, j) = Form_FormulairePrincipal.ListBox0.Column(j, i)
            Next
        Next
        'Macro de tri alphabétique
        xlApp.Run ("Feuil2.CommandButton1_Click")
     
        'Feuil 1 Classeur 1
        Set xlSheet11 = xlBook1.Sheets(1)
     
        xlSheet11.Cells(4, 1) = 1198
     
        xlApp.Run ("Feuil1.CommandButton1_Click")
     
        'Ajouter une feuille de calcul
        Set xlSheet21 = xlBook2.Worksheets.Add
        xlSheet21.Name = "Essai"
     
        xlSheet11.Copy
     
        xlSheet21.Paste
     
        'code de fermeture et libération des objets
        xlBook1.Close (False)
        xlBook2.Close (True)
     
        xlApp.Quit
        rec.Close
        Set rec = Nothing
        Set xlSheet11 = Nothing
        Set xlSheet12 = Nothing
        Set xlSheet21 = Nothing
        Set xlBook1 = Nothing
        Set xlBook2 = Nothing
     
        Set xlApp = Nothing
     
        t1 = Timer
        Debug.Print i & " enregistrements", Format(t1 - t0, "0") & " secondes"
     
    End Sub
    Pouvez vous m'aider?

    Merci

    J'ai également essayé de mettre la macro en automation sous access au lieu d'excel,mais ça n'a pas marché non plus.
    Code sous Access:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Sélection de la plage à trier
        xlSheet12.Range("A1:C7").Select
        'Lancement du tri, basé sur les données de la colonne A en ordre croissant
        Selection.Sort Key1:=xlSheet12.Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    Mais je n'arrive pas à utiliser Range en automation.

    Pouvez vous m'aider?

    merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 63
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Je suis pas expert, mais je pense qu'excel cherche une macro, Il doit y a un conflit de "Feuil1", car Feuil1 est le nom de feuille pour plusieurs classeurs que tu as ouvert (les xlBook)

    Donc remplace plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp.Run ("Feuil1.CommandButton1_Click")
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xlBookNuméro.Run ("Feuil1.CommandButton1_Click")
    'xlBook1 ou 2
    Donc applique la macro à un classeur précis

    Pas sûr du code, mais en tout cas je ne crois pas qu'il faut éviter de mentionner xlApp seule dans cette ligne de code, à voir

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Points : 28
    Points
    28
    Par défaut
    J'ai essayé, mais malheureusement, ça ne marche pas pas avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xlBookNuméro.Run ("Feuil1.CommandButton1_Click")

  4. #4
    Membre actif Avatar de psykodumarteau
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 184
    Points : 218
    Points
    218
    Par défaut
    Tout dépend de la manière avec laquelle tu manipules Excel. Voici un bout de code que j'utilise pour pilote Excel de puis Access. Peu être qu'il pourra t'aider.

    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
     
    Dim appexcel As Excel.Application
    Dim wrkbook As Excel.Workbook
    Dim sheet As Excel.Worksheet
     
    'test si le fichier est ouvert
    If Excel_Ouvert(monfichierxl) Then
        Set appexcel = GetObject(, "Excel.Application")
        Set wrkbook = appexcel.Workbooks(monfichierxl)
    Else:
    'ouvre une application excel
        Set appexcel = CreateObject("Excel.Application")
        Set wrkbook = appexcel.Workbooks.Open(monfichierxl)
    End If
     
    'Active le bon classeur
    wrkbook.Activate
    'selectionne un feuille et l'active
    Set sheet = wrkbook.Worksheets("mafeuille")
    sheet.Activate 
     
    'demarre une macro
    appexcel.Run "mamacro", "monarg1", "monarg2"
     
    'sauvegarde, ferme le classeur et excel
    wrkbook.Save
    wrkbook.Close
    appexcel.Quit
     
    'Désallocation mémoire
    Set sheet = Nothing
    Set wrkbook = Nothing
    Set appexcel = Nothing
    La fonction Excel_Ouvert :
    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
     
    Public Function Excel_Ouvert(ByVal fichierexcel) As Boolean
     
        Dim Wb As Excel.Workbook
        Dim Appli As Excel.Application
     
        On Error Resume Next
     
        Set Appli = GetObject(, "Excel.Application")
     
        If Appli Is Nothing Then
            'retourne faux le fichier n'est pas ouvert
            Excel_Ouvert = False
            Exit Function
        Else    
            For Each Wb In Appli.Workbooks
                If Wb.Name = fichierexcel Then
                    'retourne vrai si le fichier est ouvert
                    Excel_Ouvert = True
                    'libere la memoire
                    Set Wb = Nothing
                    Set Appli = Nothing
                    Exit Function
                End If
            'retourne faux le fichier n'est pas ouvert
            Excel_Ouvert = False
            Next Wb
        'libere la memoire
        Set Wb = Nothing
        Set Appli = Nothing
        End If
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer une macro après un résultat donné par le Solver
    Par bluesun91 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/06/2010, 12h05
  2. Une macro qui supprime les macros ?
    Par GodOfTrolls dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/06/2008, 10h03
  3. [VBA/Excel]lancer une macro d'un autre document
    Par daniel_gre dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/05/2008, 15h37
  4. Réponses: 10
    Dernier message: 13/08/2007, 16h12
  5. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 12h15

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