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 :

Utilisation de la Fonction sous-total dans une macro [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Apprenti ingénieur génie industriel
    Inscrit en
    Août 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Apprenti ingénieur génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 5
    Par défaut Utilisation de la Fonction sous-total dans une macro
    Bonjour,

    Je souhaite créer une macro qui me récupère des données d'une extraction.
    J'ai jusque la réussi à automatiser le lancement de l'application pour effectuer l'extraction, filtrer les données que je veux.

    Et c'est la que se pose mon problème, j'aimerais utiliser la fonction sous-total pour faire la somme d'une colonne pour ne prendre en compte que les cellules qui m'intéresse.
    Cependant je n'y arrive pas.
    voici mon 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
    Dim i As Integer, somme As Integer
    Dim LR As Long
    
    
    Shell "C:\Temp\BN_LanceMesSql.exe" 'ouvrir appli extraction automatique
    Application.Wait Now + TimeValue("0:01:00") 'attente de 35secondes pour faire l'extraction
    
    
    Set xlApp = GetObject("Classeur2").Application ' Récupère le nom de l'object Classeur2
                xlApp.Application.Workbooks("Classeur2").Sheets(1).Activate    ' Selectionne la feuille 1 du classeur2
                xlApp.Application.WindowState = xlMaximized  ' Mettre plein écran
    
    xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("A1:I1").Select
        xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("A1:I1").AutoFilter
        xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("A:I").AutoFilter Field:=4, Criteria1:="10114102"
        xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("A:I").AutoFilter Field:=2, Criteria1:="20606"  'Filtre sur article et poste
        'somme = (xlApp.Application.Workbooks("Classeur2").WorksheetFunction.Subtotal(109, xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("I2:I100")))
        
        xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("I2:I600").Select
        xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("I2:I600").NumberFormat = "0"
       
        somme = WorksheetFunction.Subtotal(109, xlApp.Application.Workbooks("Classeur2").Sheets(1).Range("I2:I600"))
    Je suis ouverte à toutes propositions pouvant m'aider..

    Par avance merci!

  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,

    l'ordre d'appel est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.Subtotal(tesparametres)
    tu devrais pouvoir adapter aisément ton code
    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
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Une piste et comme je présume que le code est exécuté depuis un module standard du classeur "Classeur2.xlsm", pas besoin d'utiliser l'objet "Application" :
    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
     
     
        Dim Fe As Worksheet
        Dim Somme As Double
        Dim Lig As Long
        Dim I As Long
     
        Shell "C:\Temp\BN_LanceMesSql.exe" 'ouvrir appli extraction automatique
        Application.Wait Now + TimeValue("0:01:00") 'attente de 35secondes pour faire l'extraction
     
        Workbooks("Classeur2.xlsm").Application.WindowState = xlMaximized  ' Mettre plein écran
     
        Set Fe = Workbooks("Classeur2.xlsm").Sheets(1)
     
        With Fe
     
            'filtrage successifs
            .Range("A:I").AutoFilter
            .Range("A:I").AutoFilter 4, "10114102"
            .Range("A:I").AutoFilter 2, "20606"
     
            Lig = .Cells(.Rows.Count, 4).End(xlUp).Row
     
            'commence la boucle à 2 pour éviter les entêtes (à adapter !)
            'ne prend en compte que les cellules visibles de la colonne F et les additionne (à adapter !)
            For I = 2 To Lig
                If .Cells(I, 6).EntireRow.Hidden = False Then Somme = Somme + .Cells(I, 6).Value
            Next I
     
            'suppression du filtrage
            .Range("A:I").AutoFilter
     
        End With
     
        'affiche
        MsgBox Somme
     
    End Sub
    Après, si tu tiens vraiment à utiliser la fonction Sous.Total(), regardes du coté de l'objet Range d'AutoFilter !

  4. #4
    Membre à l'essai
    Femme Profil pro
    Apprenti ingénieur génie industriel
    Inscrit en
    Août 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Apprenti ingénieur génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonjour,

    Une piste et comme je présume que le code est exécuté depuis un module standard du classeur "Classeur2.xlsm", pas besoin d'utiliser l'objet "Application" :
    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
     
     
        Dim Fe As Worksheet
        Dim Somme As Double
        Dim Lig As Long
        Dim I As Long
     
        Shell "C:\Temp\BN_LanceMesSql.exe" 'ouvrir appli extraction automatique
        Application.Wait Now + TimeValue("0:01:00") 'attente de 35secondes pour faire l'extraction
     
        Workbooks("Classeur2.xlsm").Application.WindowState = xlMaximized  ' Mettre plein écran
     
        Set Fe = Workbooks("Classeur2.xlsm").Sheets(1)
     
        With Fe
     
            'filtrage successifs
            .Range("A:I").AutoFilter
            .Range("A:I").AutoFilter 4, "10114102"
            .Range("A:I").AutoFilter 2, "20606"
     
            Lig = .Cells(.Rows.Count, 4).End(xlUp).Row
     
            'commence la boucle à 2 pour éviter les entêtes (à adapter !)
            'ne prend en compte que les cellules visibles de la colonne F et les additionne (à adapter !)
            For I = 2 To Lig
                If .Cells(I, 6).EntireRow.Hidden = False Then Somme = Somme + .Cells(I, 6).Value
            Next I
     
            'suppression du filtrage
            .Range("A:I").AutoFilter
     
        End With
     
        'affiche
        MsgBox Somme
     
    End Sub
    Après, si tu tiens vraiment à utiliser la fonction Sous.Total(), regardes du coté de l'objet Range d'AutoFilter !

    Bonjour,

    La macro est sur un premier fichier et j'ai une application SQL qui ouvre une extraction sous Excel, mais le fichier que l'application SQL ouvre n'est pas enregistré dans l'ordinateur, je n'ai donc pas le chemin du fichier.
    C'est pour ça que je met application, ca ne fonctionnait pas sinon.

    Ta piste peut- elle toujours marché meme avec l'utilisation de application ?

    Merci.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Testes ceci pour voir :
    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
     
    Sub Test()
     
        Dim xlApp As Object
        Dim Fe As Object
        Dim I As Long
        Dim Somme As Double
     
        Shell "C:\Temp\BN_LanceMesSql.exe" 'ouvrir appli extraction automatique
        Application.Wait Now + TimeValue("0:01:00") 'attente de 35secondes pour faire l'extraction
     
        Set xlApp = GetObject("Classeur2.xlsx").Application '<--- ajouter l'extension
     
        .WindowState = xlMaximized  ' Mettre plein écran
     
        Set Fe = xlApp.Workbooks("Classeur2.xlsx").Worksheets(1) '<--- ajouter l'extension
     
        With Fe
     
            .Range("A:I").AutoFilter
            .Range("A:I").AutoFilter 4, "10114102"
            .Range("A:I").AutoFilter 2, "20606"    'Filtre sur article et poste
     
            .Range("I2:I600").NumberFormat = "0"
     
            Lig = .Cells(.Rows.Count, 4).End(xlUp).Row
     
            For I = 2 To Lig
                If .Cells(I, 6).EntireRow.Hidden = False Then Somme = Somme + .Cells(I, 6).Value
            Next I
     
            'suppression du filtrage
            .Range("A:I").AutoFilter
     
        End With
     
        MsgBox Somme
     
    End Sub

  6. #6
    Membre à l'essai
    Femme Profil pro
    Apprenti ingénieur génie industriel
    Inscrit en
    Août 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Apprenti ingénieur génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 5
    Par défaut
    Bonjour,

    La macro que tu m'as donné ne met pas d'erreur, mais je ne trouve pas le bon résultat, peux-tu me dire à quel endroit dans le code on paramètre la colonne de la somme stp ?

    Merci beaucoup pour ta réponse !

  7. #7
    Membre à l'essai
    Femme Profil pro
    Apprenti ingénieur génie industriel
    Inscrit en
    Août 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Apprenti ingénieur génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    l'ordre d'appel est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.Subtotal(tesparametres)
    tu devrais pouvoir adapter aisément ton code
    Salut,

    D'abord merci pour ta réponse, mais lorsque je mets ta partie de code, j'ai une erreur me disant qu'il y a une incompatibilité de type.

    Peux-tu m'aider ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Pour répondre au problème posé (utilisation de Sous.Total dans une macro)…

    Si tu t'appuies sur un tableau structuré, c'est hyper simple…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.subtotal(109,range("tableau1[valeur]"))
    Nom : 2018-08-07 10_41_53-Window.png
Affichages : 1553
Taille : 9,8 Ko

    Nom : 2018-08-07 10_42_14-Window.png
Affichages : 1458
Taille : 2,6 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/11/2010, 12h06
  2. ajouter un sous total dans une zone de liste
    Par sakia dans le forum IHM
    Réponses: 1
    Dernier message: 21/09/2010, 06h38
  3. Fonction sous-total dans Données
    Par Prekestolen dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 15/02/2010, 21h46
  4. [WD14] Sous total dans une table fenêtre avec rupture
    Par Raptor92 dans le forum WinDev
    Réponses: 6
    Dernier message: 15/09/2009, 08h25
  5. Sous Total dans une DataReport
    Par louis_figos dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 13/11/2006, 09h53

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