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 :

comment faire un offset dans une fonction ?


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut comment faire un offset dans une fonction ?
    Bonjour;

    J'ai une function (code plus bas), qui extrait les ";" entre deux valeur dans une cellule excel.
    Cette function travail a partir de plages nommées et fait la moyenne des valeurs (dans une autre colonne) en splitant les ";".
    Toute fois, il faut que la/les plages nommées soit dans la colonne contenant les valeurs.
    En considérant l'exemple suivant, plages nommées en colonne A et valeurs en colonne E, ne serait-il pas possible de créer un offset dans la function?
    du style:
    dim plage as name
    for each plage in ActiveWorkBook
    plage.offset(plage,4)

    Voilà c'est une idée mais ça me marche pas et je suis débutant en VBA.
    Si quelqu'un à une idée!

    Merci par avance.


    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
    Function MoyenneChamp(champ As Range) As Double
      Dim temp As Double, nb As Integer
      temp = 0
      nb = 0
      For Each c In champ
        If c <> Empty Then
          If IsNumeric(Left(c.Value, 1)) Then
            a = Split(c.Value, ";")
            For i = LBound(a) To UBound(a)
              temp = temp + Val(a(i))
              nb = nb + 1
            Next i
          End If
        End If
        MoyenneChamp = temp / nb
      Next c
    End Function
    PS: je peux joindre éventuellement un exemple pour plus de clarté.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Sans filet, si ta plage comporte plusieurs lignes, je ne vois pas comment tu peux faire un offset. Pas vérifié
    Mais si ta plage ne concerne qu'une cellule, pas de problème pour avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim plage as name
    for each plage in ActiveWorkBook
         Range(plage.Address).offset(NbLigne, 4) = .....
    Maintenant, si tu dois prendre le nombre de lignes dans une plage comportant plusieurs cellules pour l'avoir dans ton offset, tu dois extraire les première et dernière ligne de cette plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adres = split(Plage.address,":") ' donne le tableau des deux bornes de la plage
    Il te reste à extraire le N° de ligne de chacune d'elles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NoLigne1 = Range(Adres(0)).row
    NoLigne2 = Range(Adres(1)).row
    TonOffset = NoLigne2 - NoLigne1
    Mais arrivé là, je ne crois pas que ce soit ce que tu cherches
    A+

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci de m'avoir répondu.

    En effet, mes plages contient plusieurs lignes. En plus mes plages sont dynamique mais adjacentes.

    Me serait-il pas possible de selectionner une plage nommées (en tant que Range) et décaler depuis cette la selection?
    Je pense que c'est faisable!

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonsoir,
    Dans Excel, une plage nommée n'est pas dynamique, il faut que tu change ses données manuellement. (du moins à ma connaissance)

    A+

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    si , si, on peut rendre une plage nomée dynamique, avec une formule décaler. et je pense meme qu'on peut décaler sur une plage entiere. mais primo, là j'ai plus le temps, secondo, je parle par rapport a excel, et retranscrire sur vba ne m'a pas l'air évident. je regarderai ce soir

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Si c'est faisable. Un exemple de fourmule qui fait une plage nommée dynamique dans un de mes classeur.
    J'en n'ais une 100 eme comme ça dans le même classeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DECALER($A$1;EQUIV("truc";$A$1:$A$9998;0)-1;0;NB.SI($A$1:$A$9998;"truc");1)

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Un exemple sans WorksheetFunction
    Dans ce code, je nomme une plage de la colonne 2 puis lis la colonne 1 de cette plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Decaler()
    Dim FL1 As Worksheet
    Set FL1 = Worksheets("feuil1")
        ActiveWorkbook.Names.Add Name:="PlageAdresse", RefersToR1C1:= _
            "=Feuil1!R2C2:R13C2"
        Set Plage = Range("PlageAdresse").Offset(0, -1)
        For Each Cell In Plage
            MsgBox Cell
        Next
    End
    Tu dis
    A+

Discussions similaires

  1. Comment faire un EXEC dans une fonction
    Par baime dans le forum Développement
    Réponses: 10
    Dernier message: 28/05/2014, 14h04
  2. [Tableaux] Comment faire un tableau dans une fonction?
    Par Alexandrebox dans le forum Langage
    Réponses: 6
    Dernier message: 06/10/2008, 00h12
  3. Comment faire 2 sessions dans une application
    Par ZiedCSS dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/04/2007, 14h36
  4. Réponses: 1
    Dernier message: 28/03/2007, 12h23
  5. [VBA-E]Comment faire pour écrire dans une page excel existante ?
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2006, 13h54

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