VBA: boucle sur des onglets d'un autre fichier

Matthieu221 Messages postés 12 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

 Bonjour à tous,

ci dessous (la grosse formule)  un code qui marche mais que je souhaite perfectionner notamment dans un premier temps, sur la partie: 

a = WorksheetFunction.Small(Workbooks("Portefeuille FIA sous gestion.xlsx").Sheets("G.F. DE BREVES").Range("k10:k49"), i)

Cette formule va aller chercher dans un autre fichier ("portefeuille FIA sous gestion"), la plus petite valeur de la sélection (range) de l'onglet ("GF de BREVES"). => Or, j'ai 32 onglets et je veux appliquer toute la formule décrite ci dessous sur chaque onglet de ce fichier (qui n'est donc pas le fichier source vous l'aurez compris).

J'ai vu des macros pour appliquer des formules sur chaque onglet du  fichier source mais pas sur un autre fichier. 

Merci à vous !

Matthieu


 

Sub stress_test_passif()

Application.ScreenUpdating = False

Workbooks.Open Filename:= _
        "P:\Bureau\Audit Contrôle\Suivi des risques\tableau de bord\Portefeuille FIA sous gestion.xlsx"
  
Windows("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Activate

'gf de breves


For j = 3 To 61 Step 4
For i = 1 To 40


a = WorksheetFunction.Small(Workbooks("Portefeuille FIA sous gestion.xlsx").Sheets("G.F. DE BREVES").Range("k10:k49"), i)

 

 

Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j) = Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j) + a

If Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j) >= Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j - 1) Then
If Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j) = 0 Then Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j + 1) = 0


Exit For
End If


If Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j) > 0 Then Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(56, j + 1) = (i - WorksheetFunction.CountIf(Workbooks("Portefeuille FIA sous gestion.xlsx").Sheets("G.F. DE BREVES").Range("k10:k49"), 0)) + 1

Next i
Next j
Windows("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Activate
 

 


​

2 réponses

  1. Utilisateur anonyme
     

    Bonjour 

    la méthode Sheets() prend soit une string en paramètre soit un entier correspondant à l'index de la page.

    Tu peux donc utiliser un for pour iterer tes feuilles.


    0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    "appliquer toute la formule décrite ci dessous sur chaque onglet": tu veux faire une boucle sur les onglets, ou chercher simultanément dans tous les onglets?

    un exemple de boucle:

    Dim wbgestion As Workbook, wsloop As Worksheet
    Set wbgestion = Workbooks.Open( _
            "P:\Bureau\Audit Contrôle\Suivi des risques\tableau de bord\Portefeuille FIA sous gestion.xlsx")
    For Each wsloop In wbgestion.Worksheets
    
    Next wsloop
    
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      un autre exemple:

      Sub stress_test_passif()
      Dim a, i, j
      Dim wbgestion As Workbook, wbstress As Workbook
      Dim wsinactif As Worksheet, wsloop As Worksheet
      Application.ScreenUpdating = False
      Set wbgestion = Workbooks.Open( _
              "P:\Bureau\Audit Contrôle\Suivi des risques\tableau de bord\Portefeuille FIA sous gestion.xlsx")
      Set wbstress = Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm")
      Set wsinactif = wbstress.Sheets("marché secondaire inactif")
      For j = 3 To 61 Step 4
          For i = 1 To 40
              For Each wsloop In wbgestion.Worksheets
                  a = WorksheetFunction.Small(wsloop.Range("k10:k49"), i)
                  wsinactif.Cells(56, j) = wsinactif.Cells(56, j) + a
                  If wsinactif.Cells(56, j) >= wsinactif.Cells(56, j - 1) Then
                      If wsinactif.Cells(56, j) = 0 Then
                          wsinactif.Cells(56, j + 1) = 0
                      End If
                      GoTo nextj
                  End If
                  If wsinactif.Cells(56, j) > 0 Then
                      wsinactif.Cells(56, j + 1) = _
                          (i - WorksheetFunction.CountIf(wsloop.Range("k10:k49"), 0)) + 1
                  End If
              Next wsloop
          Next i
      nextj:
      Next j
      wbstress.Activate
      End Sub
      0
      1. Matthieu221 Messages postés 12 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Merci yg_be

        je te remercie pour ce code beaucoup moins lourd que le mien et plus lisible .

        Petite question, comme tu peux le voir mes "cells" vont de cells(56,j). si je souhaite avoir une boucle allant de z = 53 to 84 pour faire cells(z,j)

        ou dois je placer cette boucle z dans ton code ? (j'ai essayé de le bidouiller mais le résultat qui sort ne me convient pas, je dois donc me tromper de place )

        Merci ! 

        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Matthieu221 Messages postés 12 Statut Membre
         

        Sans comprendre ce que ton code doit réaliser, je suggère de mettre la boucle en z autour de la boucle en j.

        0