Comment faire appel à une fonction ?

Bonjour,

Je reprend le reprend après ne pas l'avoir utilisé pendant un moment et je suis un peu rouillé. Je n'arrive plus à faire appel à une fonction que j'ai codé dans un sub. Dans l'exemple ma fonction consiste à copier les cellules de la premières ligne d'une feuille vers une autre.

Option Explicit
Sub Bilan_global()

Dim A, B As Worksheet 'Definition des variables
Set A = Worksheets("feuill2"): Set B = Worksheets("feuill1") 'Permet de donner un nom plus court aux feuilles

'Appel à la fonction pour copier les champs de la feuille A vers la feuille B
Call CopieChamps(A, B)

Function CopieChamps(Origine As Worksheet, Destination As Worksheet)
Dim derCol_Origine, derCol_Destination As Integer

Origine.Select 'On se place dans la feuille d'origine
derCol_Origine = Cells(1, Columns.Count).End(xlToLeft).Column 'trouve la dernière colonne de la feuille d'origine
Range(Cells(1, 1), Cells(1, derCol_Autre)).Select 'selectionne les cellules de la premiere ligne jusqu'a la derniere colonne
Selection.Copy ' copie les cellules
Destination.Select 'On se place dans la feuille de destination
derCol_Destination = Cells(1, Columns.Count).End(xlToLeft).Column 'trouve la dernière cellule non vide de la première ligne de destination
Range(Cells(1, derCol_Destination), Cells(1, derCol_Destination + derCol_Origine)).Select 'selectionne la plage de la bonne taille a partir de la derniere colone non-vide
ActiveSheet.Paste 'colle la selection

End Function

J'ai pu essayer ma fonction à coté et le code marche bien mais quand je veux en faire une fonction pour y faire appel ensuitee ca na fonctionne pas.

Merci d'avance pour votre aide.

Bonjour,

il ne faut pas déclarer CopieChamp en Function, Function est utilisé pour créer des fonctions personnalisées directement utilisable dans le tableur Excel, voici ce qu'il faut écrire :

Option Explicit
Sub Bilan_global()

Dim A, B As Worksheet 'Definition des variables
Set A = Worksheets("feuill2"): Set B = Worksheets("feuill1") 'Permet de donner un nom plus court aux feuilles

'Appel à la fonction pour copier les champs de la feuille A vers la feuille B
Call CopieChamps(A, B)

end sub

sub CopieChamps(Origine As Worksheet, Destination As Worksheet)
Dim derCol_Origine, derCol_Destination As Integer

Origine.Select 'On se place dans la feuille d'origine
derCol_Origine = Cells(1, Columns.Count).End(xlToLeft).Column 'trouve la dernière colonne de la feuille d'origine
Range(Cells(1, 1), Cells(1, derCol_Autre)).Select 'selectionne les cellules de la premiere ligne jusqu'a la derniere colonne
Selection.Copy ' copie les cellules
Destination.Select 'On se place dans la feuille de destination
derCol_Destination = Cells(1, Columns.Count).End(xlToLeft).Column 'trouve la dernière cellule non vide de la première ligne de destination
Range(Cells(1, derCol_Destination), Cells(1, derCol_Destination + derCol_Origine)).Select 'selectionne la plage de la bonne taille a partir de la derniere colone non-vide
ActiveSheet.Paste 'colle la selection

End sub

Cher Guillaume,

avec le passage par valeur et non par référence cela fonctionne chez moi

Function CopieChamps(ByVal Origine As Worksheet, ByVal Destination As Worksheet)

à la variable derCol_Autre près

Cordialement,

Cher Guillaume,

avec le passage par valeur et non par référence cela fonctionne chez moi

Function CopieChamps(ByVal Origine As Worksheet, ByVal Destination As Worksheet)

à la variable derCol_Autre près

Cordialement,

Effectivement ca marche comme ca (merci aussi pour avoir reperé le derCol_Autre, une petite erreur quand j'ai voulu réadapter mon code à l'utilisation d'une fonction) ! Est ce que tu saurais m'expliquer pourquoi ca marche comme ca et pas de la manière dont je l'avais fait ?

Dans tout les cas merci à toi

Autre petite question si jamais tu as le temps : maintenant que je fais appelle à cette fonction (3 fois exactement) au lieu de copier 3 fois cette boucle dans ma macro, le temps d’exécution a énormément augmenter. Est ce que c'est normal ou as tu une explication ?

Cher Guillaume,

Je suis heureux que cela fonctionne !

Lorsque l'on passe à une fonction un variable par référence en VBA le "compilateur" en fait une copie locale et les modifications apportées à ladite variable ne sont répercutées que sur la copie.

Lorsque l'on passe une variable par valeur (ByVal) c'est bien la variable elle même qui est passé et modifiée.

Cela dépend donc de son besoin.

Dans votre cas il s'agissait de modifié les feuilles de calcul passé en paramètre donc par valeur...

Pour votre autre problème de temps d'execution je manque d'information et ne suis pas certain de bien comprendre.

Vous effectuez trois fois de suite votre fonction et le temps d'execution est nettement supperieur à trois fois le temps d'execution d'une seule fois la fonction. Est-ce cela ?

Cordialement,

De ce que j'ai compris,

C'est plus long pour lui de faire

Call la fonction

Call la fonction

Call la fonction

que de faire une sorte de boucle

For i = 1 to 3

Faire les instructions qui sont dans la fonction

Next i

Cher Ausecour,

Je n'ai pas la certitude que VBA fonctionne comme ça mais un appel de fonction met en place en général la création d'un contexte et d'une pile d'appel qui ralentissent nécessairement l'execution par rapport à une execution directe des instructions et ce d'autant plus que très souvent ont ne quitte pas proprement les fonctions (liberation de memoire, destruction des objets, ...) même en faisant confiance au garbage collector… Les fonctions c'est pour la mutualisation du code par pour l'optimisation...

Vous pouvez essayer (je ne l'ai pas fais) de libérer vos variables A et B en fin de fonction par exemple par :

A.Dispose()
B.Dispose()

A = Nothing
B = Nothing

Je n'ai pour l'heure pas d'autres idées mais dites moi si cela à amélioré les choses.

Cdlt,

Rechercher des sujets similaires à "comment appel fonction"