Fonction VBA (facile!)

Bonjour à tous,

je voudrais une fonction valeuractive("nom d'une feuille) qui me renvoie la valeur de devis!B9 si la cellule active est devis!C9 et cela a partir d'une autre feuille (Coco)

11valeuractive.xlsx (9.41 Ko)

merci aux genereux contributeurs !

Bonjour Djidji59430,

Hum... pas très clair ta demande... Voici ce que j'ai compris :

Tu désires envoyer le contenu de la cellule B9 de l'onglet Devis vers l'onglet Coco cellule E4 dès que tu cliques sur la cellule C9 de l'onglet Devis.

Pour faire cela, il faut utiliser le VBA.

Voici ton classeur en retour avec un VBA évènementiel qui déclenche un VBA dans le Module 1 qui fait le transfert dès que tu cliques sur la cellule C9 de l'onglet devis.

Je signale que cette façon de procéder ne me semble pas judicieuse car l'opérateur pourrait par inadvertance cliquer sur la cellule C9.

Il vaudrait mieux mettre en place un signal que l'on pourrait tester pour effectuer le transfert.

Ne connaissant pas le contexte de l'application, je ne puis te proposer une meilleure solution sauf si tu m'en dis plus et surtout que tu envoies ton véritable classeur (sans éléments confidentiels bien entendu)

Merci de confirmer si cela répond à tes attentes.

Chris

8valeuractive.xlsm (16.32 Ko)

merci,

Mais ça doit fonctionner pour toutes les cellules. Si je clique sur C8, (qui devient cellule active) je devrais avoir la valeur 2. (devis!B8) en coco!E4

je fais une liste deroulante dans la colonne C qui depend forcement de la valeur de la cellule B correspondante. Pour une cellule, je sais faire en formule.

Pour la plage ......

Tout doit etre parametrable, rien en fixe....

Crdlmt

Cela tu ne l'avais pas dit...

Voici la version adaptée : dorénavant tout clique dans la colonne C enverra l'équivalent du contenu de la colonne B en Coco E4

Est-ce bien cela ?

Chris

4valeuractive.xlsm (16.85 Ko)

Bonsoir,

En attendant le retour de Chris, ce que vous pouvez tester :

- clic droite sur le nom de l'onglet Devis
- choisir l'option "Visualiser le code"
- Collez le code ci-dessous dans la fenêtre

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("C:C")) Is Nothing Then
    Sheets("Coco").Range("E4") = Target.Offset(0, -1).Value
End If
End Sub

Une fois fait, enregistrez votre fichier au format XLSM pour accepter l'utilisation des macros

Dès que vous sélectionnez une cellule de la colonne C en feuille Devis, la valeur en colonne B sera reportée en E4 de la feuille Coco

Cordialement


Edit : oups, je n'avais vu que Chris avait reposté...

merci a tous les deux

le code chris1945 fonctionne.

celui de dan, je n'ai pas reussi, mais je persevere.

Mais ils ne repondent pas tout a fait a mon cahier des charges. Je voulais une FONCTION a caler dans n'importe quelle cellule, la c'est figé en E4. pareil pour la colonne de depart, elle est figée en A:A.

Autrement dit, parametrer toutes les variables dans les arguments de la fonction.

La demande parait simple, mais la réalisation .....

Crdlmt

Hello,

un peu comme les copains, je ne trouve pas vos explications très claire.

J'essaye moi aussi de vous dire ce que j'ai compris : vous voulez une FONCTION, donc qqchose à mettre dans une cellule du genre =valeuractive(parametre(s)) ?!

Et que cette fonction renvoi la valeur d'une cellule X (laquelle ?) dans une autre feuille (laquelle ?), donc en passant ces informations en arguments de la fonctions ?

=valeuractive("FeuilleSource!CelluleSource";"FeuilleDestination!CelluleDestination") ?

Et, cerise sur le ghetto, que ça fonctionne en cliquant sur une cellule (laquelle ?)

Donc, pour que ça fonctionne en cliquant sur une cellule il faudrait utiliser en plus Private Sub Worksheet_SelectionChange(ByVal Target As Range)

C'est bien ça ?

Une proposition avec VBA si j'ai bien compris, ce dont je suis aussi loin d'être certain également.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column <> 3 Then
        'Sheets("Coco").Range("E4") = "" 'Retirer la remarque si on veut vider la cellule E4
        Exit Sub
    End If

    Sheets("Coco").Range("E4") = Sheets("Devis").Cells(Target.Row, 2)

End Sub
3valeuractive.xlsm (14.98 Ko)

Bonjour

