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 :

Plus petite valeur dans une tableau et <> "0" [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut Plus petite valeur dans une tableau et <> "0"
    Bonjour à tous,

    Je viens vers vous afin de m'éviter de me lancer dans une usine à gaz si pas nécessaire ... Si vous pouviez m'éviter ça je vous serait très reconnaissant

    Je m'explique,
    Je cherche à trouver le mois le plus petit d'une série de date. Or il n'y a pas forcément de date dans ma série et donc parfois c'est égal à 0 et je ne veux pas prendre en compte les données vide mais uniquement les remplies car il y aura forcement au moins une données non vide. Comme j'ai beaucoup de colonnes je voudrais éviter de passer par un si pour chaque colonne
    je ne passe pas directement par un range mais par une variable tableau

    Je pense qu'il doit bien exister une fonction telle que celle-ci non?
    j'ai vu la fonction PETITE.VALEUR en faisant des recherches qui pourrait éventuellement marcher pour mon problème non? mais ne trouve pas son équivalent sous vba.

    Dans mon code c'est cette ligne que j'aimerai coder de facon à prendre uniquement les valeurs non vides:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Year(CDate(Application.Min(a(i, 4), a(i, 6), a(i, 9), a(i, 12), a(i, 15), a(i, 18), a(i, 25), a(i, 32), a(i, 44), a(i, 49), a(i, 54), a(i, 59)))) _
     & Month(CDate(Application.Min(a(i, 4), a(i, 6), a(i, 9), a(i, 12), a(i, 15), a(i, 18), a(i, 25), a(i, 32), a(i, 44), a(i, 49), a(i, 54), a(i, 59)))) = _
     ThisWorkbook.Worksheets("TdB").Range("N2").Value & b(k) Then
    Merci d'avance de votre précieuse aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Une fonction me parait pas mal :

    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
    Function MinValeur(Matricecherche As Range)
    Dim Cel As Variant
    Dim ValeurMini As Variant
     
    valeurMini = Matricecherche.Cells(1, 1)
     
    For Each Cel In Matricecherche
        If Cel.Value < ValeurMini And Cel.Value > 0 Then
        ValeurMini = Cel.Value
        End If
    Next
     
    MinValeur = ValeurMini
     
    End Function

  3. #3
    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,

    la difficulté de ton exercice, qui revient à éviter de multiplier les tests ou à créer une boucle, provient de la source de ton process : tu es dans un tableau sur lequel ce ne sont pas tous les éléments qu'il faut analyser.

    peux-tu nous montrer comment tu alimentes ce tableau, et si d'aventure on ne pourrait pas directement créer un tableau avec tes années et mois (voir constituer directement des dates complètes)

  4. #4
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Ou sinon si tu as que des trous (des " " ou "") et non des 0 dans tes valeurs que tu cherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y = WorksheetFunction.Small(Range("A1:B5"), 1)
    Et si il y a des 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Z = WorksheetFunction.CountIf(Range("A1:B5"), 0)
    y = WorksheetFunction.Small(Range("A1:B5"), 1 + Z)

  5. #5
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut
    Bonjour à tous,
    Merci pour votre aide,
    @Al__22
    Je vais regarder tout ca et je reviens vers toi pour te dire ce qu'il en est
    Merci pour la fonction Small je vais tester d'abord avec celle-ci et si ca ne fonctionne pas j'essayerai avec ta fonction

    @Joe.levrai

    voici comment j'alimente mon tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ThisWorkbook.Worksheets("Tampon")
        DL = .Cells(.Rows.Count, 2).End(xlUp).Row
        a() = .Range("A1:BJ" & DL).Value
    End With
    en fait, je prends toute la plage de ma feuille Tampon et j'évite de boucler directement dans la feuille car il y a beaucoup beaucoup de ligne. c'est pour la rapidité d'execution.
    et ensuite je me sers de ce tableau a() pour faire mes indicateurs
    ainsi il y a des colonnes qui me servent pas forcément pour cet indicateur. Et même il n'y a que les colonnes suivantes qui m'interressent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a(i, 4), a(i, 6), a(i, 9), a(i, 12), a(i, 15), a(i, 18), a(i, 25), a(i, 32), a(i, 44), a(i, 49), a(i, 54), a(i, 59)

  6. #6
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Pas de soucis en espérant que ça marche pour toi

  7. #7
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut
    Re,

    J'ai donc fait des tests et la fonction small ne fonctionne pas même en passant par un array. Elle fonctionne uniquement sur un range. Etrange vu que dans l'aide, le paramètre peut être un range ou un array....

    Concernant ta fonction, elle fonctionne sur un range également. j'ai essayé de l'adapter pour passer en paramètre un array et cela n'était pas non plus concluant
    j'ai donc voulu rajouter un boucle intermédiaire pour remplacer les vides par les max et ensuite faire le min de tout ca sauf que le min me renvoie 0 quand même je ne sais pas pourquoi! même en essayant le max ca renvoie 00:00:00 avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print CDate(Application.Max(aa))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    aa() = Array(a(i, 4), a(i, 6), a(i, 9), a(i, 12), a(i, 15), a(i, 18), a(i, 25), a(i, 32), a(i, 44), a(i, 49), a(i, 54), a(i, 59))
            For l = LBound(aa) To UBound(aa)
                If aa(l) = "" Then aa(l) = CDate(Application.Max(a(i, 4), a(i, 6), a(i, 9), a(i, 12), a(i, 15), a(i, 18), a(i, 25), a(i, 32), a(i, 44), a(i, 49), a(i, 54), a(i, 59)))
            Next l

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

Discussions similaires

  1. Réponses: 29
    Dernier message: 20/08/2016, 14h19
  2. [MySQL] Retourner les plus petites valeurs d'une table
    Par Albafika dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 27/10/2008, 18h38
  3. mettre les valeurs dans une tableau
    Par monphp dans le forum VB.NET
    Réponses: 1
    Dernier message: 01/06/2007, 16h51
  4. Rechercher la plus proche valeur dans un tableau
    Par neoMatrix dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/05/2007, 11h45
  5. rechercher la plus proche valeur dans un tableau ?
    Par Slumpy dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/04/2007, 14h06

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