> 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
GratuitJeu PC Kingdom Come : Deliverance gratuit
Valable jusqu'au 20 Février

Epic Game Store offre actuellement le jeu PC Farming Simulator 19. Devenez un fermier des temps modernes et développez les activités de votre ferme, moissonnez vos récoltes et prenez soin de votre élevage, le tout dans deux énormes environnements Américain et Européen. Pour télécharger Farming Simulator 19, connectez-vous sur votre compte Epic Game Store (créez-en un gratuitement si vous n'en n'avez pas) et cliquez sur le bouton Obtenir sur la fiche du jeu. Le jeu sera ajouté définitivement à votre bibliothèque et vous pourrez le télécharger ensuite quand vous voudrez. Le jeu est classé PEGI 3.


> Voir l'offre
35,99 €Souris sans fil Logitech G305 à 35,99 €
Valable jusqu'au 22 Février

Amazon fait une belle promotion sur la nouvelle souris sans fil Logitech G G305 qui passe à 35,99 € livrée gratuitement alors qu'on la trouve ailleurs autour de 50 €. Cette souris vous offre des performances sans fil de niveau professionnel et une fiabilité inégalée surpassant même certaines des meilleures souris gaming filaire. Dotée du capteur HERO, vous allez connaitre une précision exceptionnelle grâce à sa sensibilité pouvant aller jusqu'à 12 000 dpi.


> Voir l'offre
32,99 €Imprimante multifonction HP Officejet 2620 + Instant Ink 6 mois à 32,99 €
Valable jusqu'au 20 Février

Cdiscount propose actuellement l'imprimante multifonction HP Officejet 2620 à 32,99 €. Cette imprimante 4 en 1 fait donc imprimante, photocopieur, scanner mais également fax. Elle dispose d'un chargeur automatique de documents. Elle fonctionne avec 2 cartouches d'encre (une noire et une 3 couleurs). Avec l'imprimante, vous pouvez également bénéficier de 6 mois d'abonnement gratuit au service HP Instant Ink où vos cartouches sont automatiquement commandées par votre imprimante.  Afin de bénéficier du service vous devrez sélectionner un forfait parmi les quatre forfaits existants (15, 50, 100, 300 pages) en fonction de votre prévision de consommation. HP vous enverra ainsi gratuitement assez d'encre pour imprimer jusqu'à 300 pages / mois pendant 6 mois. Vous pouvez bien sûr résilier ce forfait à la fin des 6 mois (ou bien passer au forfait gratuit qui offre 15 pages / mois). Notez que ce service n'est pas obligatoire et que si vous ne souhaitez pas y souscrire, vous pouvez acheter vous même vos cartouches.


> 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