Executer une macro sur une autre feuille

Bonjour à tous,

J'aimerais executer une macro (compris dans une autre macro) sur une autre feuille que celle qui est active (cependant à la fin de la macro je veut que la feuille active d'origine reste active).

Pour l'instant je fait :

Worksheets("ma_feulle").Select
        ma_macro
Worksheets("feuille_que_je_veut_laisser_active").Select

Cependant cela provoque un clignotement désagréable a l'écran quand j'éxécute cette macro.

J'aimerais savoir si il est possible de faire ça sans changer de feuille active un peu comme les opérations sur les cellules (Worsheets("ma_feuille").cells(i,j).value=mon_calcul) qui ne change pas la feuille active !

J'éspère que j'ai été assez clair et que vous pourrez m'aider .

Merci d'avance !

Bonjour,

essaye en début de code :

Application.ScreenUpdating = False

sinon, il faut le code complet pour voir

Amicalement

Claude.

Merci dubois pour ta technique, sa marche parfaitement !

Cependant si il y avait une autre astuce pour ne pas changer de feuille ce serait encore mieux !

Voici mon code :

Sub mensuel()
  Dim i As Long
  Dim lig As Long
  Dim truc As Double

  truc = 0
  i = 2

  'feuille valérie
  Worksheets("Valérie").Select
       lig = liglibre()
  Worksheets("Mensuel Val").Select

  Do Until Cells(i, colDate).Value = ""
    If Cells(i, colCroix).Value = "X" Then

      With Worksheets("Valérie")
        .Cells(lig, 2).Value = Cells(i, colDate).Value
        .Cells(lig, 3).Value = Cells(i, colBen).Value
        .Cells(15, 15).Value = .Cells(15, 15).Value + 1
        Cells(i, colCroix).Value = ""
        truc = Cells(i, colCred).Value - Cells(i, colDeb).Value

        If truc < 0 Then
          .Cells(lig, 4).Value = -truc
        Else
          .Cells(lig, 5).Value = truc
        End If

      End With

      Cells(i, colDate) = DateAdd("m", 1, Cells(i, colDate))
    End If
    i = i + 1
  Loop

  classerParDate2

   Worksheets("Valérie").Select
        recalculer
   Worksheets("Mensuel Val").Select

End Sub

Bonjour à tous,

Bien sûr on peut faire sans changer de feuille, mais là ton code est inutilisable en l'état ,

C'est du OpenOffice, non ?

Peux-tu joindre ton fichier raccourci en expliquant l'action à mener

Amicalement

Claude.

Bonjour,

tu pourrais passer ta feuille en paramêtre et l'utiliser dans ton code:

Sub mensuel(MaFeuille as worksheet)

et ensuite au lieu d'utiliser par exemple

worksheets("MaFeuille").activate

tu utilises

MaFeuille.Activate

Quand tu appeleras ta sub, utilise

call mensuel(worksheets("MaFeuille"))

Merci d'avoir pris un peu de votre temps pour vous pencher sur mon problème !

Bien sûr on peut faire sans changer de feuille, mais là ton code est inutilisable en l'état ,

C'est du OpenOffice, non ?

Pas du tout, je me suis inscrit sur un forum excel c'est pas pour poser des questions open office et mon code marche parfaitement !

Peut-être qu'il n'est pas très clair et/ou optimisé... Je suis pas un pro

L'action a mener est de remplacer les lignes suivantes :

Worksheets("Valérie").Select 
       lig = liglibre() 
  Worksheets("Mensuel Val").Select 

