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 ;-)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.
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
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 ;-)
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
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).
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).
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).
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).
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).
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).