Colonne entière comme argument de fonction macro

Bonjour,

J'ai besoin d'implémenter une fonction complexe dans excel et pour cela je me suis lancé dans la création d'un module macro en VBA.

J'aimerais que ma fonction puisse prendre en entrée un vecteur de valeurs de ma feuille de calcul excel actuelle, A1:A10 par exemple, pour que le code associé à la fonction puisse faire des opérations sur toutes ces valeurs. Cependant, impossible de trouver la bonne syntax pour 1. envoyer un vecteur colonne a la fonction et 2. trouver la bonne syntaxe du code autour ( comment traduire [A1:A10](i) concrètement dans mon exemple ? etc )

Merci d'avance

Bonjour,

Un fichier exemple avec ce que tu as et ce que tu souhaites obtenir serait préférable pour obtenir une réponse adaptée.

Voilà quelques exemples pour manipuler les plages en VBA:

Columns(i) 'Pour 1 colonne (idem avec "Rows" pour les lignes)
Columns(i:n) 'Pour plusieurs colonnes
Range("A1:A10") 'pour une plage définie
Range("A1:A"&i) 'pour une plage de longueur variable
Range(Cells(1, 1), Cells(i, 1)) 'équivalent à la ligne précédente

Salut Jof38,

toujours faire confiance à VBA et essayer des trucs...

Tu cliques dans n'importe quelle cellule de [A1:A10] ce qui définit un Range que tu envoies en argument à la fonction qui, ici, additionne les valeurs de ce Range et affiche le résultat en [C1].

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim rCells As Range
'
Set rCells = Range("A1:A" & Target.Row)
[C1] = fctCalcul(rCells)
'
End Sub

Public Function fctCalcul(ByVal rCells As Range)
'
fctCalcul = WorksheetFunction.Sum(rCells)
'
End Function

A+

13fctrange.xlsm (12.90 Ko)

Bonjour,

Merci pour vos réponses. Je n'ai pas compris la dernière réponse, mais je vais essayer d'expliquer plus en détail ma question. Je possède 3 colonnes de données, A, B et C de taille 196. J'aimerais coder une fonction f qui utilise ces données, de sorte que :

f(n)=somme(i=1 à n) des [ a^(n-i) * ( R*A(n)+d*B(i) ) ].

Je sais coder cette fonction seulement je ne comprends pas la logique derrière l'envoie des données à la fonction. La fonction a besoin par exemple de calculer un B(i) et je ne sais pas comment lui dire (la syntaxe) ni comment envoyer mes 3 colonnes comme argument.

Salut Jof,

Avec explications, résultat souhaité, etc...

Un dessin vaut mieux que de longs discours!

A+

Bonjour,

Ayant 3 colonnes A, B ,C remplies de données, je souhaite faire cette fonction par exemple.

' Function f(n,a,R,d, ?COLONNE A?, ?COLONNE B?)

' for i=1 To n

' f = f + a^(n-i) * ( R* ?A(n)? +d* ?B(i)? )

' end

' end Function

Les choses entourées de '?' sont celles ou je bloque sur comment faire (syntaxe?). Merci

Quand tu créés une fonction, tu déclares le type de chacune des données d'entrée. Par exemple, COLONNEA As Range. Aussi, une boucle "For" se termine par "Next" et pas "End"...

Encore une fois, difficile de t'aider davantage si tu t'entêtes à ne pas envoyer de fichier...

Bonjour,

J'arrive pas à joindre le fichier, mais voici une fonction qui semble marcher, avec la syntaxe range("A" & i) que je cherchais.

Merci pour vos conseils

Function f(n As Double, q As Double, R As Double, d As Double, A As Range, B As Range)

Dim x As Double

x = 0

Dim tab_A(192) As Double

Dim tab_B(192) As Double

tab_A(0) = 0

tab_B(0) = 0

For i = 1 To 192

tab_A(i) = Range("A" & i)

tab_B(i) = Range("B" & i)

Next

For i = 1 To n

x = x + q ^ (n - i) * (R * tab_A(n) + d * tab_B(i - 1))

Next

f = x

End Function

Pense à prévoir des instructions dans le cas ou la longueur de l'une de tes plages est inférieure à n

Salut Jof,

... et tu as testé en situation réelle cette fonction? Fonctionne vraiment car je ne vois pas où tu te sers de A et B (Range) ?!

Accessoire, mais :

    Dim tab_A(192) As Double
    Dim tab_B(192) As Double
    tab_A(0) = 0
    tab_B(0) = 0