Par une version qui ferait la même chose sans changer de feuille. (sachant que liglibre est une fonction que j'ai créé et lig une variable local).

Math >> Je vois très bien ce que tu veut dire, mais ta procédure prend des arguments du coup c'est pas une macro et donc impossible de l'utiliser directement sous excel. (je pourrais faire un inputbox mais dans mon cas ça alourdirais le tout et l'utilisation que je ferais de cette macro m'obligera a taper toujours le même nom de feuille, ici "Valérie").

De plus, sa ne change pas le fait que je change de feuille.

Bonjour,

pourquoi au juste tu ne veux pas changer de feuille?

Je ne veut pas changer de feuille active car :

  • Cela provoque un clignotement quand on execute la macro (bien que cela peut être remedier grace à la méthode de Dubois !)
  • Avoir un code plus élégant
  • Par simple curiosité

Bon après c'est sur que ce n'est pas une question vitale !!

Je pense que tu pourrais référencé tes cellules au long avec le nom de la feuille:

With Worksheets("Valérie") 
        .Cells(lig, 2).Value = Worksheets("Mensuel Val").Cells(i, colDate).Value

ça t'empecherais d'aller à la feuille x seulement pour y accéder aux données. Ce n'est par contre pas vraiment plus élégant

Bonjour Math,

Je connait ça : regarde mon code (le long) que j'ai posté plus haut, c'est ce que j'utilise !

Cependant, comme tu le fait remarquer, cela ne marche que pour accéder ou modifier les données.

Mon probléme est différent : je veut executer une fonction ou une procédure sur une autre feuille que celle active sans en changer. Je sais pas si vous voyez ou je veut en venir.

Dans tout les cas merci pour ta réponse.

Oui je vois ou tu veux en venir,

malheureusement je ne connais pas de méthode pour "travailler" sur une feuille sans y accèder.

EDIT: oublie ce message, je n'était pas trop réveiller encore

Bonjour,

Bonjour, Math

Andvari, pour résoudre ton souci, il nous manque quand même pas mal d'infos...

Tu fais appel à des procédures (liglibre(), recalculer, classerParDate2...) et à des variables (colDate, colCroix) dont on ne sait rien....

Aussi, pour t'aider efficacement, il faudrait toutes les données du problème....

Bonjour,

Comme je t'ai dis + haut, on ne peut pas exploiter ton code sans avoir les tenants et

aboutissants,

cette macro lance une fonction (que l'on ne connait pas), des variables non déclarées etc..

Bref, si tu veux qu'on optimise ce code, il faut le fichier.

et expliquer ce qu'est sensée faire cette macro.

Amicalement

Claude.

Bonjour,

Math, ce n'est pas que je ne veuille pas y accéder, c'est que je ne veut pas l'activer.

Sinon ma question est complétement indépendante de mon code (qui est assez long et pas commenté soit dit en passant), le code que j'ai posté l'était à titre d'exemple...

Je ne cherche pas une optimisation mais je cherche simplement a savoir (accrocher vous ) si il est possible d'éxecuter une procédure ou une fonction (en toute généralité) sur une feuille qui n'est pas la feuille active. Le tout sans changer de feuille active(avec .activate par exemple).

Voili voilou !

Bonjour à tous,

je reviens sur ce que j'ai dis plus haut. Disons que je veux mettre en rouge les 10 premières valeurs de la colonne 1 de la feuille 2 qui sont inférieur à 5. J'ai un bouton dans la feuille 1 avec le code suivant.:

Private Sub CommandButton1_Click()
    For i = 0 To 10
        With Sheets("Feuil2").Range("A1").Offset(i, 0)
            If .Value < 5 Then
                .Font.ColorIndex = 3
            Else
                .Font.ColorIndex = 0
            End If
        End With
    Next i
End Sub

depuis la feuille 1 je teste et modifie des valeurs de la feuille 2 sans jamais l'activer.

Oui j'avais bien compris !

Cependant ce que tu ne fait pas c'est de lancer une fonction ou procédure dans ton code. Et moi c'est ce que je cherche

Je vais essayer de faire exemple. Imagine que je dispose de la fonction toute bête suivante :

Function premCellLibre ()
   'Renvoie le premier indice de colonne j de la ligne 1 dont la cellulle (1,j) est vide

   Dim j as long
   j = 1

   Do Until Cells(1,j).value = ""
       j = j + 1
   Loop

  premCellLibre = j

  End Function

Imaginons maintenant que ma feuille active est "Feuil1" et que je veuille construire une macro qui aurait besoin du premier indice de colonne de la ligne 1 dont la cellulle (1,j) est vide de la "Feuill2".

Je vais donc devoir lancer ma fonction sur la feuille 2. En ce moment j'utilise cette stratégie :

'Ce code se trouve a l'intérieur d'une macro quelconque.

'Active la Feuill2 pour pouvoir lancer ma fonction
   Worksheets("Feuill2").Select
       col =premCellLibre()
'Réactive la feuille 1 car je veut qu'elle reste active.
  Worksheets("Feuill1").Select 

avec col une variable (préalablement définie) créée pour recupérer les données de la fonction.

Donc vous l'avez compris j'active une feuille que je ne veut pas activer et je voudrais savoir si c'était possible de le faire autrement (un peu comme lorsque l'on " teste et modifie" les valeurs d'une feuille non active).

La difficile d'être plus préçis. Je m'en remet a votre savoir.

et si tu changeais ta fonction premCellLibre pour

Function premCellLibre(FeuilleRecherche As Worksheet)
   'Renvoie le premier indice de colonne j de la ligne 1 dont la cellulle (1,j) est vide

   Dim j As Long
   j = 1

   Do Until FeuilleRecherche.Cells(1, j).Value = ""
       j = j + 1
   Loop

  premCellLibre = j

End Function

et après tu appelles de cette façon:

col =premCellLibre(Sheets("Feuil2")) 

J'ai peut-être l'air d'insister, mais dans ma tête ça fonctionne

Bonjour Math,

Ha d'accord je vois ou tu voulais en venir. Effectivement, je n'avais pas envisagé la chose comme ça (modifier directement la fonction).

Et bien je crois que je vais faire ça, même si je vais devoir modifier quelques lignes de code par çi par là du coup.

Je met ce sujet en résolu.

Merci a toi Math, ainsi qu'a tous ceux qui ont sympathiquement répondu a ce sujet.

A plus tard sur le forum.

Rechercher des sujets similaires à "executer macro feuille"