celui de dan, je n'ai pas reussi, mais je persevere.

Peut être ne suivez-vous pas ce que je vous ai écrit
Le fichier en retour où il vous suffit de cliquer dans la colonne C en regard des infos de la colonne B (1, 2, 3) en feuille devis

4valeuractive.xlsm (15.14 Ko)

Mais ils ne repondent pas tout a fait a mon cahier des charges. Je voulais une FONCTION a caler dans n'importe quelle cellule, la c'est figé en E4. pareil pour la colonne de depart, elle est figée en A:A.

Hum... Cela signifie quoi par rapport à votre fichier ?
Si votre cellule E4 peut être différente, il faut changer E4 dans le code par la réf d'une autre cellule.
idem pour la colonne C...

Ce que vous pouvez faire dans le fichier ci-dessus :
1. Allez dans le gestionnaire de noms
2. Créez deux noms (par exemple comme dans cette vue)

image

3. Faites un clic droite sur le nom de l'onglet Devis et choisissez l'option "Visualiser le code"
4. Dans la fenêtre, remplacez toutes les lignes par ceci :

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("col")) Is Nothing Then
    Sheets("Coco").Range("celdest") = Target.Offset(0, -1).Value
End If
End Sub

En cas de changement de cellule E4 en feuille coco ou de colonne C en feuille Devis, il vous suffit d'aller modifier les références dans le gestionnaire de noms

Crdlt

Bonjour à tous,

On peut dire que tu distilles les informations au compte gouttes...

Pourquoi ne pas donner ton cahier des charges complet dès la première demande ?

Voici une solution avec un onglet supplémentaire appelé Paramètres dans lequel tu spécifies :

- la cellule à alimenter dans l'onglet Coco

- la colonne dans l'onglet Devis qui doit déclencher le transfert

Je t'ai fait un deuxième exemple en G4 pour l'onglet Coco et colonne 6 pour l'onglet devis. Cela suppose, bien évidemment que la valeur à transférer se trouve immédiatement à gauche de la colonne 6.

J'espère que tu n'as plus d'autres critères à ajouter...

Chris

5valeuractive2.xlsm (20.86 Ko)

Bonjour,

Les nouvelles versions fonctionnent parfaitement pour le but recherché, avec un faible pour celle de chris qui est parametrable.

Excusez moi pour le manque de clarté (pour certains) de ma demande.

Si j'avais mis

"je voudrais une fonction ValeurActive("nom d'une feuille") qui me renvoie la valeur de la cellule adjacente gauche a la cellule active dans cette feuille, et cela a partir d'une autre feuille ,"

eus-je été plus clair ??

je ne pense pas, et c'est pour expliciter ma demande que j'avais donné un exemple concret , a ne pas prendre au pied de la lettre, vu que c'était un exemple !

Merci encore a tous

Cependant, j'esperais une fonction ........Si ça se trouve, je demande n'importe quoi, mais je ne connais pas le VBA
Crdlmt

Re

Les nouvelles versions fonctionnent parfaitement pour le but recherché, avec un faible pour celle de chris qui est parametrable.

Si vous regardez ma dernière proposition, elle l'est également.
Comme vous êtes plutot coté Formule en excel, comme expliqué il vous suffit de changer la valeur des deux noms dans le gestionnaire de noms.
Le tout fonctionne avec une macro de 3 lignes.

A vous de voir..

Crdlt

allez, exaequo !

Crdlmt

Bonsoir à tous,

Content que cela te convienne.

J'avais bien compris que tu désirais une "fonction" mais une fonction qu'elle soit initialement prévue dans Excel comme SOMME ou construite par VBA à l'aide d'un module avec un VBA sous "Function" ne convient pas à ta problématique qui demande de réagir à un clic dans une cellule de la feuille.

Pour cela il faut une macro évènementiel qui doit être implantée dans la feuille où l'évènement se déclenche (chez toi "Devis"). Il existe différents évènements qui peuvent déclencher ce VBA. Dans ton cas c'est l'évènement "changement de sélection". Va voir sur le net : il y a de nombreux tutoriaux qui expliquent les macros évènementiels.

Or, dans ta problématique, il faut aller cherchez des informations dans l'onglet Paramètres et écrire dans l'onglet Coco ce qui n'est pas permit par Excel : un VBA évènementiel ne peut travailler que dans la feuille où il est implanté.

C'est pourquoi, comme tu le verras, le VBA de l'onglet Devis se contente de prendre les coordonnées de l'endroit où se trouve le curseur qui a provoqué l'évènement et puis il lance un VBA qui se trouve dans un Module qui lui peut atteindre toutes les feuilles du classeur.

