Erreur sur fonction Offset

sishley

XLDnaute Nouveau
Bonjour,

Je cherche à faire une moyenne avec la fonction nombre de jours ouvrés la date d'arrivée et de départ étant sur la même ligne mais la date d'arrivée est sur la colonne suivante. Enfin toutes les cellules doivent être coloriées en grises. J'ai fait ça :

"Public Function NB_Jour_Couleur(plage As Range)
Application.Volatile
For Each c In plage
If c.Interior.ColorIndex = 15 Then
cpt = cpt + 1
Set c1 = Range(c).Offset(0, 1)
x = [NETWORKDAYS(RECAPT6B!c.Value,RECAPT6B!c1.Value,0]
tot = tot + x
End If
Next c
NB_Jour_Couleur = tot / cpt
End Function"


J'ai essayé plusieurs méthodes j'ai aussi fait avec x = [NETWORKDAYS(RECAPT6B!c,RECAPT6B!c.Offset(0,1),0]

Mais lorsque je met ma fonction dans une cellule et que je lui indique une plage de données contenant des cellules grises avec des dates celui-ci me met erreur de valeur.

Pouvez-vous m'aider ?
Merci par avance
 

sishley

XLDnaute Nouveau
Re : Erreur sur fonction Offset

Bonjour,

Je vous remercie pour votre aide.
J'ai effectue les modifications mais ma fonction ne marche toujours pas j'ai encore le dorit au message erreur de Valeur.
Public Function NB_Jour_Couleur(plage As Range)
Dim c As Range
Dim c1 As Range
Application.Volatile
For Each c In plage
Set c1 = c.Offset(0, 1)
If c1.Interior.ColorIndex = 15 Then
cpt = cpt + 1
x = [NETWORKDAYS(RECAPT6B!c,RECAPT6B!c1]
tot = tot + x.Value
End If
Next c
NB_Jour_Couleur = tot / cpt
End Function

Voila ma plage de donnée contient plusieurs cellules des vides, des blanches avec dates, des blanches avec d'autres écriture et des grises avec dates (celles qui m'interessent).
 

pedrag31

XLDnaute Occasionnel
Re : Erreur sur fonction Offset

Re,

L'idéal serait de poster un petit fichier exemple avec des données bidons pour que l'on puisse faire des tests et débugger... Comme ça, juste avec le code c'est pas évident.

Essaie ceci (non testé)

Code:
Public Function NB_Jour_Couleur(plage As Range)
Dim c As Range
Dim c1 As Range
Application.Volatile
For Each c In plage
    Set c1 = c.Offset(0, 1)
    If c1.Interior.ColorIndex = 15 Then
        cpt = cpt + 1
        x = WorksheetFunction.NetworkDays(CDate(c.Value), CDate(c1.Value))
        tot = tot + x.Value
    End If
Next c
NB_Jour_Couleur = tot / cpt
End Function

Bonne journée :)
 

sishley

XLDnaute Nouveau
Re : Erreur sur fonction Offset

Bonjour,

Je vous remercie encore pour votre aide. Je n'y arrives pas :( J'ai essayé de reproduire un peu la présentation mais je n'ai pas collé le fichier même. Surtout qu'il y a d'autre macro dans le fichier original.
 

Pièces jointes

  • Exemple.xlsm
    22.6 KB · Affichages: 41
  • Exemple.xlsm
    22.6 KB · Affichages: 48
  • Exemple.xlsm
    22.6 KB · Affichages: 48

pedrag31

XLDnaute Occasionnel
Re : Erreur sur fonction Offset

Re,

A tester avec le fichier ci-joint.
A vérifier pour le résultat.

Quelques notes:

1. Ne pas sélectionner toute la colonne, juste la plage souhaitée sinon calcul en boucle presque infinie et Excel plante ou rame (200,000 lignes à tester...)
2. Le gris de la feuille 2 était un ColorIndex 48 et non 15.
3. Bien déclarer les variables en début de fonction (Dim) c'est plus sûr.
4. Tester les valeurs qu'elles soient non nulles ou non vides avant de faire des calculs
5. Tester la valeur qu'elle soit non nulle avant de diviser par celle-ci.


Code:
Public Function NBJourCouleur(plage As Range)
    Dim c As Range
    Dim c1 As Range
    Dim cpt As Integer
    Dim tot As Double, x As Double
    
    Application.Volatile
    cpt = 0
    For Each c In plage
     Set c1 = c.Offset(0, 1)
        If c1.Interior.ColorIndex = 48 And c.Value <> "" And c1.Value <> "" Then
            cpt = cpt + 1
            x = WorksheetFunction.NetworkDays(c, c1)
            tot = tot + x
        End If
    Next c
If cpt <> 0 Then NBJourCouleur = tot / cpt
End Function

Bonne journée :)
 

Pièces jointes

  • NetworkDays Function.xlsm
    23.7 KB · Affichages: 45

sishley

XLDnaute Nouveau
Re : Erreur sur fonction Offset

Merci votre fonction marche :)

A quoi servent
Dim cpt As Integer
Dim tot As Double, x As Double ?


Sinon je pense que je vais essayer de l'adapter pour plusieurs nuances de gris je ne peux pas modifier ma feuille de données et les cases sont grisées avec des gris différents

Merci encore
 

pedrag31

XLDnaute Occasionnel
Re : Erreur sur fonction Offset

Re,

"Dim" est le "préfixe" qui permet d'indiquer à VBA qu'il s'agit d'une déclaration de variable. Grâce à cette déclaration, le programme sait quel type de donnée (nombre, chaîne texte, entier, booléen,...) doit être stocké dans la variable et alloue de l'espace mémoire en fonction de cette donnée afin d'optimiser le fonctionnement. Cela permet également lors d'un bug de savoir qu'il y a une erreur de donnée, comme quand on envoie du texte dans une variable nombre.


  • "range" correspond à une cellule ou à une zone de cellules
  • "integer" correspond à un entier positif (exple: 0, 1, 2, 3,4 ...)
  • "double" correspond à un nombre décimal relatif (exple: -2.36, 6.55957, 195.522, -567812.2268, ...)
  • "string" correspond à une chaîne de caractères, du texte en gros (exple: "bonjour", "Le chien a 4 pattes", "la voiture roule t-elle vite?")
  • "boolean" correspond à une donnée booléenne vrai/faux (exple: "True" ou "False")
  • etc...

Tu peux faire F1 dans VBA lorsque tu es sur le code que tu ne comprends pas.
Automatiquement, l'aide VBA ressort les explications correspondant à la commande qui touche le curseur clignotant (prompt). Très très pratique, avec des exemples de codes également pour bien comprendre les commandes.
J'ai beaucoup progressé grâce à la touche F1...;)

Bonne journée :)
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16