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 :

Impossible de lire la propriété countifs de la classe WorksheetFunction


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut Impossible de lire la propriété countifs de la classe WorksheetFunction
    Bonjour,

    Je cherche à faire tourner ma macro mais j'ai une erreur qui me dit :
    impossible de lire la propriété countifs de la classe WorksheetFunction.
    Pourtant, lorsque j'utilise la fonction que j'ai crée sur excel, les résultats sont bons. C'est quand j'exécute la macro que cela pose problème.

    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
    Dim Localvac As Long
    Dim Localnonvac As Long
    Dim Reponse As Integer
    Message = "Cellules vides"
     
    If ville = "Marzy" Then
    	Localvac = WorksheetFunction.CountIfs(plage1, "oui", plage2, "Marzy")
    	Localnonvac = WorksheetFunction.CountIfs(plage1, "non", plage2, "Marzy")
    Else
    	Localvac = Application.WorksheetFunction.CountIfs(plage1, "oui", plage2, "Nevers")
    	Localnonvac = Application.WorksheetFunction.CountIfs(plage1, "non", plage2, "Nevers")
    End If
     
    On Error GoTo Erreur
     
    PourcLocVac = Localvac / (Localvac + Localnonvac)
     
    Exit Function
     
     
    Erreur:
     
    	MsgBox (Message)
    	If Reponse = vbOKOnly Then 'Car VbOKOnly a la valeur d'un entier, du coup il est integer
    		PourcLocVac = 0
    	End If
    End Function
     
     
     
    Sub Poucentage()
     
    Dim plage1 As Range
    Dim plage2 As Range
     
    Sheets("Feuil1").Select
    Set plage1 = Range("b2", Range("b1048576").End(xlUp))
    Set plage2 = Range("c2", Range("b1048576").End(xlUp))
     
    Sheets("Feuil2").Select
    Range("D2").Value = "Marzy"
    Range("D3").Value = PourcLocVac(plage1, plage2, "Marzy")
    Range("E2").Value = "Nevers"
    Range("E3").Value = PourcLocVac(plage1, plage2, "Nevers")
     
    End Sub
    Aidez moi svp

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Quelles sont les plages "Plage1" et "Plage2"?

    Cdlt

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Quelles sont les plages "Plage1" et "Plage2"?

    Cdlt
    Plage2 est une plage de oui et non (colonne vacance) et plage2 une plage avec 2 ville paris et lyon.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Quelles sont les plages "Plage1" et "Plage2"?

    Cdlt
    Et j'essaye de voir s'il est possible de faire un code court sans les if si je veux rajouter plus de villes. Vous avez une idée ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Dans le code que vous avez déposé, on ne voit pas le nom de votre fonction, est-il de cette forme?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function PourcLocVac(plage1 As Range, plage2 As Range, ville As Range)
    parce que j'"ai fait des essais et cela fonctionne bien.

  6. #6
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Je viens de voir votre avant dernière réponse
    Plage2 est une plage de oui et non (colonne vacance) et plage2 une plage avec 2 ville paris et lyon.
    Hormis que vous avez répété 2 fois plage2 (mais c'est une erreur de saisie), si vous recherchez "Paris" ou" Lyon" et que dans votre code vous "cherchez "Marzy" ou "Nevers"", c'est sûr que vous n'aurez pas beaucoup de résultats.

  7. #7
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Et j'essaye de voir s'il est possible de faire un code court sans les if si je veux rajouter plus de villes. Vous avez une idée ?
    Oui, En utilisant la variable "Ville" à la place des noms réels

    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
    Function PourcLocVac(plage1 As Range, plage2 As Range, ville As Range)
        Dim Localvac As Long
        Dim Localnonvac As Long
        Dim Reponse As Integer
        Message = "Cellules vides"
     
        Localvac = WorksheetFunction.CountIfs(plage1, "oui", plage2, ville)
        Localnonvac = WorksheetFunction.CountIfs(plage1, "non", plage2, ville)
     
        On Error GoTo Erreur
        PourcLocVac = Localvac / (Localvac + Localnonvac)
        Exit Function
     
    Erreur:
        MsgBox (Message)
        If Reponse = vbOKOnly Then 'Car VbOKOnly a la valeur d'un entier, du coup il est integer
            PourcLocVac = 0
        End If
    End Function

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Je ne vois pas où j'ai répété plage2. Puis pour ville j'y ai déjà pensé mais je ne vois pas comment cela m'aidera à appeler une ville en particulier.

  9. #9
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Je ne vois pas où j'ai répété plage2
    ici , dans le post 3
    [QUOTE]Plage2 est une plage de oui et non (colonne vacance) et plage2 une plage avec 2 ville paris et lyon. [/QUOTE

    ************************************************************************

    Puis pour ville j'y ai déjà pensé mais je ne vois pas comment cela m'aidera à appeler une ville en particulier.
    sinon utilisez "Select case"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select Case ville
        Case Is = "Paris"
            Localvac = WorksheetFunction.CountIfs(plage1, "oui", plage2, "Paris")
            Localnonvac = WorksheetFunction.CountIfs(plage1, "non", plage2, "Paris")
        Case Is = "Nevers"
            Localvac = WorksheetFunction.CountIfs(plage1, "oui", plage2, "Nevers")
            Localnonvac = WorksheetFunction.CountIfs(plage1, "non", plage2, "Nevers")
        'Etc......
    End Select

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Le countifs ne marche toujours pas. Mais merci.

  11. #11
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Pouvez-vous déposé un extrait de votre fichier (sans données confidentielles) et avec le code de la fonction?

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Pouvez-vous déposé un extrait de votre fichier (sans données confidentielles) et avec le code de la fonction?
    Le fichier vite fait est comme ceci (pour simplifier)
    Loca : 1 - 2 - 3 - 4 - 5
    Vacant : oui - oui - non - oui - non
    Ville : Nevers - Paris - Paris - Paris - Nevers

    L'exemple c'est pour simplifier. Du coup je cherche à trouver le % de local vacant par ville

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Pouvez-vous déposé un extrait de votre fichier (sans données confidentielles) et avec le code de la fonction?
    Mon souci c'est sur la fonction countifs qui ne marche pas dans un sub, alors que countif marche très bien

  14. #14
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Je ne comprends ou est votre problème, voici un exemple avec vos données
    Pièce jointe 574790

    le code utilisé (déjà fourni)
    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
    Function PourcLocVac(plage1 As Range, plage2 As Range, ville As Range)
        Dim Localvac As Long
        Dim Localnonvac As Long
        Dim Reponse As Integer
        Message = "Cellules vides"
     
        Localvac = WorksheetFunction.CountIfs(plage1, "oui", plage2, ville)
        Localnonvac = WorksheetFunction.CountIfs(plage1, "non", plage2, ville)
     
        On Error GoTo Erreur
        PourcLocVac = Localvac / (Localvac + Localnonvac)
        Exit Function
     
    Erreur:
        MsgBox (Message)
        If Reponse = vbOKOnly Then 'Car VbOKOnly a la valeur d'un entier, du coup il est integer
            PourcLocVac = 0
        End If
    End Function
    le résultat
    Pièce jointe 574791

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Je l'ai dit plus haut : la fonction marche mais quand je l'appelle dans une macro ça pose problème. Je l'ai écrit et ça marche très bien la fonction. Cependant la macro ne marche pas.

  16. #16
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Je l'ai dit plus haut : la fonction marche mais quand je l'appelle dans une macro ça pose problème. Je l'ai écrit et ça marche très bien la fonction. Cependant la macro ne marche pas.
    Eh bien, montrez-moi cette macro, sinon comment voulez-vous que je trouve le problème!!!

  17. #17
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Elle était juste au dessus la macro :

    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 Poucentage()
     
    Dim plage1 As Range
    Dim plage2 As Range
     
    Sheets("Feuil1").Select
    Set plage1 = Range("b2", Range("b1048576").End(xlUp))
    Set plage2 = Range("c2", Range("b1048576").End(xlUp))
     
    Sheets("Feuil2").Select
    Range("D2").Value = "Marzy"
    Range("D3").Value = PourcLocVac(plage1, plage2, "Marzy")
    Range("E2").Value = "Nevers"
    Range("E3").Value = PourcLocVac(plage1, plage2, "Nevers")
     
    End Sub

  18. #18
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Ok, j'avais pas vu

    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
        Dim plage1 As Range
        Dim plage2 As Range
     
    Sub Poucentage()
        Dim DerLig As Long
        DerLig = Sheets("Feuil1").Range("B" & Rows.Count).End(xlUp).Row
        ActiveWorkbook.Names("Plage1").Delete
        ActiveWorkbook.Names.Add Name:="plage1", RefersToR1C1:="=Feuil1!R2C2:R" & DerLig & "C2"
        ActiveWorkbook.Names("Plage2").Delete
        ActiveWorkbook.Names.Add Name:="plage2", RefersToR1C1:="=Feuil1!R2C3:R" & DerLig & "C3"
        Set plage1 = Sheets("Feuil1").Range("B2:B" & DerLig)
        Set plage2 = Sheets("Feuil1").Range("C2:C" & DerLig)
        Sheets("Feuil2").Range("D3:E3").Value = "=PourcLocVac(plage1,plage2,R2C)"
    End Sub
     
    Function PourcLocVac(plage1 As Range, plage2 As Range, ville As Range)
        Dim Localvac As Long
        Dim Localnonvac As Long
        Dim Reponse As Integer
        Message = "Cellules vides"
     
        Localvac = WorksheetFunction.CountIfs(plage1, "oui", plage2, ville)
        Localnonvac = WorksheetFunction.CountIfs(plage1, "non", plage2, ville)
     
        On Error GoTo Erreur
        PourcLocVac = Localvac / (Localvac + Localnonvac)
        Exit Function
     
    Erreur:
        MsgBox (Message)
        If Reponse = vbOKOnly Then 'Car VbOKOnly a la valeur d'un entier, du coup il est integer
            PourcLocVac = 0
        End If
    End Function

  19. #19
    Futur Membre du Club
    Femme Profil pro
    Data analyst junior
    Inscrit en
    Juin 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data analyst junior

    Informations forums :
    Inscription : Juin 2020
    Messages : 21
    Points : 5
    Points
    5
    Par défaut
    Pouvez vous m'expliquer votre code ? Sachant que je ne veux pas que sur la colonne la fonction qui compte s'arrête à la cellule non vide, je veux qu'elle prenne toute la colonne.

  20. #20
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    pourquoi toute la colonne? jusqu'à la dernière valeur trouvée, n'est-ce pas suffisant?, c'est ce que fait le code.
    Les "plage1" et "plage2" sont créées dans les "zones de noms" et recalculées à chaque fois. Après, il n'y a rien de particulier par rapport à ce que vous aviez fait. Avant de créer les nouvelles plages, les créations des plages précédentes sont supprimées pour permettre la création des nouvelles.

    Exemple avec le fichier joint, les plages 1 et 2 sont déclarées dans la zone de noms, en cliquant sur le bouton, les pourcentages apparaissent dans la feuille 2
    Pièce jointe 574798

Discussions similaires

  1. [VBA-E]Probleme macro VBA excel 2000 2003
    Par skichatchat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2007, 21h16
  2. incompatibilité macros VBA excel 2000 et 2003
    Par hiline6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/04/2007, 12h20
  3. Macro VBA Excel : Comparaison des deux 1ères colonnes de 2 fichiers Excel
    Par techneric dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/01/2007, 10h00
  4. Auto install macro vba excel
    Par zootman dans le forum Installation, Déploiement et Sécurité
    Réponses: 6
    Dernier message: 14/06/2006, 21h30
  5. [VBA-E] macro VBA excel suppression graphiques
    Par totoza dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/05/2006, 08h45

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