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 :

Déterminer si une plage est vide [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Par défaut Déterminer si une plage est vide
    Bonjour,

    Je suis un peu nouveau dans le domaine de la macro et du langage VBA, bien que j'ai trouvé de l'aide ici, et je coince sur un petit truc.
    J'ai 2 colonnes de données (des nombres décimaux), et je cherche à filtrer la colonne 1 sur un intervalle de +/- 0.05 autour de 1 puis 2 puis 3 ... puis 25, et de faire la moyenne des valeurs de la colonne 2 après filtrage et de copier cette moyenne dans une case.

    Voici le code que j'ai (qui fonctionne) :
    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 i As Integer
        Dim c As Range
        Dim TotalX As Double, MoyenneX As Double
        Dim CompteurX As Long, DerLigX
        Dim C1 As String, C2 As String
        Dim MaPlageX As Range
     
    For i = 1 To 25
        CompteurX = 0
        TotalX = 0
     
        'Je filtre sur mon intervalle
        C1 = Replace(">=" & CStr(i - 0.05), ",", ".")
        C2 = Replace("<=" & CStr(i + 0.05), ",", ".")
        ActiveSheet.Range("G1", [G65000].End(xlUp)).AutoFilter Field:=1, Criteria1:=C1, _
        Operator:=xlAnd, Criteria2:=C2
     
        'Je sélectionne mes données triées
        DerLigX = Range("I65536").End(xlUp).Row
        Set MaPlageX = Range("I2:I" & DerLigX).SpecialCells(xlVisible)
     
        'Je fais la moyenne
            For Each c In MaPlageX
                TotalX = TotalX + c.Value
                CompteurX = CompteurX + 1
            Next c
            MoyenneX = (TotalX) / (CompteurX)
            Cells(i, 12) = i
            Cells(i, 13) = MoyenneX
    Next i
    End Sub
    J'ai un souci qui m'en amène un autre. Par exemple, une fois filtré, je n'ai aucune valeur dans l'intervalle pour l'entier 16. Dans ce cas, j'aimerais étendre l'intervalle de recherche à +/- 0.1 pour la colonne 1 et calculer la moyenne de la colonne 2, mais je n'y arrive pas. J'avais pensé à modifier la sélection des données triées en testant si la plage est vide ou non de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        'Je sélectionne mes données triées
        DerLigX = Range("I10000").End(xlUp).Row
        Set MaPlageX = Range("I2:I" & DerLigX).SpecialCells(xlVisible)
     
        If MaPlageX Is Nothing Then
           C1 = Replace(">=" & CStr(i - 0.1), ",", ".")
           C2 = Replace("<=" & CStr(i + 0.1), ",", ".")
           ActiveSheet.Range("G1", [G10000].End(xlUp)).AutoFilter Field:=1, Criteria1:=C1, _
           Operator:=xlAnd, Criteria2:=C2
           DerLigX = Range("I10000").End(xlUp).Row
           Set MaPlageX = Range("I2:I" & DerLigX).SpecialCells(xlVisible)
        End If
    Mais quand je fais du pas à pas, quand i=16, ça ne rentre pas dans ma boucle IF, comme s'il la considérait non vide, ou qu'il ne la considère pas du tout.

    Vous auriez une idée du problème ?

    Merci d'avance

    PS : Fichier joint en annexe, la macro est "Feuil1.Selection"
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent 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
    Par défaut
    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
    Sub Test()
    Const N As Byte = 25
    Dim LastLig As Long
    Dim Tb(1 To N, 1 To 2) As Double
    Dim i As Byte, j As Byte
    Dim Plage As Range
    Dim C1 As String, C2 As String
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 1 To N
            For j = 1 To 2
                C1 = Replace(i - 0.05 * j, ",", ".")
                C2 = Replace(i + 0.05 * j, ",", ".")
                .Range("G1:G" & LastLig).AutoFilter Field:=1, Criteria1:=">=" & C1, Criteria2:="<=" & C2, Operator:=xlAnd
                If .Range("G1:G" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                    Set Plage = .Range("I2:I" & LastLig).SpecialCells(xlCellTypeVisible)
                    Tb(i, 1) = i
                    Tb(i, 2) = Application.Average(Plage)
                    Set Plage = Nothing
                    Exit For
                End If
                .AutoFilterMode = False
            Next j
        Next i
        .Range("J1").Resize(N, 2) = Tb
    End With
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Par défaut
    Wah, mais vous faites pour que ça fonctionne directement comme ça ?
    Ça donne exactement ce que je veux, mais il y a des étapes que je ne comprends pas trop

    Que font ces lignes : Tb(i, 1) = i
    Tb(i, 2) = Application.Average(Plage) ?

    Aussi, j'ai compris que la variable j permet de fixer l'intervalle à +/- 0.05 ou +/-0.1 selon sa valeur, mais j'ai l'impression que même si on trouve des valeurs dans l'intervalle +/-0.05, il refait les étapes pour l'intervalle +/-0.1 ?

    En tout cas, merci beaucoup

  4. #4
    Expert éminent 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
    Par défaut
    mais j'ai l'impression que même si on trouve des valeurs dans l'intervalle +/-0.05, il refait les étapes pour l'intervalle +/-0.1 ?
    L'impression ou exactement? Compare avec les valeurs de ton fichier initial.

    Si je me trompe, fais mois signe

    En ligne 23 tu as un Exit For pour sortir de la boucle j (et ne garder que la valeur pour j=1 càd +/-0.05)


    Pour ce qui est de Tb(i,1)=i. j'ai utilisé une variable tableau Tb (pour gagner un peut de temps) et je le transfère directement et en une seule fois vers la feuille.

    Pour ton impression, je te propose de tester ce code
    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 Test()
    Const N As Byte = 25
    Dim LastLig As Long
    Dim Tb(1 To N, 1 To 3) As Double
    Dim i As Byte, j As Byte
    Dim Plage As Range
    Dim C1 As String, C2 As String
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 1 To N
            For j = 1 To 2
                C1 = Replace(i - 0.05 * j, ",", ".")
                C2 = Replace(i + 0.05 * j, ",", ".")
                .Range("G1:G" & LastLig).AutoFilter Field:=1, Criteria1:=">=" & C1, Criteria2:="<=" & C2, Operator:=xlAnd
                If .Range("G1:G" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                    Set Plage = .Range("I2:I" & LastLig).SpecialCells(xlCellTypeVisible)
                    Tb(i, 1) = i
                    Tb(i, 2) = Application.Average(Plage)
                    Tb(i, 3) = 0.05 * j
                    Set Plage = Nothing
                    Exit For
                End If
                .AutoFilterMode = False
            Next j
        Next i
        .Range("J1").Resize(N, 3) = Tb
    End With
    End Sub

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 22
    Par défaut
    J'ai compris comment tu faisais, c'est juste que n'étant pas très familier avec le codage, je ne suivais pas bien le cheminement

    Merci de ton aide

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

Discussions similaires

  1. Déterminer si une IP est dans une plage dans un SELECT
    Par Carmiel dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/06/2009, 08h51
  2. [SQL] Déterminer si le résultat d'une requête est vide ou non
    Par khamett dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/01/2008, 21h53
  3. tester si le résultat d'une requete est vide
    Par monstour dans le forum ASP
    Réponses: 13
    Dernier message: 04/10/2006, 14h14
  4. Tester si une table est vide
    Par rsc dans le forum SQL
    Réponses: 2
    Dernier message: 01/07/2004, 16h25
  5. [JDBC]tester si une table est vide
    Par zozolh2 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/05/2004, 09h17

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