[Catégorie modifiée .Net -> VBA] Problèmes de fonctions
Nemaucheur
Messages postés3Date d'inscriptionjeudi 21 avril 2011StatutMembreDernière intervention22 avril 2011
-
21 avril 2011 à 22:42
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 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
A voir également:
[Catégorie modifiée .Net -> VBA] Problèmes de fonctions
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
Nemaucheur
Messages postés3Date d'inscriptionjeudi 21 avril 2011StatutMembreDernière intervention22 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.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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.