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 :

Stockage de la valeur d'une formule dans une variable [XL-2010]


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
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Par défaut
    Bonjour à tous,

    J'ai un petit problème de syntaxe dans mon code.

    Comme le nom du sujet l'indique, j'aimerais stocker la valeur que renvoie une formule dans une variable VBA.

    La formule a pour but de compter dans la feuille "Sélection globale" le nombre de valeurs distinctes de la variable métier (colonne C).
    A savoir que ce nombre de métiers changent suivant le périmètre sélectionné par l'utilisateur. (La plage peut aussi bien s'étende de C2 à C3 que de C2 à C200.)

    J'ai procédé avec l'enregistreur de macro mais une erreur "incompatibilité de type" intervient. Probablement lié à la déclaration de ma variable.

    Voici le code associé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Dim Nbmetier As Long
     
     
     
        Menu = ActiveSheet.Name
        Nbmetier = 0
     
        Nbmetier = Evaluate("SUM(1/COUNTIF('Sélection globale'!R[-42]C[-1]:R[-40]C[-1],'Sélection globale'!R[-42]C[-1]:R[-40]C[-1]))")
     
             Worksheets("Synthèse Atteinte Norme").Activate
             h.Range("B3").Select
     
             Selection.AutoFill Destination:=Range("B3:B" & Nbmetier)
    Etant débutant en VBA, il existe surement des imperfections dans la syntaxe de mon code.

    Je vous remercie par avance.

    Cordialement

    Pour reformuler, je souhaiterais connaître le nombre de valeurs distinctes d'une variable.

    J'aimerais par la suite stocker ce nombre de valeurs distinctes dans une variable (ici Nbmetiers)

    Cette variable me permettra par la suite d'appliquer un traitement de la cellule B3 à B"NBmetiers" (B8 si le nombre de métiers est de 8)

    Cordialement

  2. #2
    Membre émérite
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Par défaut
    Bonjour,
    j'ai de la difficulté à comprendre.
    Est-ce que si ta_variable= "ABC1234AC214"

    le nombre de valeur distincte serait de 7 ?
    Est-ce que c'est 7 que tu veux récupéré?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Par défaut
    Oui c'est bien 7 que je souhaite stocker dans la variable Nbmetier.

    Cordialement

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je ne comprend pas l'histoire du périmètre qui défini la liste de métiers en colonne C

    voici une idée qui va récupérer la liste sans doublon des métiers en colonne C
    le nombre d'éléments défini en suite la plage de remplissage de la colonne B de ton autre 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub Extracton()
     
    Dim MesMetiers As Object
    Dim Plage As Range
    Dim Tablo
    Dim i As Integer
     
    'la liste des métiers
    Set MesMetiers = CreateObject("Scripting.Dictionary")
     
    With ThisWorkbook.Worksheets("Sélection globale")
        'la plage en colonne C
        Set Plage = Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp))
        Tablo = Plage
     
        ' pour chaque valeur de la colonne C
        For i = LBound(Tablo, 1) To UBound(Tablo, 1)
            On Error Resume Next
            ' on l'ajoute à la liste s'il n'existait pas
            MesMetiers.Add Tablo(i, 1), Tablo(i, 1)
            On Error GoTo 0
        Next i
    End With
     
    ' MesMetiers.Count est donc le nombre de métiers qu'on a trouvé
    ThisWorkbook.Worksheets("Synthèse Atteinte Norme").Range("B3").AutoFill Destination:=Range("B3:B" & MesMetiers.Count)
     
    Set Plage = Nothing
    Set MonDico = Nothing
     
    End Sub

  5. #5
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Tu peux aussi essayer d'utiliser une notation classique (A1) à la place de la notation RC.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nbmetier = Evaluate("SUM(1/COUNTIF('Sélection globale'!D39:G39,'Sélection globale'!D39:G39))")
    Cordialement.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Par défaut
    Bonjour,

    Pour répondre à joe.levrai, en fait, l'utilisateur sélectionne son périmètre d'étude Réseau --> Secteur --> Agence ... qui va filtrer les données d'un autre onglet en fonction du périmètre qu'il a choisi. Cette sélection va se placer dans l'onglet 'Sélection globale'. Ainsi la liste des métiers change suivant le périmètre sélectionné. (Avec ta méthode j'ai une erreur Autofill de la classe Range a echoué)

    gFZT82, J'ai testé en notation classique, j'ai une erreur incompatibilité de type (que j'avais également avant).


    Mon but est en fait d'étendre un traitement de la première ligne (B3 qui est le premier métier de la sélection globale) jusqu’au dernier métier distinct trouvé.

    Par exemple, si il y a 4 métiers distincts dans sélection globale, le premier métier se trouvera à la ligne 3 et je veux étendre mon traitement de B3 à B7 (dernière ligne des métiers)

    Au départ j'avais fait avec un compteur qui marchait bien seulement quand le nombre de métiers était inférieur à deux j'avais l'erreur Autofill)
    C'est possible que je me complique un peu la tache !!

    Cordialement

  7. #7
    Membre émérite
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Par défaut
    Citation Envoyé par Coxtox Voir le message
    Oui c'est bien 7 que je souhaite stocker dans la variable Nbmetier.
    Bonjour

    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
    Sub Nombre_Diff()
     
        Dim Nbmetier As Integer
        ta_variable = "ABC1234AC214"
     
        For i = 1 To Len(ta_variable)
     
            tata = Mid(ta_variable, i, 1)
     
            If InStr(ta_variable, tata) > i - 1 Then
                Nbmetier = Nbmetier + 1
            End If
     
        Next
     
        MsgBox Nbmetier
     
    End Sub

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

Discussions similaires

  1. [Toutes versions] Imbriquer une formule dans une formule à l'aide de l'outil Insertion de fonction
    Par Philippe Tulliez dans le forum Contribuez
    Réponses: 0
    Dernier message: 27/08/2014, 11h21
  2. [XL-2010] Formule : attribuer une formule dans une cellule
    Par popi33370 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/03/2014, 18h06
  3. Réponses: 3
    Dernier message: 06/03/2013, 13h00
  4. Réponses: 3
    Dernier message: 29/01/2008, 12h08
  5. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13

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