Pour faire cela, il a fallut déclarer des variables "Public" puisque le premier VBA enregistre les coordonnées du curseur que nous allons utiliser dans le deuxième VBA et les variables déclarées à l'aide de DIM dans un VBA ne restent valable que pour le VBA en cours. Pour pouvoir utiliser une variable d'un VBA à un autre, il faut des variables "Public".

Pour déclarer des variables "Public" il faut le faire au début d'un Module avant le VBA avec l'instruction "Public" et non pas "Dim".

Voilà, j'espère que ces explications te permettront de mieux comprendre le mécanisme et pourquoi nous ne t'avons pas proposé de "fonction"

N'hésites pas à poser les questions nécessaires car je suppose que tu vas devoir implanter la solution dans un autre classeur.

Bonne continuation

Chris

bah moi je reste septique sur les Sub (et pas Function) qui sont paramétrables mais en dur

Je voulais une FONCTION a caler dans n'importe quelle cellule

Moi j'avais compris une fonction genre =mafonctionperso(mesparamètres)

je voudrais une fonction ValeurActive("nom d'une feuille") qui me renvoie la valeur de la cellule adjacente gauche a la cellule active dans cette feuille, et cela a partir d'une autre feuille ,"

Bref, ça reste pas clair pour moi

Edit suite à la réponse de CHRIS1945

@CHRIST1945 : est-ce que Private Sub Workbook_SheetActivate(ByVal Sh As Object) ne pourrait pas agir sur une fonction perso Function Ma_Fonction(...) ?

Nain porte koi

Tu avais bien compris, mais Chris a expliqué que ce n'etait pas possible !

Crdlmt

Bonsoir Nain porte quoi et Djidji59430,

Pour répondre à Nain porte quoi : je ne vois pas comment l'activation de la feuille permette de savoir la ligne qui est concernée.

C'est cela qui est le complication de cette application. Djidji désire lancer le transfert lorsque l'on clique dans une cellule d'une colonne. Pour moi il n'y a que le changement de sélection qui permette de déclencher le VBA évènementiel et connaître la ligne concernée. Je ne vois vraiment pas comment une fonction pourrait :

- agir à partir d'un clic

- connaître la ligne

Normalement cette fonction devrait être mise dans la feuille Coco en E4 par exemple mais comment ne la mettre en fonction qu'à partir d'un clic et comment alimenter les paramètres de ligne et de colonne ??? En plus E4 est volatil donc où mettre la fonction ??

Alors oui, je vois bien une façon de faire mais elle est bien plus compliquée que ce que j'ai proposé à savoir :

1 Faire le vba évènementiel tel que dans ma proposition mais à la place d'effectuer le transfert, on alimente la feuille Coco avec les coordonnées ligne et colonne de la cellule où l'on clique dans 2 cellules techniques

2 En E4 de la feuille Coco on insère une fonction (à construire) avec comme paramètres la ligne et la colonne sauvée en 1 mais franchement c'est ce compliqué la vie et comme le cahier des charges précise que les plages et cellule de réception sont volatile... cela oblige quand même à avoir une feuille paramètres.

Je ne dis pas qu'il n'y a pas d'autres solution mais je pense pas que se soit possible avec une fonction.

Bonne nuit

Chris

Bonjour

@djidji59430,

allez, exaequo !

Lol ! ce n'est pas une compétition....

Comme dans le fichier de Chris1945, si vous ajoutez la feuille Paramètres dans le fichier que je vous ai proposé ici --> https://forum.excel-pratique.com/s/goto/1262991 , il suffit de remplacer le code par celui ci-dessous :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Sheets("Paramètres")
    If Not Intersect(Target, Columns(.Range("B4"))) Is Nothing Then
        Sheets("Coco").Range(.Range("B3")) = Target.Offset(0, -1).Value
    End If
End With
End Sub

Ici on n'a plus besoin des noms dans le gestionnaire de noms proposés dans le post précédent puisque l'on utilise la feuille Paramètres pour pêcher les variables E4 et colonne.

NB : pour la question de Nain, je rejoins les commentaires de Chris1945. Une macro "Function" ne me semble pas avoir un intérêt et si même probablement faisable, dans cette demande cela compliquerait le "machin". Après tout si on ne calcule rien, pourquoi utiliser une macro Function
Je pense que n'étant pas actif sur le VBA, djidji59430 a utilisé le mot "fonction" en pensant plutôt à "fonctionnalité"

Cordialement

Rechercher des sujets similaires à "fonction vba facile"