> Tous les forums > Forum Bureautique
 problème de fonction en VBA : HEEEEELLLPPPPPP
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
ylh7200
  Posté le 30/10/2006 @ 22:43 
Aller en bas de la page 
Nouvel astucien
Bonjour A tous et à toutes Je fais mes premiers pas en VBA XL et je me débrouille pas trop mal mais je bloque sur un point. Si quelqu'un peut m'aider ce serait sympa. Merci je veux créer une fonction afin de l'utiliser comme une formule dans une cellule de Exell. La voici : Public Function calcule_occupation_voies(LD As Integer, LF As Integer, LIG As Integer, COL As Integer) Dim cellule As Range Range(Cells(LD, COL), Cells(LF, COL)).Select somme = 0 For Each cellule In selection If VarType(cellule.Value) <> 8 Then somme = somme + Abs(cellule.Value) End If Next cellule calcule_occupation_voies = somme End Function Si j'appelle cette fonction via une procédure telle que celle-ci : Sub appel_fonction() reponse = calcule_occupation_voies(7, 45, 54, 23) MsgBox reponse End Sub Cà marche impeccable... mais sous forme de formule: RIEN ! Le problème semble que la sélection de la plage que je souhaite ne se fasse pas lors de l'utilisation en formule alors qu'elle se fait parfaitement lors de l'appel via la procédure. Si vous y voyez plus clair que moi, merci de m'aider...
Publicité
yojema
 Posté le 31/10/2006 à 00:08 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Ces 2 codes te permette de memoriser un calcul maintenant qu est ce que tu veut faire avec ca ? ecrire le resultat dans une cellule ou tu aurai preferer ecrire une formule dans une cellule qui t aurai fait la somme de ce que tu memorise ? J suis pas un crac J comprend vite mais il faut .....[chinois]
galopin01
 Posté le 31/10/2006 à 05:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien
Bonjour, Je ne vois pas ce que tu veux faire avec ça. "Public" est (certainement) inutile. Une fonction ne devrait pas faire d'action Range(Cells(LD, COL), Cells(LF, COL)).Select (... ou alors ce n'est plus une fonction) J'ai un peu de mal à comprendre l'utilité des instructions : LIG As Integer : cette variable n'est pas utilisé If VarType(cellule.Value) <> 8 ... Cette instruction n'est pas appropriée : Pour t'en convaincre sème quelques valeurs (String,integer,vide Date et une valeur d'erreur par exemple) dans un range test et pose un MsgBox aussitôt après le then :
If VarType(cellule.Value) <> 8 Then MsgBox VarType(cellule.Value) somme = somme + Abs(cellule.Value)
D'une manière générale, la fonction SOMME ne te suffit pas ? A+
ylh7200
 Posté le 04/11/2006 à 21:03 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Merci yojema et galopin01 de vous intéresser à mon petit problème. Je vais essayer de répondre à vos questions...

Cette fonction a bien pour but d'être utilisée dans une formule au sein d'une feuille de calcul. Elle est censée faire une somme des éléments situés dans une plage de données allant de la ligne LD à la ligne LF et se trouvant dans la colonne COL. La somme est faite selon un critère (encore à implémenter mais je ne suis pas encore là) correspondant à un élément se trouvant sur la ligne LIG. Ceci explique pourquoi je ne peux pas utiliser la fonction SOMME (çà aurait été trop facile...) et pourquoi la variable LIG n'est pas (encore) utilisée.

Pour le "VarType(cellule.Value) <> 8",merci de me prévenir : je vais y regarder mais ce n'est pas ma préoccupation pour l'heure

Ma principale intérogation est : pourquoi cette satanée fonctionne donne-t'elle un bon résultat lorsqu'elle est appelée par une procédure SUB alors qu'utilisée comme fonction personnalisée, elle ne donne rien ?????????

galopin01
 Posté le 04/11/2006 à 22:47 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

bonsoir,

Parce que:

