Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment modifier une cellule à partir d'une fonction personnalisée exécutée via une autre cellule (ouf... y a quelqu'un ?)

2 réponses
Avatar
Olivier AGLAS
Bonjour à tous,

Je débute avec VBA mais c'est plutôt laborieux : Voilà quelques jours
maintenant que je cherche le moyen de modifier le contenu d'une cellule via
une fonction personnalisée (IFEXIST) exécutée à partir d'autre cellule (is
that possible or not ?). La fonction qui suit lit chacun des numéros de
ligne (propre à la feuille) fournis en paramètre, vérifie (pour chaque n°)
un flag (une cellule) se trouvant sur la ligne désignée (positionné à VRAI
ou FAUX), si ce dernier est VRAI alors elle concatène le n° de ligne aux
précédents traités (s'il y a lieu) avec un séparateur ";" (cette
concaténation est le résultat retourné) mais d'autre part, sur l'ensemble
des lignes en question et dont le flag est VRAI elle effectue une
comparaison portant sur une autre cellule connexe (date), stocke la valeur
la plus élevée dans une variable et (jusque là tout va très bien) et in fine
en plus du résultat de la cellule exécutant la fonction (la concaténation),
une autre cellule sur la même ligne (que la cellule exécutant la fonction)
est modifiée (dans le cas présent, elle ne l'est pas et qui plus est, plus
rien ne marche lorsque je tente cette modif ; la fonction renvoie #VALEUR).
Je n'emploie visiblement pas les bons arguments pour convaincre cette
fonction de faire ce que j'attends d'elle, peut-être même que je poursuis là
un vieux pieu. Qu'en pensez-vous ?

Function IFEXIST(ParamArray Prédécesseur() As Variant)


Dim colSelection, colDatefin, colDatedeb, i As Integer
Dim debFlag As Boolean
Dim datedeb, datefinPrec As Date


colDatedeb = 5
colDatefin = 6
colSelection = 10
datedeb = Cells(ActiveCell.Row - 1, colDatedeb)
'MsgBox datedeb, vbQuestion + vbOKOnly

debFlag = True

For i = 0 To UBound(Prédécesseur())
LigSelection = Prédécesseur(i) + 1
If Cells(LigSelection, colSelection) = "Vrai" Then

datefinPrec = Cells(LigSelection, colDatefin).Value
If datefinPrec > datedeb Then
datedeb = datefinPrec
End If

If debFlag Then
IFEXIST= IFEXIST & Prédécesseur(i)
debFlag = False
Else
IFEXIST= IFEXIST & ";" & Prédécesseur(i)
End If
End If
Next i
'-----------------------------------------------------
ci-après la ligne posant
problème ----------------------------------------------------------
ActiveCell(ActiveCell.Row, colDatedeb).Value = datedeb
End Function

2 réponses

Avatar
AV
maintenant que je cherche le moyen de modifier le contenu d'une cellule via
une fonction personnalisée (IFEXIST) exécutée à partir d'autre cellule


Impossible !

AV

Avatar
LSteph
Bonjour,

"Normalement", une fonction renvoie un résultat.
Pour agir,modifier... directement une cellule ou autre, tu dois utiliser une
procèdure Sub.

Pour que tu puisses adapter à ton objectif particulier,
sache que cela n'empêche pas une sub d'utiliser une function.....
Voici un exemple simple:
'***************
Function Toto(maval As Integer) As Long
Toto = (maval + 2) * 3
End Function
'****
Sub test()
Dim val As Integer

val = InputBox("valeur: ")

With ActiveCell
.Value = "Résultat: " & Toto(val)
.Font.Bold = True
.Interior.ColorIndex = 35
End With
End Sub
'*****************
'lsteph
"Olivier AGLAS" a écrit dans le message de news:
d5g6pp$797$
Bonjour à tous,

Je débute avec VBA mais c'est plutôt laborieux : Voilà quelques jours
maintenant que je cherche le moyen de modifier le contenu d'une cellule
via une fonction personnalisée (IFEXIST) exécutée à partir d'autre cellule
(is that possible or not ?). La fonction qui suit lit chacun des numéros
de ligne (propre à la feuille) fournis en paramètre, vérifie (pour chaque
n°) un flag (une cellule) se trouvant sur la ligne désignée (positionné à
VRAI ou FAUX), si ce dernier est VRAI alors elle concatène le n° de ligne
aux précédents traités (s'il y a lieu) avec un séparateur ";" (cette
concaténation est le résultat retourné) mais d'autre part, sur l'ensemble
des lignes en question et dont le flag est VRAI elle effectue une
comparaison portant sur une autre cellule connexe (date), stocke la valeur
la plus élevée dans une variable et (jusque là tout va très bien) et in
fine en plus du résultat de la cellule exécutant la fonction (la
concaténation), une autre cellule sur la même ligne (que la cellule
exécutant la fonction) est modifiée (dans le cas présent, elle ne l'est
pas et qui plus est, plus rien ne marche lorsque je tente cette modif ; la
fonction renvoie #VALEUR). Je n'emploie visiblement pas les bons arguments
pour convaincre cette fonction de faire ce que j'attends d'elle, peut-être
même que je poursuis là un vieux pieu. Qu'en pensez-vous ?

Function IFEXIST(ParamArray Prédécesseur() As Variant)


Dim colSelection, colDatefin, colDatedeb, i As Integer
Dim debFlag As Boolean
Dim datedeb, datefinPrec As Date


colDatedeb = 5
colDatefin = 6
colSelection = 10
datedeb = Cells(ActiveCell.Row - 1, colDatedeb)
'MsgBox datedeb, vbQuestion + vbOKOnly

debFlag = True

For i = 0 To UBound(Prédécesseur())
LigSelection = Prédécesseur(i) + 1
If Cells(LigSelection, colSelection) = "Vrai" Then

datefinPrec = Cells(LigSelection, colDatefin).Value
If datefinPrec > datedeb Then
datedeb = datefinPrec
End If

If debFlag Then
IFEXIST= IFEXIST & Prédécesseur(i)
debFlag = False
Else
IFEXIST= IFEXIST & ";" & Prédécesseur(i)
End If
End If
Next i
'-----------------------------------------------------
ci-après la ligne posant
problème ----------------------------------------------------------
ActiveCell(ActiveCell.Row, colDatedeb).Value = datedeb
End Function