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 :

Fct : Range accès à une cellule par son "index" [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut Fct : Range accès à une cellule par son "index"
    Bonjour à tous,

    Voila je cherche à faire quelque chose de relativement simple je pense. Seulement n'ayant aucune notion en VBA, j'ai du mal à faire proprement ce que je veux.

    Je dis proprement car j'ai réussi à faire ce que je voulais ... mais pas élégamment ... D'où mon message.

    J'ai deux variables RANGE ressources et durees
    Je parcours ressources grâce à une boucle For Each ... Next
    A chaque itération j'ai un compteur qui me tient informé de combien d'itération j'ai fait : compteur

    Ma question est la suivante :
    Comment, à un instant t, accéder directement à la cellule compteur de ma variable durees ? (dans le but ensuite de récupérer la valeur de cette cellule).

    Comme parfois un bout de code vaut mieux qu'un long discours, en gros voila ce que j'ai mais que je voudrais plus élégant :

    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
     
    Function CalculTempsRessource(CodeReference As Integer, CodeRessource As Range, Duree As Range) As Variant
        ' On pourrait nettement mieux faire
        ' mais je ne sais pas comment faire
        ' pour accéder directement à un élement
        ' de Range
        '
        ' Je continue à chercher !
        Dim i As Integer
        Dim temps() As Double
        ReDim temps(0 To Duree.Count - 1)
        CalculTempsRessource = 0
        i = 0
        For Each Cell In Duree
            temps(i) = Cell.Value
            i = i + 1
        Next Cell
        i = 0
        For Each Code In CodeRessource
            If Code.Value = CodeReference Then
                CalculTempsRessource = CalculTempsRessource + temps(i)
            End If
            i = i + 1
        Next Code
    End Function
    En gros j'aimerais ne pas avoir à construire ce premier tableau ...


    Merci d'avance à quiconque m'aidera !
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

  2. #2
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Si tu as un numéro de colonne et un numéro de ligne tu peux accéder à ta cellule comme ça :

    Un exemple =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Macellule as range,Lig as double, Col as integer
    Lig = 1
    Col = 1
    Set Macellule = Cells(Lig,Col)

  3. #3
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Bonjour,

    Malheureusement non je n'ai pas de numéro de colonne et de ligne.

    Un exemple d'appel à cette fonction est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =CalculTempsRessource(A4;D2:D45;B2:B45)
    A la rigueur, est-ce que quelqu'un serait capable de me dire quels fonctions sont appelées dans l'utilisation de For Each ?

    Merci quand même d'avoir essayé !
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Ce n'est pas la fonction SOMME.SI par hasard?

    Quand même, j'ai regroupé tes 2 boucles (en ayant supposé que les 2 plages ont la même taille)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function CalculTempsRessource(ByVal CodeReference As Integer, CodeRessource As Range, Duree As Range)
    Dim Cel As Range
    Dim coldif As Integer, ligdif As Integer
     
    coldif = Duree.Cells(1, 1).Column - CodeRessource.Cells(1, 1).Column
    ligdif = Duree.Cells(1, 1).Row - CodeRessource.Cells(1, 1).Row
     
    For Each Cel In CodeRessource
        If Cel.Value = CodeReference Then
            CalculTempsRessource = CalculTempsRessource + Cel.Offset(ligdif, coldif).Value
        End If
    Next Cel
    End Function
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Bonjour,

    Si effectivement c'était exactement cette fonction que je cherchais (SOMME.SI) ... Mais je ne la connaissais pas ...
    Merci pour l'info,


    Par contre pour des raisons plus personnelles, si quelqu'un à la réponse à ma question initiale je suis toujours preneur


    Merci
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Le bout de code, ne répondait pas à la question?
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Si tu as une plage continue, tu peux utiliser effectivement l’index de la collection de cellules que représente ta plage, mais il faut bien tout border car ce n’est pas sans danger.

    A partir du moment où tu précises ta plage, le système de référence est identique à une feuille de base => Row,Colonne.
    L’indexation de la collection de ton Range/Plage se fait dans l’ordre de base de gauche à droite, puis ligne suivante etc…

    Cf code ci-dessous et snapshot.
    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
    Sub Indexation()
    Dim objcible As Range
     
    Set objcible = [B5:E19]
    Call toto(objcible)
     
    End Sub
     
    Sub toto(objcible As Range)
    Dim I As Byte
     
    For I = 7 To 14
    objcible.Item(I).Interior.ColorIndex = 6
    Next I
    End Sub

    Pas sans danger car : En fait tu établis ta cellule d’origine en haut à gauche de ta plage, mais rien ne t’empêche de faire objcible.Item(84).Interior.ColorIndex = 3… la logique est là, le but recherché pas forcément, tu te trouves alors en E23 soit résultat = 76 / objcible.columns.count = 19 lignes + bas que mon origine (si résultat non entier => int( résultat )+1).
    L'emploi d'un : If objcible.Areas.Count <> 1 …. Peut s’avérer utile.

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  8. #8
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Bonsoir,

    Citation Envoyé par mercatog Voir le message
    Le bout de code, ne répondait pas à la question?
    Pour être franc je ne l'ai pas encore testé, mais je comprends sa logique. Effectivement je pense que ça marcherait, mais cela ne répond pas vraiment à la question en soit (bien que ta solution fonctionne ... mais là encore c'est une sorte de ruse comme je l'avais fait en créant un tableau ... plus jolie l tienne peut-être).
    Quoiqu'il en soit merci pour ton intervention

    @Ormonth > Merci pour ta réponse, c'est effectivement ce que je cherchais. Après ... il faut évidemment se méfier des données transmises.


    Merci pour vos interventions
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélection d'une cellule par son adresse
    Par Sherman750 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/12/2014, 21h40
  2. [XL-2007] Trouver une cellule par son nom
    Par jmh51 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/08/2013, 12h53
  3. Réponses: 3
    Dernier message: 08/09/2008, 21h20
  4. [POI] Appeler une cellule par son nom
    Par Galak extra dans le forum Documents
    Réponses: 9
    Dernier message: 17/06/2008, 14h33

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