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 :

Incrémenter ParamArray dans function par Sub


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Par défaut Incrémenter ParamArray dans function par Sub
    Bonjour Tout le monde

    Je vous expose ma problématique :

    je fais appel à une sub qui me copier une 40aine lignes en dessous celle-ci avec un décalage constant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Rows("77:116").Copy
        Rows("117:117").Insert Shift:=xlDown
        Application.CutCopyMode = False
    Par rapport à ces mêmes lignes, j'ai une fonction personnalisé de type : Function Blabla(X As Range, ParamArray Lgt())
    Le paramArray prend en compte la première ligne soit la ligne 77 (E77:AJ77), j'aurais voulu incrémenté mon ParamArray de tel sorte que Lgt() = E77:AJ77,E118:AJ118 soit un décalage de 41 lignes etc sans avoir à retoucher la formule manuellement... est ce possible ?

    Sachant qui faudrait que j'inclus un compteur du nombre d'utilisation dans ma macro pour définir le nombre de paramArray a rajouter non ?

    Merci pour votre aide dans tous les cas.

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,
    ta question me pose d'autre question.
    ParamArray Lgt() propose a ta méthode un passage de paramètre implicitement optionnel. Blabla range("A1"),"toto","titi",??,??...) comme le montre la déclaration Lgt() est un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i = 0 to Ubound( Lgt)
    next
    maintenant la question est de savoir si tu écrit tes valeur en dure dans l'appel de ta fonction ou si elle sont dynamique.
    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
    sub Test1()
     a=   Blabla( range("A1"),"toto","titi")
    End Sub
     
    sub Test2()
     a=   Blabla( range("A1"),"grgr")
    End Sub
     
    sub Test3()
     a=   Blabla( range("A1"),"Cheval","Autruche","Eléphant")
    End Sub
     
    'ou
    sub Test4()
     a=   Blabla( range("A1"),array("Cheval","Autruche","Eléphant"))
    End Sub
    dans le premier cas le boucle utilisé précédemment reste vaable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i = 0 to Ubound( Lgt)
    next
    dans le 2ime cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i = 0 to Ubound( Lgt)
        for i2= 0 to Ubound( Lgt(i)) 'et là on tien comte du type d'objet (Range) Lgt(i)(i2,1) exemple ([A1])
        next
    next
    je ne te demandes as de comprendre le code qui suis c'est à titre d'exemple!
    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
     
    tx=split("TOTO;TITI;Cheval;Autruche")
    if Highlander(Init, tx,"test", MyRange(L, 1),MyRange(L, 3), MyRange(L, 4), MyRange(L, 5))= True Then Msgbox "Doublon"
     
    Function Highlander(Init As Boolean, ParamArray Plage()) As Boolean
    '..................................................
    'La méthode Highlander, il ne peut en rester qu'un.
    'Retourne True si doublon.
    '..................................................
     
    Static CollectDoublon As Collection
    Dim T As String
    Dim PlageIndex As Long
    Dim myPlage As Range
    Dim Col As Integer
    Dim Tableau
    If Init = False Then
    Init = True
       Set CollectDoublon = Nothing
       Set CollectDoublon = New Collection
    End If
     
     
    T = "T"
    For PlageIndex = 0 To UBound(Plage)
    If TypeName(Plage(PlageIndex)) = "Range" Then
           Set myPlage = Plage(PlageIndex)
     
           For Col = 1 To myPlage.Columns.Count
            T = T & "_" & Trim("" & myPlage(1, Col))
           Next
        Else
            If TypeName(Plage(PlageIndex)) = "Variant()" Then
               Tableau = Plage(PlageIndex)
            Else
                If TypeName(Plage(PlageIndex)) Like "*()" Then
                    Tableau = Plage(PlageIndex)
                Else
                    Tableau = Split(Plage(PlageIndex) & ";", ";")
                End If
            End If
             For Col = 0 To UBound(Tableau)
               If Trim("" & Tableau(Col)) <> "" Then T = T & "_" & Trim("" & Tableau(Col))
             Next
        End If
    Next
    On Error Resume Next
    CollectDoublon.Add T, T
    If Err <> 0 Then Highlander = True
    On Error GoTo 0
    End Function
    http://www.developpez.net/forums/d13...m/#post7484874
    Dernière modification par Invité ; 10/07/2015 à 10h37.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Par défaut
    Merci rdurupt pour ta réponse.

    Je vais essayer de répondre à ton autre question du coup

    Effectivement ma fonction est rentré manuellement dans un premier temps, c'est à dire :

    Etage correspond à une range
    Et ParramArray correspond aussi à une range Logement qui suivant mon tableau aurait besoin d'être incrémenter.
    Du coup, je repensais à cela, peut être pourrais-je le virer des arguments de ma formule pour être inscrit en dur

    soit
    Lgt = range("E77:AJ77")
    Lgt(i) = lgt(i) + 41

    Voici ma fonction initial :

    Qui en fonction d'un certain nombre de critère, additionne les quantités lorsqu'il y a concordance de valeur dans les ranges de logements et Etage

    Logement peut faire appel à plusieurs tableaux que je recopie grace à une simple sub copier-coller en dessous du tableau initiale mis les uns à la suite des autres mais m'oblige à reprendre manuellement ma fonction en fonction du nombre de tableau que j’insère.

    mon souhait c'est que l'en fonction de cette sub, il incrémente mon Lgt() automatiquement sans écraser la range "Etage"

    Si tu veux, je peux t'envoyer mon tableau par mail si tu veux bien me la passer

    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
    Function Nombre_APS_Cumule_EC(Etage As Range, ParamArray Lgt() As Variant)
     Dim i&
     Dim Logement As Range
     Dim Et As Range
     Dim Total As Range
     Dim debitsup As Range
     Dim EC As Single
     Dim x As Range
     
    Set Total = Cells(Application.Caller.Row, 2)
    Set x = Cells(Application.Caller.Row, 4)
    Set debitsup = Application.Caller.Offset(-1, 0)
     
     
    If IsEmpty(x) = True Or WorksheetFunction.CountA(Etage) = 0 And Total <> "TOTAL" Then
    Nombre_APS_Cumule_EC = 0
     
    ElseIf IsNumeric(debitsup) = False Or Total.Offset(-1, 0) = "TOTAL" Then
    For i = 0 To UBound(Lgt)
             For Each Logement In Lgt(i).Cells
            For Each Et In Etage
                  If Logement = Et Then
                  EC = EC + Logement.Offset(32, 0).Value
                  End If
                Next Et
            Next Logement
       Next i
     Nombre_APS_Cumule_EC = EC
     
     ElseIf Total = "TOTAL" Then
     Nombre_APS_Cumule_EC = debitsup
     
     Else
     For i = 0 To UBound(Lgt)
             For Each Logement In Lgt(i).Cells
            For Each Et In Etage
                  If Logement = Et Then
                  EC = EC + Logement.Offset(32, 0).Value
                  End If
                Next Et
            Next Logement
       Next i
    Nombre_APS_Cumule_EC = EC + debitsup
       End If
     
    End Function

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pour ton problème je ne suis pas sur d'être le mieux placé pour t'aider, je n'y comprends rien!

    mais vraiment rien, je ne suis même pas capable de formuler une question!
    Une question pas formulée c'est pas de réponse du tout!
    Dernière modification par Invité ; 10/07/2015 à 13h21.

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Par défaut
    Ah mince si un expert ne comprends pas ça va pas le faire ...

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut

    Humm, pourquoi utiliser un paramArray ?
    Pourquoi ne pas utiliser tout simplement un range puisque les valeurs saisies dans la paramarray font (si j'ai bien compris) référence à une plage de cellule?


    Plutôt que de demander à résoudre ton problème de code, ne voudrais tu pas remonter d'un cran et nous expliquer ce que tu souhaites faire avec ce code, il y a peut-être une façon plus simple d'y arriver.


    ++
    Qwaz

    PS: Pense à utiliser le bouton code "#" pour mettre ton code dans les balises idoines.

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. [AC-2013] remplacer le nom d'un formulaire par une variable dans un Public Sub
    Par GuyDuLac dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/10/2014, 17h23
  2. Réponses: 9
    Dernier message: 09/05/2013, 17h27
  3. Réponses: 8
    Dernier message: 05/12/2008, 11h43
  4. [VB.NET] Ouvrir fichier dans appli par double-clic dessus
    Par vynce dans le forum Windows Forms
    Réponses: 4
    Dernier message: 29/03/2005, 16h43
  5. Réponses: 1
    Dernier message: 04/06/2003, 11h48

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