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 :

Appliquer une procédure à une feuille


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
    Décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 21
    Par défaut Appliquer une procédure à une feuille
    Bonjour à tous,

    J'ai crée une procédure adaptée à une feuille en particulier. Mais j'aimerais que la procédure se répète sur x feuilles.
    Je m'explique: suite au remplissage d'un userform par l'utilisateur, une macro crée autant de feuilles que nécessaire.
    Je dois donc adapter la macro qui marche pour une feuille à toutes les autres. Pour se faire, je souhaiterai rentrer en paramètre la feuille voulue et effectuer une boucle pour remplir toutes les feuilles. Malheureusement ça ne marche pas, je dois mal écrire le paramètre ou mal appeler ma sub par la suite.

    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
    Public Sub GenererMatin(Feuille As String)
     
        Dim Calorie As Double
        Dim compteur As Double 'Comparateur de calories
        Dim i As Integer
     
       [...] 
     
     Dim CellNomGeneral As Range, CellNom As Range, CellMasse As Range, CellCalorie As Range
        Set CellNomGeneral = Sheets(Feuille).Range("B5")
        Set CellNom = Sheets(Feuille).Range("D6")
       Set CellMasse = Sheets(Feuille).Range("E6")
       Set CellCalorie = Sheets(Feuille).Range("F6")
     
       With TabPetitDej(m, 7)
        CellNomGeneral.value = .Nom
       End With
     
        For i = 1 To 6
            Dim j As Integer
            j = i - 1
            With TabPetitDej(m, i)
               CellNom.Offset(j, 0).value = .Nom
                CellMasse.Offset(j, 0).value = Masse(i)
                CellCalorie.Offset(j, 0).value = .Calorie * Masse(i) / 100
            End With
        Next
     
    End Sub
    Ensuite, dans un autre module, je fais appelle à ma sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Test()
    Call DeclarationPetitDejeuner
    Call GenererMatin(Feuil6)
    End sub
    Je ne sais pas si j'ai bien déclaré ma feuille, normalement c'est un string si j'ai bien compris
    Mais ensuite, pour y faire appel, que dois je faire?
    Call GenererMatin("Feuil6") ?
    Call GenererMatin(Feuil6) ?
    Admettons que Feuil6 soit le nom donné automatique par excel mais que la feuille en question a été renommée Toto, dois-je écrire:
    Call GenererMatin("Toto") ?
    Call GenererMatin(Toto) ?
    Je ne comprends pas vraiment comment faire appel à ma procédure

    Ce qui m'embête, c'est que je serai obligée d'appliquer une boucle pour remplir toutes mes feuilles, donc je ne vois pas comment faire autrement que ne pas spécifier la feuille lors du code, mais de l'entrer en paramètre. De plus, je ne renommerai pas mes feuilles, donc il me faut utiliser le nom donné par excel "Feuil1", "Feuil2" etc

    Merci d'avance,
    Bonne journée

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Ch0ubida, bonjour le forum

    Utilise le nom de l'onglet entre guillemets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call GenererMatin("Feuil1")
    Call GenererMatin("toto")

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 21
    Par défaut
    J'ai essayé avec des guillemets mais ça ne marche pas...
    Dois-je mettre entre " ... " le nom utilisé par Excel où le nom que j'ai donné à la feuille lorsque je la renomme ?

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour Ch0ubida, bonjour le forum

    Pour copier une feuille modèle vers une nouvelle feuille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub Test()
     
    Call DeclarationPetitDejeuner
     
    'Supposons que Planning est la feuille modèle
    Set ws = Sheets.Add(After:=Sheets("Planning"))
     
    Sheets("Planning").Cells.Copy ws.Cells(1, 1)
     
    MsgBox ws.Name
     
    Call GenererMatin(ws)
     
    End Sub

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 21
    Par défaut
    J'ai joint mon fichier pour une meilleure compréhension.
    Dans le module 5, je teste les deux types de Sub:
    TestGeneral, ou je fais appel à une feuille
    et TestLocal qui fait appel à la sub où la feuille est définie.

    Ces deux subs se trouvent dans le module 1 sous "GénererMatinGeneral" et "GenererMatinCible".
    J'ai pourtant l'impression de correctement faire appel à mes fonctions, mais puisque ça ne marche pas, j'imagine que je le fais mal.

    Merci pour votre aide.

    ProjetRepas.xlsm

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour ch0ubida

    Voici comment créer créer une nouvelle feuille et y afficher le petit-déjeûner.

    Pour faire simple, ajoute une feuille et nomme-la PREFS
    La feuille PREFS ne servira qu'à conserver en A1 le nom de la dernière feuille créée par la routine CreerFeuille (Voir ci-dessous)

    Pour qu'il n'y ait pas deux routines du même nom, supprime ta routine GenererMatinGeneral ou renomme-la.

    Copie le code ci-dessous dans un module.
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
     
    Sub Test
     Call GenererMatinGeneral
    End Sub
     
    Public Sub GenererMatinGeneral()
     
        Dim Calorie As Double
        Dim compteur As Double 'Comparateur de calories
        Dim i As Integer
        Dim prefs As Worksheet
        Dim Feuille  As String
     
        Call InitialisationPlanning
     
        Call CreerFeuille
     
        Set prefs = ThisWorkbook.Worksheets("Prefs")
     
        Feuille = prefs.Cells(1, 1)
     
        CalorieJour = 2000
     
        Calorie = CalorieJour * 0.3  '30% des calories sont réservées au petit déjeuner, c'est la quantité max à ne pas dépasser
     
        m = NombreAleatoire(1, 26)
     
    'temporaire
        Dim Masse(6) As Double
     
        For i = 1 To 6
             With TabPetitDej(m, i)
                     Masse(i) = .Masse * 1.05    'On modifie la masse en lui appliquant un facteur multiplicateur inférieur à 1
             End With
        Next
    'Temporaire fin    
     
     
     Dim CellNomGeneral As Range, CellNom As Range, CellMasse As Range, CellCalorie As Range
        Set CellNomGeneral = Sheets(Feuille).Range("B5")
        Set CellNom = Sheets(Feuille).Range("D6")
       Set CellMasse = Sheets(Feuille).Range("E6")
       Set CellCalorie = Sheets(Feuille).Range("F6")
     
       With TabPetitDej(m, 7)
        CellNomGeneral.Value = .Nom
       End With
     
        For i = 1 To 6
            Dim j As Integer
            j = i - 1
            With TabPetitDej(m, i)
     
               CellNom.Offset(j, 0).Value = .Nom
                CellMasse.Offset(j, 0).Value = Masse(i)
                CellCalorie.Offset(j, 0).Value = .Calorie * Masse(i) / 100
            End With
        Next
     
    End Sub
     
    Public Sub InitialisationPlanning()
     
    'Calcul des besoins nutritionnels de l'utilisateur
    Call CalculCaloriesParJour
     
    'Mise en mémoire des menus
    Call DeclarationPetitDejeuner
    Call DeclarationEntree
    Call DeclarationPlatPrincipal
    Call DeclarationDessert
     
    End Sub
     
    Public Sub CreerFeuille()
     'Création d'une feuille
     
     Dim prefs As Worksheet
     Dim ws As Object
     
    'Supposons que Planning est la feuille modèle
    Set ws = Sheets.Add(After:=Sheets("Planning"))
     
    ThisWorkbook.Sheets("Planning").Cells.Copy ws.Cells(1, 1)
     
    'Sauvegarde le nom de la feuille créée 
    Set prefs = ThisWorkbook.Worksheets("Prefs")
    prefs.Cells(1, 1) = ws.Name
     
    End Sub

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 21
    Par défaut
    J'ai trouvé une méthode pour générer des feuilles, ce n'est pas la tienne et j'ai un peu triché en utilisant le ActiveSheet.

    En réalité, je n'ai pas tout compris à ta méthode pour être honnête. Mais en gros, tu as mis les méthodes dans GenererMatin, et j'ai fait l'inverse: j'ai tout mis dans CreationFeuilles.
    Je ne sais pas si c'est la marche à suivre ou non, ou même si ma méthode est correcte.
    En tout cas, quand j'y fais appel pour un certain nombre de feuilles, elle marche. C'est quand j'utilise l'userform que ça bloque...
    Le fait est que lorsque je lance mon programme, une fois que le userform est rempli et que je le valide, ça tourne dans le vide... Je ne sais pas si Excel calcule les données ou si ça ne fait absolument rien!
    J'ai pourtant ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = True
    dans CreationFeuilles situé dans le module 6.

    Aurais-tu une idée ?

    Je désespère, ce fichu projet me donne bien du fil à retordre !!

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/08/2010, 20h48
  2. Passer une variable à une procédure appelé par onaction
    Par patbou dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/10/2008, 15h42
  3. Réponses: 1
    Dernier message: 28/12/2007, 19h07
  4. [Débutant_SQL-server] appeler une procédure à une date
    Par Zefree dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 24/07/2006, 15h52
  5. [VB6]Passer une variable à une procédure évennementielle
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 13/12/2005, 20h19

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