Une fonction ne devrait pas faire d'action
ni s'excercer sur une sélection (car dans le meilleure des cas tu crées une référence circulaire)
Range(Cells(LD, COL), Cells(LF, COL)).
Select
(... ou alors ce n'est plus une fonction, mais une Sub androgyne)

Une telle fonction :

Function Test()
For Each o In Selection
somme = somme + o.Value
Next
Test = somme
End Function

...Fonctionne sur le même type... c'est à dire guère mieux !

Au pire tu peux écrire :

Function Test()
For Each o In Range("A1:A3")
somme = somme + o.Value
Next
Test = somme
End Function

Mais ce n'est gère plus fameux

Une telle fonction ne se recalcule pas...

ou alors il faudrait insérer une instruction :

Application.Volatile

Function Test()
Application.Volatile
For Each o In Range("A1:A3")
somme = somme + o.Value
Next
Test = somme
End Function

Mais ça reste quand même tiré par les cheveux .

Tu ferais quand même d'attendre de voir la nature de ce fameux critère LIG d'abord et de revenir nous voir après : On te donnerait surement quelque chose de plus pertinent.

A+



Modifié par galopin01 le 04/11/2006 22:53
ylh7200
 Posté le 05/11/2006 à 10:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Voilà qui est fait....

La fonction personnalisée que je voudrais implémenter est reproduite ci-après. Elle donne le bon résultat lorsqu'elle est appelée depuis une bonne procédure mais rien de valable lorsqu'elle est utilisée comme formule dans une cellule.

PS : j'ai aussi une petite question... voir le commentaire après LD=7'........

Public Function calc_occup_voies()
Application.Volatile
Dim cellule As Range
Dim LD As Integer
Dim LF As Integer
Dim LIG As Integer
Dim COL As Integer

LIG = ActiveCell.Row
COL = ActiveCell.Column
LD = 7 'il faudrait ici une commande trouvant la première cellule non vide de la colonne A
LF = LD + Application.WorksheetFunction.CountA(Range("A:A")) - 1

somme = 0
For Each cellule In Range(Cells(LD, COL), Cells(LF, COL))
If IsNumeric(cellule.Value) And Cells(cellule.Row, 6) = Cells(LIG, 6) Then
somme = somme + Abs(cellule.Value)
End If
Next cellule

calc_occup_voies = somme

End Function


Sub appel_fonction()
reponse = calc_occup_voies()
MsgBox reponse
End Sub


galopin01
 Posté le 05/11/2006 à 15:13 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

bonjour,
Tu peux essayer ça :

Public Function COV()
Dim iC%, iD%, iV, o As Range
Application.Volatile
iV = Cells(ActiveCell.Row, 6).Value
iC = ActiveCell.Column
iD = Cells(1, 1).End(xlDown).Row
iE = Cells(65536, 1).End(xlUp).Row
For i = iD To iE
If IsNumeric(Cells(i, iC)) And Cells(i, 6) = iV Then Tmp = Tmp + Abs(Cells(i, iC))
Next
COV = Tmp
End Function

Bon je ne suis pas du tout persuadé que c'est au top mais comme je n'ai pas de classeur modèle...

Je reste très sceptique avec le IsNuméric (zéro ou Vide ou Date est numérique.)
Avec un peu plus d'explications sur ce IsNuméric et un petit classeur démo,
je suis convaincu qu'on arriverait à quelque chose de bien meilleur !

A+

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
18,90 €Microsoft Office Professionnel 2016 Plus à 18,90 €
Valable jusqu'au 28 Février

Le vendeur sérieux Digital FR sur Amazon propose la clé d'activation légale pour Microsoft Office Professionnel 2016 Plus en français à 18,90 €. Cette clé livrée par email vous permettra d'activer Microsoft Office Professionnel 2016 Plus légalement et vous permettra ainsi d'utiliser autant de temps que vous voulez (il s'agit de la version complète et pas d'un abonnement) Word,Excel, PowerPoint, OneNote, Outlook, Publisher et Access 2016 sur un PC. La clé sera à activer sur Office.com où vous pourrez ensuite télécharger toute la suite bureautique. Si la version 2019 fonctionne uniquement avec Windows 10, cette version 2016 fonctionne avec Windows 7, Windows 8 et Windows 10 !


> Voir l'offre
104,99 €Disque dur externe portable Western Digital Elements USB 3.0 5 To à 104,99 €
Valable jusqu'au 01 Mars

Amazon propose actuellement le disque dur externe portable Western Digital Elements USB 3.0 5 To à 104,99 € livré gratuitement. On le trouve ailleurs à partir de 149 €. Ce disque dur qui tient dans la main est silencieux, ne chauffe pas et dispose d'une connectique USB 3.0 qui vous offrira des transferts rapides. Il est compatible USB 2.0. Une très bonne affaire.


> Voir l'offre
9,99 €Bloc multiprise parasurtenseur BRENNENSTUHL 8 prises à 9,99 €
Valable jusqu'au 27 Février

Amazon fait une promotion sur le bloc multiprise parasurtenseur BRENNENSTUHL avec 8 prises à orientation interversée qui passe à 9,99 € au lieu de 20 €. Le câble fait 1,4 m.


> Voir l'offre

Sujets relatifs
[Excel 2007] Fonction NB.SI - problème
Problème de "fonction" sous Excel
probleme pour syntaxe fonction si imbriquée et ou
Problème Fonction recherche
problème avec la fonction recherche
Fonction RANG
Comment choisir la "fonction" de mes mails ?
Publipostage problème format
problème impression couleur Libre Office
problème de photocopies
Plus de sujets relatifs à problème de fonction en VBA : HEEEEELLLPPPPPP
 > Tous les forums > Forum Bureautique