VBA: boucle sur des onglets d'un autre fichier

Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023 - 7 août 2023 à 11:03
yg_be Messages postés 22787 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 mai 2024 - 7 août 2023 à 13:45

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

Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 932
7 août 2023 à 11:19

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
yg_be Messages postés 22787 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 mai 2024 1 481
7 août 2023 à 12:29

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
yg_be Messages postés 22787 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 mai 2024 1 481
7 août 2023 à 12:37

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
Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023 > yg_be Messages postés 22787 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 mai 2024
7 août 2023 à 13:18

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
yg_be Messages postés 22787 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 mai 2024 1 481 > Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023
7 août 2023 à 13:45

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