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 :

VBA Mise en place et syntaxe de la fonction Countifs


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut VBA Mise en place et syntaxe de la fonction Countifs
    Bonjour,

    Je dispose d'un tableau de données sur une Feuille 1 dont des températures variées réparties sur plusieurs colonnes.
    Je souhaite réaliser un deuxième tableau en Feuille 2, permettant de comptabiliser le nombre de fois ou les températures sont égales à 10 , 11 , 12 etc. à +/- 0.5.
    Le choix de quelle température étudier est laissé à l'utilisateur grâce à une liste déroulante (Temp_1 , Temp_2, ....)

    Pour cela j'utilise la fonction Countifs de la manière suivante:

    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
     
     
    Dim num As Integer
     
        Range("D6").Value = "Colonne choisie"
        Range("D7").Select
        ActiveCell.FormulaR1C1 = "=MATCH(R[-6]C[-3],'Data 1'!R[-6],0)"
        Range("D7").Select
        num = ActiveCell.Value
     
        Dim Temp_regroupe As Double
        Dim ligne_freq As Long
        Dim dern_ligne As Long
        Dim Texces As Double
        Dim Tdefaut As Double
     
     
        ligne_freq = 2  'Le calcul commence à la deuxième ligne de la Feuille
     
        Range("A1").End(xlDown).Select
        dern_ligne = ActiveCell.Row
     
     
     Do While ligne_freq < dern_ligne
     
        Cells(ligne_freq, 2).Select
       Tdefaut = Sheets("Feuille 2").Cells(ligne_freq, 1).Value - 0.5
       Texces = Sheets("Feuille 2").Cells(ligne_freq, 1).Value + 0.5
     
     
     Temp_regroupe = WorksheetFunction.CountIfs(Sheets("Feuille 1").Column(num), "<" & Texces, ">" & Tdefaut)
    Cells("ligne_freq, 2").Value = Temp_regroupe
     
     ligne_freq = ligne_freq + 1
    Loop
    Le problème vient peut-être de la sythaxe Column(). Après avoir effectué différents essais infructueux en changeant () en [], Range, ou autre..., auriez-vous une solution à ce problème?
    Merci!

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    bonjour,

    sans regarder ton code il ne faut pas confondre column et columns

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci pour cette réponse!
    En effet, souhaitant un Range, ce serait plutôt Columns si je comprends bien!
    Même si le problème subsiste encore, au moins une erreur de résolue déjà.

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    countif avec un s?


    Montre nous ton code corrigé et dis nous ce qu'il se passe ( message d'erreur.......)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Voilà le code concernant la partie intéressante du programme

    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
        Dim num As Integer
        Dim Freq_Temp As Double
        Dim ligne_freq As Long
        ligne_freq = 2
        Dim dern_ligne As Long
        Dim Texces As Double
        Dim Tdefaut As Double
     
      'Dans cette case on récupère l'information sur quelle température on souhaite étudier
      'et le numéro de la colonne correspondante dans la Feuille de données 1
     
        Range("D6").Value = "Colonne choisie"
        Range("D7").Select
        ActiveCell.FormulaR1C1 = "=MATCH(R[-6]C[-3],'Data 1'!R[-6],0)"
        num = ActiveCell.Value
     
       'On obtient le numéro de la dernière ligne (correspondant à la température la plus élevée à prendr en compte
        Range("A1").End(xlDown).Select
        dern_ligne = ActiveCell.Row
     
     Do While ligne_freq < dern_ligne
     
       Cells(ligne_freq, 2).Select
       Tdefaut = Sheets("Frequence Température Int").Cells(ligne_freq, 1).Value - 0.5
       Texces = Sheets("Frequence Température Int").Cells(ligne_freq, 1).Value + 0.5
       Range("D2").Value = Tdefaut
       Range("D3").Value = Texces
     
       Freq_Temp = WorksheetFunction.CountIfs(Sheets("Data 1").Columns(num), "<" & Texces, ">" & Tdefaut)
       Cells("ligne_freq, 2").Value = Freq_Temp
       ligne_freq = ligne_freq + 1
    Loop
    Message d'erreur
    Erreur d’exécution '1004'
    Impossible de lire la propriété Countifs de la classe Worksheetfunction
    Et sinon, je crois que le Countifs est nécessaire à cause des deux conditions:
    -Température supérieure à Température_référence -0.5
    -Température inférieure à Température_référence +0.5
    Ceci pour encadrer une température (exemple pour 10, je souhaite comptabiliser toutes les valeurs comprises entre 9.5 et 10.5)
    J'espère être assez clair

    Merci!

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    L'aide en ligne de countifs n'est pas très explicite .. il faut répéter la plage de cellules concernées pour chaque critéres

    essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Freq_Temp = WorksheetFunction.CountIfs(Sheets("Data 1").Columns(num), "<" & Texces,Sheets("Data 1").Columns(num), ">" & Tdefaut)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Nouvellle ligne de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Freq_Temp = WorksheetFunction.CountIfs(Sheets("Data 1").Columns(num).Value, "<" & Texces, Sheets("Data 1").Columns(num), ">" & Tdefaut)
    Cette fois ci le résultat est:

    Erreur d’exécution '424'
    Objet Requis
    J'ai également essayé par l'intermédiaire de l'enregistreur automatique de Macro.

    Le code qui en résulte est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveCell.FormulaR1C1 = "=(COUNTIFS('Data 1'!C[num],CONCATENATE(""<"",RC1+0.5),'Data 1'!C[num],CONCATENATE("">"",RC1-0.5)))*10/60"
    Range("B2").Select
    Selection.AutoFill Destination:=Range("B2:B27")
    Ce code là marche bien si dans les crochets C[], il n'y a qu'un nombre (en effet avec l'enrengistreur de Macro j'ai fixé une colonne donnée pour cette formule).
    Cependant, lorsque je souhaite remplacer le nombre par la variable num, il n'y arrive pas et affiche

    Erreur d'execution '1004'
    Erreur définie par l'application ou par l'objet
    La méthode est peut être moins bien mais j'ai également cherché une solution de ce côté...infructueusement d'accord mais c'est peut être plus facile

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    as tu essayé ma ligne ?

  9. #9
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Pour le test, en colonne A à partir de A2 les températures qui ont été relevées et en colonne B les températures don tu cherche la fréquence avec +/- 0,5 °C. La feuille est nommée Feuil1 et les résultats sont inscrits en colonne C, adapte :
    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
     
    Sub Test()
     
        Dim PlageTemp As Range
        Dim Plage As Range
        Dim TMini As Single
        Dim TMaxi As Single
        Dim Cel As Range
     
        With Worksheets("Feuil1") '<-- adapter le nom de la feuille
     
            'plage des températures relevées en colonne A à partir de A2
            Set PlageTemp = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
            'plage des température dont la fréquence est recherchée en colonne B à partir de B2
            Set Plage = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
     
        End With
     
        For Each Cel In Plage
     
            TMini = Cel.Value - 0.5
            TMaxi = Cel.Value + 0.5
     
            Cel.Offset(, 1).Value = WorksheetFunction.CountIfs(PlageTemp, ">=" & Replace(TMini, ",", "."), PlageTemp, "<=" & Replace(TMaxi, ",", "."))
     
        Next Cel
     
    End Sub
    Hervé.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par bbil Voir le message
    as tu essayé ma ligne ?
    oui et c'est là qu'il m'affiche

    Objet Requis
    Malheuresement cette méthode ne marche pas (sauf autre erreur de ma part...)

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonsoir,

    Pour le test, en colonne A à partir de A2 les températures qui ont été relevées et en colonne B les températures don tu cherche la fréquence avec +/- 0,5 °C. La feuille est nommée Feuil1 et les résultats sont inscrits en colonne C, adapte :
    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
     
    Sub Test()
     
        Dim PlageTemp As Range
        Dim Plage As Range
        Dim TMini As Single
        Dim TMaxi As Single
        Dim Cel As Range
     
        With Worksheets("Feuil1") '<-- adapter le nom de la feuille
     
            'plage des températures relevées en colonne A à partir de A2
            Set PlageTemp = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
            'plage des température dont la fréquence est recherchée en colonne B à partir de B2
            Set Plage = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
     
        End With
     
        For Each Cel In Plage
     
            TMini = Cel.Value - 0.5
            TMaxi = Cel.Value + 0.5
     
            Cel.Offset(, 1).Value = WorksheetFunction.CountIfs(PlageTemp, ">=" & Replace(TMini, ",", "."), PlageTemp, "<=" & Replace(TMaxi, ",", "."))
     
        Next Cel
     
    End Sub
    Hervé.

    Merci beaucoup je vais voir ça de suite et je vous dis!

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bon bah... c'est clair, concis et surtout, ça fonctionne!!

    Merci beaucoup pour l'aide!

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

Discussions similaires

  1. Mise en place fonction Min avec Index VBA
    Par LorenzoN dans le forum Excel
    Réponses: 2
    Dernier message: 01/11/2014, 12h22
  2. [vba] mise en place d'une barre de progression
    Par ancel17 dans le forum Excel
    Réponses: 7
    Dernier message: 11/12/2013, 11h28
  3. Mise en place d'un journal de caisse sous vba
    Par jpfouquette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/11/2012, 17h02
  4. [VBA-E]Mise en place de 2 valeurs dans une meme cellule
    Par baptbapt dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/08/2006, 15h06
  5. Mise en place d'index....??
    Par liv dans le forum Requêtes
    Réponses: 6
    Dernier message: 18/12/2003, 11h04

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