[Catégorie modifiée VB6 -> VBA] Faire réagir une fonction personnelle VBA Excel
Magiczorro
Messages postés4Date d'inscriptionvendredi 14 janvier 2011StatutMembreDernière intervention17 janvier 2011
-
17 janv. 2011 à 16:02
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
17 janv. 2011 à 23:51
Bonjour,
Concernant les fonctions natives EXCEL qui font référence à des cellules, vous l'avez sans doute remarqué lors de leur utilisation, on peut rentrer :
sur la cellule B1 par exemple : =A1 (fonction la plus simple)
puis en B2 : =A2
Et ainsi de suite... jusqu'à Bxxxx : =Axxxx
Cette façon d'écrire les fonctions peut être remplacée de manière strictement identique quant au résultat par :
En B1: =A:A
Jusqu'à Bxxxx : =A:A
Cela permet de gagner en mémoire utilisée et aussi en confort de lecture par exemple pour une fonction comme celle-ci :
=RECHERCHEV($D:$D;$D$1:F$140;F$142;FAUX)/RECHERCHEV($D:$D;$D$1:$E$140;2;FAUX)*$E:$E
Ma question est donc la suivante : je souhaiterais avoir cette même souplesse de saisie avec une fonction personnelle, par exemple celle-ci :
Public Function FPERSO(nombre)
FPERSO = (nombre+2)
End Function
Si je rentre =FPERSO(A:A) alors #VALEUR!
Quelle est l'astuce pour y arriver.
Merci pour votre réponse
A voir également:
[Catégorie modifiée VB6 -> VBA] Faire réagir une fonction personnelle VBA Excel
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 17 janv. 2011 à 19:11
Salut
C'est du VBA, pas du VB6. Corrigé.
Si tu définis une fonction, il faut, au minimum :
- Déclarer ce que renverra la fonction : quel type de variable
- Déclarer le type de la variable passée.
Dans le cas de ton exemple, nombre semble représenter un nombre, alors que tu veux lui passe une référence de Range. Il va falloir choisir.
Si tu dois ajouter le chiffre 2 et renvoyer un résultat :
En supposant que nombre représente un chiffre OU un range qui désigne une colonne en laissant supposer qu'on travaille sur la même ligne :
Public Function FPERSO(nombre As Variant) As Double
If TypeName(nombre) = "Double" Then
' Type par défaut quand numérique
FPERSO = (nombre + 2)
ElseIf TypeName(nombre) = "Range" Then
' Faut rechercher le n° de la ligne actuelle
Dim lLineNumber As Long
lLineNumber = ActiveCell.Row
' et le nom de la colonne désignée
Dim lColNumber As Long
lColNumber = nombre.Column
' puis faire le calcul
FPERSO = Cells(lLineNumber, lColNumber).Value + 2
Else
MsgBox "Type inconnu (" & TypeName(nombre) & ")"
End If
End Function
et l'utiliser comme cela :
= FPERSO(A:A)
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)
Magiczorro
Messages postés4Date d'inscriptionvendredi 14 janvier 2011StatutMembreDernière intervention17 janvier 2011 17 janv. 2011 à 23:07
Cela ne fonctionne pas
ActiveCell.Row renvoie la ligne de la cellule active.
j'ai simplement rajouté pour le test la ligne :
MsgBox ActiveCell.Row
Si je me place avec ma fonction sur B2 et que je fais un copier vers le bas (en glissant la cellule) ActiveCell.Row va renvoyer toujours le chiffre 2 bien que le calcul et donc la mise à jour de l'affichage du résultat se fasse sur les lignes suivantes !!
Ce qu'il faudrait c'est le n° de la ligne calculée qui n'est pas forcément la cellule active.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 17 janv. 2011 à 23:51
En effet.
Dans ton cas, il faut rechercher ce que représente une sélection et rechercher la ligne actuellement traitée par Excel (c'est pas gagné).
Puisqu'il s'agit d'un Range --> Voir toutes les propriétés d'un Range, il y a des noms prometteurs comme CurrentRegion, CurrentArray ou Rows.
Voir dans l'aide ce que cela représente et quelle est leur utilité et leurs sous-propriétés, etc.