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 :

Problème de déclaration d'argument facultatif [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut Problème de déclaration d'argument facultatif
    Bonjour à tous,
    Je travaille sur un projet à mon travail et j'ai créé une fonction qui compte le nombre de cellules vides dans une plage de données. Le nombre de plages est facultatif alors j'ai mis un maximum de 22 arguments. Vous trouverez ci-après un extrait de ma fonction avec 2 arguments dont 1 facultatif, j'ai pas voulu mettre toute la fonction à 22 arguments.
    Mon problème est que le logiciel ne reconnaît pas le deuxième argument comme étant facultatif bien que j'ai mis "optional" devant.
    J'aimerais s'il vous plaît que vous m'aidiez à déclarer "valeur2" comme étant facultatif, de sorte que je modifie la globalité de mon code.
    Merci d'avance.




    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
    Function Blankya(Valeur1 As Range, Optional Valeur2 As Variant = Empty)
     
     Dim c As Range
     
        Application.Volatile
     
        For Each c In Valeur1
     
            If c.MergeCells <> True And c.Value = "" Then
     
             Blankya = Blankya + 1
     
            End If
     
        Next c
     
         For Each c In Valeur2
     
            If c.MergeCells <> True And c.Value = "" Then
     
    Blankya = Blankya + 1
     
            End If
     
        Next c
     
    End Function

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    Je viens de tester ta fonction.
    Sur mon poste, le paramètre facultatif est très bien reconnu.

    Attention: la règle, c'est que tous les paramètres qui suivent un paramètre facultatif doivent être aussi facultatifs.

    Cordialement,

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut
    Tu as essayé de sélectionner une seule plage plutôt que deux et ça ne t'a pas affiché "erreur de compilation 449 : argument non facultatif" ???

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Quelques suggestions:

    1. Sur la forme: mettre votre code entre balise, ça facilite la lecture
    2. Sur la question: passer par la fonction IsMissing, ie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not(IsMissing(Valeur2 )) Then ....
    3. Sur le fond:
    - je ne vois pas l'utilité de passer des Range en Variant juste pour pouvoir tester si ils sont passés en arguments .... Il vaudrait mieux je pense:
    o Extraire directement les cellulles vides du Range specifié en le retournant par la fonction (quoi que ....) en passant par le specialCells
    o Ou mieux travailler directement sur le SpecialCells qui permet en une passe de le sortir

    Exemple à peine dégrossi:
    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 GetBlanlCells(SrcRng As Range) As Range
     
    'On sort si le SrcRng n'est pas spécifié
        If SrcRng Is Nothing Then
            End
            Else:
                Set GetBlanlCells = SrcRng.SpecialCells(xlCellTypeBlanks)
                Debug.Print GetBlanlCells.AddressLocal
        End If
    End Function
     
    Sub Titi()
        Dim BlkRng As Range
        Set BlkRng = GetBlanlCells(Range("A10").CurrentRegion)
    End Sub

  5. #5
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Ah! oui, j'ai pas tout lu!!!

    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
     
    Function Blankya(Valeur1 As Range, Optional Valeur2 As Variant = Empty)
     
        Dim c As Range
     
        Application.Volatile
     
        For Each c In Valeur1
            If c.MergeCells <> True And c.Value = "" Then
                Blankya = Blankya + 1
            End If
        Next c
        If TypeOf Valeur2 Is Range Then
            For Each c In Valeur2
                If c.MergeCells <> True And c.Value = "" Then
                    Blankya = Blankya + 1
                End If
            Next c
        End If
     
    End Function

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut
    Citation Envoyé par Philippe PONS Voir le message
    Ah! oui, j'ai pas tout lu!!!

    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
     
    Function Blankya(Valeur1 As Range, Optional Valeur2 As Variant = Empty)
     
        Dim c As Range
     
        Application.Volatile
     
        For Each c In Valeur1
            If c.MergeCells <> True And c.Value = "" Then
                Blankya = Blankya + 1
            End If
        Next c
        If TypeOf Valeur2 Is Range Then
            For Each c In Valeur2
                If c.MergeCells <> True And c.Value = "" Then
                    Blankya = Blankya + 1
                End If
            Next c
        End If
     
    End Function
    Merci beaucoup, j'ai testé ta modification et voilà tout marche.
    J'aimerais savoir s'il te plaît quel est le principe de "If TypeOf"

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 4
    Par défaut
    Merci à toi aussi @Vinc_bilb, juste que je n'ai pas compris ton code.
    J'aimerais bien que tu m'expliques ta procédure

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Rebonjour,

    Avec des commentaires rajoutés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function GetBlanlCells(SrcRng As Range) As Range
    ' On retourne la liste des cellules vides d'un range passé en paramètre (Attention, il faudrait rajouter le traitement d'erreur)
     
    'On sort si le SrcRng n'est pas spécifié
        If SrcRng Is Nothing Then
            End
    ' Autrement, on sauve toutes les cellules vides du range d'entrée (SrcRng) dans le range retourné (GetBlanlCells = function, spécifié comme un range dans la déclaration), en passant par le specialcells
            Else:
                Set GetBlanlCells = SrcRng.SpecialCells(xlCellTypeBlanks)
                Debug.Print GetBlanlCells.AddressLocal
        End If
    End Function

  9. #9
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If TypeOf Valeur2 Is Range Then
    te permet de vérifier que Valeur2 est bien de type Range.
    Du coups, si c'est le cas, les méthodes de la classe Range, comme MergeCells, sont valides pour être appelées sur Valeur2(puisque c'est un objet de type Range)

    HTH

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

Discussions similaires

  1. Inclusion de classes / problème de déclaration
    Par scal-80 dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2006, 16h28
  2. Réponses: 2
    Dernier message: 27/05/2006, 12h13
  3. problème de déclaration
    Par dirty_boy dans le forum C
    Réponses: 2
    Dernier message: 16/09/2005, 11h56
  4. Réponses: 11
    Dernier message: 29/04/2005, 19h45
  5. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17

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