par le simple fait de leur déclaration, tab_A(0) et tab_B(0) = 0 !

Un fichier, stp!

A+

Bonjour,

Oui je sais qu'il y a des petites rallonges ou erreurs, je ne code pas dans ce langage habituellement (vous l'aurez remarqué).

Effectivement cela n'a pas du tout marché en fin de compte. Mais j'ai finalement trouvé comment régler mon problème. Je fixe mes valeurs dans une colonne (A disons) et pour accéder à A(i) dans mon code, j'utilise :

valeur_A_i= Worksheets("Feuille").Range("A" & i).Value

Je n'ai donc plus à envoyer d'argument de type A1:A192 à la fonction. Cependant, si un jour mes valeurs sont dans B, cela ne marche plus, et je ne sais pas comment faire autrement de façon générale.

Voici finalement ma fonction qui marche (vérifié), mes deux colonnes de données sont en B et F :

Function f(n As Double, q As Double, R As Double, d As Double)
Dim p As Double
Dim s As Double
Dim x As Double
x = 0
For i = 2 To n
p = Worksheets("Feuil1").Range("B" & n).Value
s = Worksheets("Feuil1").Range("F" & i - 1).Value
x = x + q ^ (n - i) * (R * p + d * s)
Next
x = x + q ^ (n - 1) * (R + d) * p
f = x
End Function

Si vous savez comment faire ça de façon plus générale, c'est à dire par exemple, si mes colonnes sont en B1:B192, envoyer vector_range=B1:B192 à la fonction et la syntaxe pour avoir la valeur de vector_range_i dans le code, je suis preneur.

Autrement dit : transformer une plage de valeurs quelconque (comme B1:B192) en un vecteur utilisable dans le code : vecteur (i)=valeur de Bi

Merci

Salut Jof,

toujours pas de fichier, merci!

On peut donc sucer de notre pouce!

Dans le fichier joint, un petit délire vite fait pour une manière de faire.

  • clic en [B4] ou [B6] indique à la macro que tu vas sélectionner, par un clic en ligne 1 de cette colonne, la colonne 'A' ou 'B' de ta fonction 'f'. C'est également cette colonne 'A' qui déterminera automatiquement 'n', soit la dernière ligne de la colonne, sauf si tu changes cette valeur manuellement ;
  • si toutes les données de [B4] à [B10] sont complétées, [B2] se colore en orange ;
  • double-clic en [B2] orange déclenche ton calcul dont le résultat s'affiche en [B2].

Accessoirement, ceci est-il juste?

For i = 2 To n

p = Worksheets("Feuil1").Range(Chr(64 + iCol1) & n).Value

Si c'est correct, tu peux placer cette ligne AVANT For i = 2 to n

p = Worksheets("Feuil1").Range(Chr(64 + iCol1) & n).Value

For i = 2 To n

Quelque chose comme ça?

Si tu veux mieux...

A+

6fctrange.xlsm (22.06 Ko)

Si c'est correct, tu peux placer cette ligne AVANT For i = 2 to n

p = Worksheets("Feuil1").Range(Chr(64 + iCol1) & n).Value

For i = 2 To n

Attention, Chr(64 + iCol) n'est valide que pour une plage entre A et Z, AA posera donc problème par exemple. Pourquoi ne pas utiliser "Cells(n, iCol)" ?

[quote=curulis57 post_id=673937 time=1532691068 user_id=38244]

Si c'est correct, tu peux placer cette ligne AVANT For i = 2 to n

p = Worksheets("Feuil1").Range(Chr(64 + iCol1) & n).Value

For i = 2 To n

Attention, Chr(64 + iCol) n'est valide que pour une plage entre A et Z, AA posera donc problème par exemple. Pourquoi ne pas utiliser "Cells(n, iCol)" ?

Salut Pedro,

vite fait, c'est vite fait...

Voilà pour te rassurer...

A+

11fctrange.xlsm (22.95 Ko)

J'ai pas ouvert, mais je suis rassuré !

Salut,

La solution d'envoyer la colonne As String est très intéressante, je modifierai mon programme en utilisant ça.

Vous l'attendiez, le voici le voila, mon fichier !

Merci pour vos réponses,

cordialement

9classeur1.xlsm (29.98 Ko)

Jof,

si tu as encore besoin d'aide, faudra nous dire quelles colonnes sont susceptibles 'd'être sélectionnées (laquelle sera la 'A', laquelle la 'B') et où doit être affiché le résultat de ta fonction.

A+

Rechercher des sujets similaires à "colonne entiere comme argument fonction macro"