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 :

Problème pour insérer une formule dans un code VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 32
    Par défaut Problème pour insérer une formule dans un code VBA
    Bonjour,

    Grâce au forum CCM, je dispose d'un code pour effectuer un filtre élaboré. Ce code fonctionne très bien, et je remercie à nouveau les membres de CCM qui m'ont aidé. Mon pb aujourd'hui est que j'ai voulu rajouté une ligne me permettant d'appliquer une formule à la colonne K, cette formule renvoie une valeur en fonction des éléments du filtre (qui est copié sur les colonnes de B à J). La formule à appliquer se trouve en K2, et elle doit s'appliquer de la cellule K7 jusqu'à la dernière ligne du filtre (qui est amenée à évoluer). Malheureusement j'ai trop de lacunes en VBA, ce code ne fonctionne pas, je n'ai aucun message d'erreur mais la formule ne s'applique pas...

    J'ai vraiment besoin de votre aide, merci à tous ceux qui voudront bien se pencher sur mon pb...

    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
    23
    Sub FiltreAvance()
     
    Dim DL As Integer
    Dim DerLig As Integer
    DL = Sheets(1).Cells(Application.Rows.Count, 4).End(xlUp).Row
    DerLig = Sheets(2).Cells(Application.Rows.Count, 2).End(xlUp).Row
    With Sheets(1)
        .Select
        .Range(Cells(4, 1), Cells(DL, 9)).Select
    End With
    Selection.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets(2).[B1:B2], CopyToRange:=Sheets(2).[B6], Unique:=False
    With Sheets(2)
        .Select
        Range("B6:J6").Font.Bold = True
        Range("B6:J6").Font.Size = 16
        Range("B6:J6").Font.ColorIndex = 2
        Range("B6:J6").Interior.ColorIndex = 41
        Range("B6:J6").HorizontalAlignment = xlCenter
        Range("F7:J65536").HorizontalAlignment = xlCenter
        Range("B7:E65536").HorizontalAlignment = xlLeft
        .Range("K7" & DerLig).FormulaR1C1 = Range("K2").FormulaR1C1
    End With
    End Sub

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    regarde si c'est une bonne piste, je n'ai pas pu la tester bien entendu

    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
    Sub FiltreAvance()
    Dim Plage As Range
     
    With Sheets(1)
        Set Plage = .Range(.Cells(4, 1), .Cells(.Cells(.Rows.Count, 4).End(xlUp).Row, 9))
        Plage.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets(2).[B1:B2], CopyToRange:=Sheets(2).[B6], Unique:=False
    End With
     
    With Sheets(2)
        With .Range("B6:J6")
            .Font.Bold = True
            .Font.Size = 16
            .Font.ColorIndex = 2
            .Interior.ColorIndex = 41
            .HorizontalAlignment = xlCenter
        End With
     
        .Range("F7:J65536").HorizontalAlignment = xlCenter
        .Range("B7:E65536").HorizontalAlignment = xlLeft
        Set Plage =  .Range(.Cells(7, 11), .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 11))
        Plage.FormulaR1C1 = .Cells(2, 11).FormulaR1C1
    End With
     
    End Sub
    Je me suis permis de virer les Select et d'enlever tes variables contenant les dernières lignes
    pour une meilleur lisibilité, j'ai par contre utilisé une variable Plage sur le filtre avancé et l'écriture de la formule

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 32
    Par défaut Ca fonctionne
    J'ai intégré ton code et il a l'air de très bien fonctionner ! Merci beaucoup.

    J'ai voulu en profiter pour le réutiliser pour un autre code (un code qui efface le contenu de certaines plage de cellules), malheureusement je n'ai pas du l'adapter comme il faut car il ne marche pas... j'ai le message d'erreur : Variable non définie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Effacer()
    Dim Plage1 As Range
    Dim Plage2 As Range
        With Sheets(2)
            Plage1 = .Range(.Cells(6, 2), .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 9))
            Plage1.ClearContents
            Plage2 = .Range(.Cells(7, 10), .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 39))
            Plage2.ClearContents
        End With
    End Sub
    As tu une idée de ce qui ne va pas ?

    Merci pour ton aide.

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Une variable Objet (Variable Range) s'instancie au moyen de l'instruction Set

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = Feuil1.Range("A1")

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 32
    Par défaut
    Super ça fonctionne, merci beaucoup j'aurais appris des choses grâce à toi.

    Je me permets de te solliciter à nouveau si tu le veux bien. Cette macro Effacer prend beaucoup de temps ( au moins 5-6min), je voulais savoir si tu connais un autre type de code, qui serait peut etre plus rapide? De plus, actuellement j'ai deux boutons, je dois d'abord cliquer sur le bouton 1 qui active la macro Effacer, puis je clique sur le bouton 2 qui active ma macro FiltreAvance. Y aurait il un moyen pour regrouper les 2 macros ? l'idéal serait que lorsqu'on clique sur le bouton 2, la macro efface le contenu des 2 plages de cellules mentionnées pour ensuite copie le nouveau filtre et lance l'exécution des formules.

    Merci beaucoup pour ton aide.

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    A vrai dire, j'ai l'impression qu'on peut encore faire mieux dans une seule procédure :

    1) Effacement de la totalité de ta feuille de destination
    2) écriture de la zone de critère et des en-têtes où tes données seront copiées par le filtre
    3) application du filtre

    ça paraît radical, mais au moins le nettoyage de feuille va prendre moins d'une seconde

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/07/2014, 15h14
  2. Réponses: 4
    Dernier message: 12/07/2010, 19h48
  3. [VBA-E] Problème pour insérer des lignes dans une feuille Excel
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2007, 14h13
  4. Probléme pour insérer une variable dans un champs
    Par BOUTRAIS dans le forum Access
    Réponses: 2
    Dernier message: 11/04/2006, 22h45
  5. [PDE] Problème pour sauvegarder une modif dans un éditeur
    Par simsky dans le forum Eclipse Java
    Réponses: 11
    Dernier message: 11/08/2005, 15h05

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