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 :

Redécoupage en sous-fonction / Problème de type de variable


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Redécoupage en sous-fonction / Problème de type de variable
    Bonjour à tous,

    Pour traiter un "gros" tableau de données diverses et varier j'ai besoin de rassembler des coupes de données (Nom,ratio) dans un tableau d'une dimension.

    Pour ce faire, j'ai crée un type de variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Type CompteurRatio
        Nom_C As String
        Ratio_C As Single
    End Type
     
    Private ListCompteurRatio() As CompteurRatio
    Puis j'ai ensuite créer une fonction FormuleElec1 qui fonctionne et qui me renvoie ce tableau d'une dimension complété (sans doublon). Elle passe en revu une colonne et selon que celle-ci et vide ou non elle remplit les couples et gère qu'elle problème de doublon sur Nom_C en additionnant les valeurs des Ratio_C. Elle me permet de renvoyer dans la feuille "SynthèseCptEnergieS" une formule de calcul en STring.

    Pour faire évoluer cette fonction j'ai besoin d'introduire des conditions cad de tester pour chaque cellule une condition supplémentaire dans une autre colonne (qui n'est pas dans le fichier Excel en Exemple). Il y a une 20 aines de conditions différentes à tester avec "case if". Je souhaite donc créer une sous fonction ListeConsoElec dans cette fonction FormuleElec2 afin de pouvoir ensuite mettre en place cette condition supplémentaire. Pour faire la comparaison j'ai ajouté une cellule dans la feuille "SynthèseCptEnergieS" également.

    Problème, je n'arrive pas gérer la sous-fonction, il y a des conflits de Type (sur le type que j'ai créé) que je n'arrive pas à résoudre et que avant tout chose je ne comprends pas... En fait il ne reconnait pas "ListCompteurRatio" dans la fonction principale quand je l'appelle dans la sous-fonction. il est écrit "Type d'argument Byref incompatible". Je dois commettre une erreur de définition de variable et je ne la comprends pas...

    Tout aide est la bienvenue. Merci d'avance aux personnes qui prendront le temps de s'y pencher.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il serait intéressant que tu affiches le code de la procédure en indiquant le n° de la ligne où le message d'erreur apparaît.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour Philippe,

    Le code est assez long, pour cette raison que j'ai mis le fichier Excel en pièce jointe.

    FormuleElec1 est une fonction et marche, aucun problème. Je souhaite crée une sous-fonction qui reprend une bonne partie du code à l'intérieur de FormuleElec1 afin de pouvoir rajouter des conditions sur une boucle sans avoir à tout réécrire. Le problème c'est que je dois me balader une variable d'un type que j'ai crée et je ne le gère pas...

    Ma sous-fonction s’appelle ListeConsoElec et elle est appelé dans la fonction FormuleElec2.

    Pour rappel le type que j'ai crée est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Type CompteurRatio
        Nom_C As String
        Ratio_C As Single
    End Type
     
    Private ListCompteurRatio() As CompteurRatio
    La fonction suivant ne marche pas, le message d'erreur apparait dès le première appelle de la fonction ListeConsoElec. Le problème identifié est clairement du à ListCompteurRatio qui est un tableau (1 colonne, N lignes) qui se remplit de couples (Nom, Ratio) pour chaque ligne. Pour chaque C, ListCompteurRatio est susceptible de gagner une ligne. En tout cas c'est l'idée...

    A la suite le code la fonction principale et de la sous-fonction, c'est long j'ai prévenu...:

    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
    Public Function FormuleElec2(CelluleRef As Range)
     
    Dim PlageRecherche As Range
    Dim C As Range
    Dim k As Integer
    Dim LigneCode As String
    Dim Lettre As String
    Dim N As Integer
    Dim A As String
    Dim B As Single
     
     
    Lettre = LettreColonne(CelluleRef)
    ChargementVariables
     
    k = 1
    N = 1
     
    ReDim Preserve ListCompteurRatio(0)
     
     
    With Worksheets("Valeur")
        Set PlageRecherche = .Range(.Range(Lettre & NL_valeur), .Range(Lettre & "65536").End(xlUp))
        For Each C In PlageRecherche
     
            N = ListeConsoElec(C, ListCompteurRatio)(1)
            A = ListeConsoElec(C, ListCompteurRatio)(2)
            B = ListeConsoElec(C, ListCompteurRatio)(3)
     
            ListCompteurRatio(N).Nom_C = A
            ListCompteurRatio(N).Ratio_C = B
        Next C
    End With
     
    For k = LBound(ListCompteurRatio) To UBound(ListCompteurRatio)
        LigneCode = LigneCode & " + " & ListCompteurRatio(k).Ratio_C & " x " & ListCompteurRatio(k).Nom_C
    Next k
     
    FormuleElec2 = LigneCode
    End Function
    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
    Public Function ListeConsoElec(C As Range, ListCompteurRatio As CompteurRatio)
     
    Dim A(3)
    Dim N As Single
    Dim NL_ListCompteurRatio As Integer
    Dim k As Integer
    Dim TestExistence As Boolean
     
    k = 1
    N = 0
    TestExistence = False
     
    With Worksheets("Valeur")
        If Not IsEmpty(C) Then
            'Initialisation du tableau ListCompteurRatio avec la première valeur
            If N = 0 Then
                N = N + 1
                ReDim Preserve ListCompteurRatio(N)
                ListCompteurRatio(N).Ratio_C = .Cells(C.Row, C.Column + 1)
     
                If .Cells(C.Row, C.Column + 2) = "" Then
                    ListCompteurRatio(N).Nom_C = "" & .Cells(C.Row, C.Column + 5) & "/" & .Cells(C.Row, C.Column + 6) & "/" & .Cells(C.Row, C.Column + 3) & ""
                Else
                    ListCompteurRatio(N).Nom_C = .Cells(C.Row, C.Column + 2)
                End If
            Else
            'Remplissage du tableau ListCompteurRatio
                For k = LBound(ListCompteurRatio) To UBound(ListCompteurRatio)
                    'S'il n'y a pas de compteur indiv. avec les tableaux des compteurs électriques
                    If .Cells(C.Row, C.Column + 2) = "" Then
                        If "" & .Cells(C.Row, C.Column + 5) & "/" & .Cells(C.Row, C.Column + 6) & "/" & .Cells(C.Row, C.Column + 3) & "" = ListCompteurRatio(k).Nom_C Then
                            TestExistence = True
                            NL_ListCompteurRatio = k
                            Exit For:
                        End If
                    'S'il y a un compteur indiv.
                    Else
                        If .Cells(C.Row, C.Column + 2) = ListCompteurRatio(k).Nom_C Then
                            TestExistence = True
                            NL_ListCompteurRatio = k
                            Exit For:
                        End If
                    End If
                Next k
     
                If TestExistence = True Then
                     ListCompteurRatio(NL_ListCompteurRatio).Ratio_C = ListCompteurRatio(NL_ListCompteurRatio).Ratio_C + .Cells(C.Row, C.Column + 1)
                Else
                    N = N + 1
                    ReDim Preserve ListCompteurRatio(N)
                    ListCompteurRatio(N).Ratio_C = .Cells(C.Row, C.Column + 1)
                    If .Cells(C.Row, C.Column + 2) = "" Then
                        ListCompteurRatio(N).Nom_C = "" & .Cells(C.Row, C.Column + 5) & "/" & .Cells(C.Row, C.Column + 6) & "/" & .Cells(C.Row, C.Column + 3) & ""
                    Else
                        ListCompteurRatio(N).Nom_C = .Cells(C.Row, C.Column + 2)
                    End If
                End If
                TestExistence = False
            End If
        End If
    End With
     
    A(1) = N
    A(2) = ListCompteurRatio(N).Nom_C
    A(3) = ListCompteurRatio(N).Ratio_C
    ListeConsoElec = A
    End Function

Discussions similaires

  1. Une même fonction pour plusieurs types de variables
    Par darkwall_37 dans le forum Débuter
    Réponses: 1
    Dernier message: 21/04/2010, 18h06
  2. Réponses: 2
    Dernier message: 22/12/2009, 22h29
  3. Problème de type de variable avec la fonction find
    Par Sarune dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/11/2008, 17h06
  4. problème de type de variable
    Par miketidy dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/07/2008, 16h01
  5. problème de type de variables
    Par Jasmine80 dans le forum Langage
    Réponses: 4
    Dernier message: 16/06/2008, 12h40

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