OVH Cloud OVH Cloud

Fonction personnalisée

5 réponses
Avatar
garnote
Bonsoir à tous et à toutes,

J'ai un petit souci avec cette fonction personnalisée qui
permet de multiplier chaque élément d'un vecteur-ligne
ou d'un vecteur-colonne v par une constante numérique k :

Function km(k As Double, v As Range)
Dim rep
Dim NL as integer, NC as integer
Dim i as integer
NL = Selection.Rows.Count
NC = v.Cells.Count
ReDim rep(1 To NC)
For i = 1 To NC
rep(i) = k * v(i)
Next i
If NL = 1 Then
km = rep
Else
km = WorksheetFunction.Transpose(rep)
End If
End Function

Si A1 contient 12 et B1:D1 contient 1, 2 et 3, alors:
1. Je sélectionne C4:E4, j'entre la formule =km(A1;B1:D1),
je valide par Ctrl+Maj+Entrée et j'obtiens 12, 24 et 36.
Ce qui est le résultat attendu.
2. Je sélectionne B4:B6, j'entre la formule =km(A1;B1:D1),
je valide par Ctrl+Maj+Entrée et j'obtiens 12, 24 et 36.
Ce qui est le résultat attendu.

Mais voilà, si je change la valeur de A1, B1, C1 ou D1,
la formule se met à jour automatiquement pour 1
mais pas pour 2.
Comment faire pour que 2 se mette à jour automatiquement ?
Et curieusement, si j'efface B4:B6 et tape Ctrl+Z, 2 se met à jour
automatiquement !

Le Tour de France et le Tour de la France, quel magnifique spectacle
cela avoir été. Beau pays vous avez, ça c'est sûr ;-)

Merci et à +

Serge

5 réponses

Avatar
abcd
Il serait plus efficace et plus rapide de remplir ton tableau d'un coup
puis de tout multiplier (surtout s'il y a beaucoup de cellules):

rep = v.value
par exemple (en utilisant un Transpose comme à la fin le cas échéan t si
nécessaire). Puis:
rep(i,j) = k * v(i,j)
ce sera plus malin. De plus tu n'aurais plus à transposer au final

Sinon, je ne vois pas en quoi la selection intervient dans une fonction
NL = Selection.Rows.Count
n'a aucun sens
je pense qu'il s'agit de V.rows.count

Avec mon astuce il te faut compter le nombre de lignes et de colonnes et
cela correspondra aux deux dimensions du tableau obtenu.





Avatar
PMO
Bonjour,

Je pense que l'erreur est la ligne
NL = Selection.Rows.Count


Voici le code modifié
'**********
Function km(k As Double, v As Range)
Dim rep
Dim NL As Integer, NC As Integer
Dim i As Integer
NL = Application.Caller.Rows.Count 'modifiée
NC = v.Cells.Count
ReDim rep(1 To NC)
For i = 1 To NC
rep(i) = k * v(i)
Next i
If NL = 1 Then
km = rep
Else
km = WorksheetFunction.Transpose(rep)
End If
End Function
'**********

Cordialement.
--
PMO
Patrick Morange



Bonsoir à tous et à toutes,

J'ai un petit souci avec cette fonction personnalisée qui
permet de multiplier chaque élément d'un vecteur-ligne
ou d'un vecteur-colonne v par une constante numérique k :

Function km(k As Double, v As Range)
Dim rep
Dim NL as integer, NC as integer
Dim i as integer
NL = Selection.Rows.Count
NC = v.Cells.Count
ReDim rep(1 To NC)
For i = 1 To NC
rep(i) = k * v(i)
Next i
If NL = 1 Then
km = rep
Else
km = WorksheetFunction.Transpose(rep)
End If
End Function

Si A1 contient 12 et B1:D1 contient 1, 2 et 3, alors:
1. Je sélectionne C4:E4, j'entre la formule =km(A1;B1:D1),
je valide par Ctrl+Maj+Entrée et j'obtiens 12, 24 et 36.
Ce qui est le résultat attendu.
2. Je sélectionne B4:B6, j'entre la formule =km(A1;B1:D1),
je valide par Ctrl+Maj+Entrée et j'obtiens 12, 24 et 36.
Ce qui est le résultat attendu.

Mais voilà, si je change la valeur de A1, B1, C1 ou D1,
la formule se met à jour automatiquement pour 1
mais pas pour 2.
Comment faire pour que 2 se mette à jour automatiquement ?
Et curieusement, si j'efface B4:B6 et tape Ctrl+Z, 2 se met à jour
automatiquement !

Le Tour de France et le Tour de la France, quel magnifique spectacle
cela avoir été. Beau pays vous avez, ça c'est sûr ;-)

Merci et à +

Serge














Avatar
abcd
je pense sincèrement qu'il faut plutôt compter le nombre de lig nes dans
la plage v (cela n'aurait de toute façon pas de sens de compter le
nombre de lignes ... de la cellule appelante, on sait qu'il vaut 1).
Avatar
PMO
Bonjour,

Vous faites une confusion entre la plage de données
et la plage où se calcule la fonction.

Effectuez un test de la fonction de Garnote,
dans les mêmes conditions qu'il a décrites,
puis un test de la fonction modifiée, toujours
dans les mêmes conditions, pour mieux vous
rendre compte.

Dans la fonction modifiée vous verrez que
NL = Application.Caller.Rows.Count
(NL= nombre de lignes de la plage où s'effectue la fonction)
renvoie
1) NL=1 si formule en C4:E4
2) NL=3 si formule en B4:B6

Ci-dessous un code exemple qui visualise
le nombre de lignes et l'adresse de la plage
où se calcule la fonction.

'**********
Function km(k As Double, v As Range)
Dim rep
Dim NL As Integer, NC As Integer
Dim i As Integer
NL = Application.Caller.Rows.Count 'modifiée
'--- Pour visualiser NL et Plage appelante ---
MsgBox "Nb lignes=" & NL & vbCrLf & _
"Plage où opère la fonction=" & _
Application.Caller.Address _
(rowabsolute:úlse, _
columnabsolute:úlse)
'---------------------------------------------
NC = v.Cells.Count
ReDim rep(1 To NC)
For i = 1 To NC
rep(i) = k * v(i)
Next i
If NL = 1 Then
km = rep
Else
km = WorksheetFunction.Transpose(rep)
End If
End Function
'**********

Cordialement.
--
PMO
Patrick Morange



je pense sincèrement qu'il faut plutôt compter le nombre de lignes dans
la plage v (cela n'aurait de toute façon pas de sens de compter le
nombre de lignes ... de la cellule appelante, on sait qu'il vaut 1).




Avatar
abcd
exact. Enfin... je n'avais pas à me poser la quesiton, puisque je
suggérais (à juste titre) l'utilisation d'un tableau dès l e départ (il
n'y a plus le besoin de prévoir les deux cas au moment de l'écr iture).