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 :

Erreur by ref sur ma plage


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Erreur by ref sur ma plage
    Bonjour à tous. J'écris le code suivant :

    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
    Function PourcLocVac(Ma_plage As Range) As Long
     
    Dim Localvac As Long
     
    Dim Localnonvac As Long
     
    Localvac = Worksheet.Function.NB.SI(Ma_plage.Value, "oui")
     
    Localnonvac = Worksheet.Function.NB.SI(Ma_plage.Value, "non")
     
    PourcLocVac = Localvac / (Localvac + Localnonvac)
     
    End Function
     
     
    Sub Poucentage()
     
     
    Sheets("ora").Select
     
    Ma_plage = Range("B2").End(xlDown).Value
     
    Range("D3").Value = PourcLocVac(Ma_plage)
     
     
    End Sub


    Quand j'exécute, j'ai une erreur by ref sur Ma_plage (le tout dernier) et je ne comprends pas pourquoi. Quelqu'un peut m'aider svp ? Merci.

    PS : les cellules contiennent les valeurs oui ou non pour signifier qu'un local est vacant ou non.

  2. #2
    Membre expérimenté
    Bonjour
    Citation Envoyé par ORKI243 Voir le message
    Quand j'exécute, j'ai une erreur by ref sur Ma_plage (le tout dernier) et je ne comprends pas pourquoi.
    Tu as plusieurs erreurs dans ton code
    - ta fonction résultat d'un division devrait avoir des décimales
    - tu passes des valeurs au lieu d'une plage
    - la définition de ta plage n'est pas correcte
    - tes fonctions sont mal écrites et doivent être en anglais

    Comme ceci cela devrait mieux fonctionner
    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
    Function PourcLocVac(Ma_plage As Range) As Double
     
    Dim Localvac As Long
     
    Dim Localnonvac As Long
     
    Localvac = Application.WorksheetFunction.CountIf(Ma_plage, "oui")
     
    Localnonvac = Application.WorksheetFunction.CountIf(Ma_plage, "non")
     
    PourcLocVac = Localvac / (Localvac + Localnonvac)
     
    End Function
     
     
    Sub Poucentage()
     Dim Ma_plage As Range
     
    Sheets("ora").Select
     
    Set Ma_plage = Range("B2:B" & Range("B2").End(xlDown).Row)
     
    Range("D3").Value = PourcLocVac(Ma_plage)
     
     
    End Sub

  3. #3
    Candidat au Club
    Citation Envoyé par ORKI243 Voir le message
    Vous avez raison ! Merci !!

  4. #4
    Candidat au Club
    Bonsoir. La ligne de code

    Set Ma_plage = Range("B2:B" & Range("B2").End(xlDown).Row) ne fonctionne pas. J'ai essayé avec Range("B2",Range("B2").end(xlDown) mais cela ne marche correctement que lorsque toutes les cellules sont renseignées sur la colonne. En effet, dès qu'une cellule est vide, le pourcentage n'est pas bon. Et quand je rajoute des lignes, c'est pire.

  5. #5
    Rédacteur

    Bonjour,
    Il est tout à fait normal que s'ii y a des lignes vides dans la colonne B, le résultat renvoyé ne soit pas celui attendu.
    En effet l'instruction Range("B2:B" & Range("B2").End(xlDown).Row) renvoie un objet Range et celui-ci correspond à ce que l'on fait manuellement lorsque l'on souhaite sélectionner une plage de cellule en faisant Ctrl + Shift (Maj) + Flèche bas
    Donc si dans ma plage de cellule B2:B100, la cellule B9 est vide et que je sélectionne B2 et puis que j'utilise le raccourcis clavier Ctrl + Shift (Maj) + Flèche bas, Excel me sélectionnera B2:B8

    Pour pallier ce problème de ligne vide on part dans ce cas de la dernière ligne de la colonne B et on utilise alors l'argument xlUp qui nous renverra la dernière ligne remplie de la colonne B soit Set Ma_PLage = Range("B2:B" & Range("B" & Rows.Count).End(xlUp).Row)



    Personnellement lorsque je dois utiliser des plages classiques, j'utilise la propriété CurrentRegion en partant de la première cellule (ligne, colonne) de ma plage de cellules et ce à condition que la première colonne et la première ligne de ma liste de données sont remplies et cela c'est l'équivalent de la combinaison des touches Ctrl + * et ensuite je prend la Xème colonne de ma plage

    Exemple pour obtenir la moyenne des la colonne D d'une liste de données commençant en A1
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub t()
      Dim Ma_PLage As Range
      Set Ma_PLage = Range("A1").CurrentRegion
      MsgBox "La moyenne est " & WorksheetFunction.Average(Ma_PLage.Columns(4))
    End Sub


    Cependant, je conseille vivement d'abandonner les plages classiques et utiliser les tableaux struturés bien plus simple et plus sûr à utiliser en VBA et bien entendu manuellement

    A lire éventuellement Apprendre à utiliser les tableaux structurés Excel : création, manipulations et avantages(1)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA