[Catégorie modifiée .Net -> VBA] Problèmes de fonctions

Nemaucheur Messages postés 3 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 22 avril 2011 - 21 avril 2011 à 22:42
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 23 avril 2011 à 00:41
Bonjour,

Je viens vers vous car j'ai commencer avant hier soir a faire du VBA sur excel 2007.

Je ne sais pas si le topic est au bon endroit, merci de le préciser pour le modifier le cas échéant.

Voici mon problème :

Dans mes cellules B6 à L6 j'ai une fonction =PP_Carac(Humain!B5; Humain!B4) pour la cellule B6 etc pour les autres.
Là une valeur de retour me donne un chiffre.

Dans ma cellule B7 je fais : =PP_Total((SOMME(Humain!B6:L6;G7);Humain!F7)
La valeur retourné est 0 quelque soit les valeur dans mes cellules B6 à L6

Par contre ceci fonctionne : =PP_Total((B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6+M6+N6+O6+P6+Q6+R6+G7);Humain!F7)

Pourriez vous me dire pourquoi ?
Est ce par ce que les cellules B6 à L6 appellent une fonction et elle est exécuté après ?

Merci à vous :d

Public Function PP_Carac(strCaracUnite As String, strCarac As String) As String
Application.Volatile

Dim strCarac_Base As String, strCarac_Coef1 As String, strCarac_Coef2 As String, intCarac_Base As Integer, intCarac_Coef1 As Integer, intCarac_Coef2 As Integer, intCarac_Unite As Integer, intCaracCalc As Integer

Select Case strCarac
    Case "VT"
        strCarac_Base = Range("Calcul!B5")
        strCarac_Coef1 = Range("Calcul!B32")
        strCarac_Coef2 = Range("Calcul!C32")
    Case "I"
        strCarac_Base = Range("Calcul!C5")
        strCarac_Coef1 = Range("Calcul!B33")
        strCarac_Coef2 = Range("Calcul!C33")
    Case "E"
        strCarac_Base = Range("Calcul!D5")
        strCarac_Coef1 = Range("Calcul!B34")
        strCarac_Coef2 = Range("Calcul!C34")
    Case "MvT"
        strCarac_Base = Range("Calcul!E5")
        strCarac_Coef1 = Range("Calcul!B35")
        strCarac_Coef2 = Range("Calcul!C35")
    Case "PV"
        strCarac_Base = Range("Calcul!F5")
        strCarac_Coef1 = Range("Calcul!B36")
        strCarac_Coef2 = Range("Calcul!C36")
    Case "Ref"
        strCarac_Base = Range("Calcul!G5")
        strCarac_Coef1 = Range("Calcul!B37")
        strCarac_Coef2 = Range("Calcul!C37")
    Case "AC"
        strCarac_Base = Range("Calcul!H5")
        strCarac_Coef1 = Range("Calcul!B38")
        strCarac_Coef2 = Range("Calcul!C38")
    Case "Def"
        strCarac_Base = Range("Calcul!I5")
        strCarac_Coef1 = Range("Calcul!B39")
        strCarac_Coef2 = Range("Calcul!C39")
    Case "Pro"
        strCarac_Base = Range("Calcul!J5")
        strCarac_Coef1 = Range("Calcul!B40")
        strCarac_Coef2 = Range("Calcul!C40")
    Case "Pui"
        strCarac_Base = Range("Calcul!K5")
        strCarac_Coef1 = Range("Calcul!B41")
        strCarac_Coef2 = Range("Calcul!C41")
    Case "Vol"
        strCarac_Base = Range("Calcul!L5")
        strCarac_Coef1 = Range("Calcul!B42")
        strCarac_Coef2 = Range("Calcul!C42")
End Select

If strCarac_Base <> "" And IsNumeric(strCarac_Base) And _
        strCarac_Coef1 <> "" And IsNumeric(strCarac_Coef1) And _
        strCarac_Coef2 <> "" And IsNumeric(strCarac_Coef2) And _
        strCaracUnite <> "" And IsNumeric(strCaracUnite) Then
    intCarac_Base = strCarac_Base
    intCarac_Coef1 = strCarac_Coef1
    intCarac_Coef2 = strCarac_Coef2
    intCarac_Unite = strCaracUnite
    
    If (intCarac_Unite - intCarac_Base) = 0 Then
        PP_Carac = 0
    ElseIf (intCarac_Unite - intCarac_Base) > 0 Then
        If (strCarac = Range("Calcul!E4")) Then
            intCaracCalc = (intCarac_Unite - intCarac_Base) / 2.5
        Else
            intCaracCalc = intCarac_Unite - intCarac_Base
        End If
        
        PP_Carac = Application.Index(Range("Calcul!B19:H28"), intCarac_Coef1, intCaracCalc)
    ElseIf (intCarac_Unite - intCarac_Base) < 0 Then
        If (strCarac = Range("Calcul!E4")) Then
            intCaracCalc = (intCarac_Base - intCarac_Unite) / 2.5
        Else
            intCaracCalc = intCarac_Base - intCarac_Unite
        End If
        PP_Carac = -Application.Index(Range("Calcul!B19:H28"), intCarac_Coef2, intCaracCalc)
    End If
Else
    PP_Carac = "???"
End If

End Function

Public Function PP_Total(intTotal As Integer, strType As String) As String
Application.Volatile

Dim strBase As String
Dim intBase As Integer

strBase = Range("Calcul!A5")
If (strBase = "") Then
    intBase = 0
ElseIf (strBase <> "" And IsNumeric(strBase)) Then
    intBase = strBase
Else
    PP_Total = "???"
    Exit Function
End If

PP_Total = intBase + intTotal
If (strType <> "") Then
    PP_Total = PP_Total * 1.5
End If

End Function

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 avril 2011 à 09:02
Salut

Tu parles de ta fonction PP_Total et tu nous colles le code de la fonction PP_Carac : Évite d'embrouiller tout, ne colle que le code nécessaire.

Tu oublies de dire que tu appelles cette fonction depuis une/des cellule/s d'une feuille, d'où une syntaxe d'appel particulière (avec ; au lieu des traditionnels ,)

Humain!B6:L6;G7
n'est pas la même chose que
B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6+M6+N6+O6+P6+Q6+R6+G7
Pas la même étendue + ne s'adresse pas forcement à la même feuille

Apprends à Déboguer :
- F9 sur une ligne de code
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Nemaucheur Messages postés 3 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 22 avril 2011
22 avril 2011 à 17:39
Bonjour,

Avant tout merci de l'attention au topic.

Je vais commencer au fur et à mesure :

Tu parles de ta fonction PP_Total et tu nous colles le code de la fonction PP_Carac : Évite d'embrouiller tout, ne colle que le code nécessaire.

Je parle de PP_Carac également. Cette fonction est appeler via les cellules B6 à F6. Elle ne bug pas mais comme les cellules B6 à F6 traite une fonction j'ai trouvé normal de la coller aussi.

Tu oublies de dire que tu appelles cette fonction depuis une/des cellule/s d'une feuille, d'où une syntaxe d'appel particulière (avec ; au lieu des traditionnels ,)


Là je me demande si tu as lu mon topic ^^
Je te renote donc :
Dans mes cellules B6 à L6 j'ai une fonction =PP_Carac(Humain!B5; Humain!B4) pour la cellule B6 etc pour les autres.
Là une valeur de retour me donne un chiffre.

Dans ma cellule B7 je fais : =PP_Total((SOMME(Humain!B6:L6;G7);Humain!F7)
La valeur retourné est 0 quelque soit les valeur dans mes cellules B6 à L6

Je peux pas faire plus clair là ....

Humain!B6:L6;G7
n'est pas la même chose que
B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6+M6+N6+O6+P6+Q6+R6+G7
Pas la même étendue + ne s'adresse pas forcement à la même feuille

Je comprends pas pkoi SOMME(Humain!B6:L6;G7) est différent de B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6+M6+N6+O6+P6+Q6+R6+G7
C'est pourtant la même chose ? Le premier utilise une fonction, le deuxième c'est manuellement ..

Pour le reste je sais débugguer, merci pour certaine précision que je ne connaissais pas
Mon problème majeur est de savoir si dans l'exécution de mes fonctions il y a un ordre ou pas. Peut être arriverais je à savoir pkoi la somme ne prends pas en compte les valeurs de mes cellules après recalcul.

Autre chose, y a t il une commande pour éviter que toutes mes cellules se réactualise à chaque entrée de donnée dans mon tableau ? J'ai déjà enlever le Application.Volatile mais ça continue à "lagger" lors d'insertion de données.

Merci encore et bonne journée
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 avril 2011 à 18:16
Humain!B6:L6;G7
=
B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6 + G7
mais pas celles de M6 à R6

Oui.
Entregistre une macro pendant que tu lui décoches, dans les options, le recalcul automatique = sur ordre.
Et tu repasses en automatique après tes mises à jour.
= Gain de temps évident.
0
Nemaucheur Messages postés 3 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 22 avril 2011
22 avril 2011 à 19:12
^^ Merci ;)

Humain!B6:L6;G7
=
B6+C6+D6+E6+F6+G6+H6+I6+J6+K6+L6 + G7
mais pas celles de M6 à R6

Oui.

Nous sommes d'accords ^^ Alors pkoi Somme ne marche pas et l'autre si ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 avril 2011 à 00:41
Tu le sauras en débogant ton programme en regardant, ligne après ligne, les valeurs des variables et le chemin des If ...
0
Rejoignez-nous