Fonction "mise par une macro"

LeRevenant

XLDnaute Occasionnel
Salut tout le monde.

J'ai fait un fichier qui marche à l'heure actuelle, mais qui ne marchera plus si jamais on le touche (en rajoutant des colonnes par exemple). Je m'explique :

Dans l'onglet calcul les éléments utiles sont en jaune. La colonne E et la colonne F sont remplis par une macro (la seule qu'il y a à l'heure actuelle dans ce fichier). Le truc c'est que plus tard le tableau sera modifié par mes collaborateurs et ressemblera par exemple à l'onglet "Calcul plus tard".

Je pense avoir été assez clair, si jamais vous avez un doute, ne vous cassez pas les pieds et posez moi la question avant de vous prendre la tête (pour rien si jamais ce n'est pas clair). Merci beaucoup du temps que vous me consacrez.

Bonne soirée :)

PS: Je suis obligé de faire remplir les colonnes E et F par un macro, croyez moi le vrai fichier que je ne peux malheureusement pas donner est conçu comme ça...
 

Pièces jointes

  • Fonction qui peut changer sous vba.xlsm
    14.9 KB · Affichages: 33

jp14

XLDnaute Barbatruc
Re : Fonction "mise par une macro"

Bonsoir LeRevenant , Lone-wolf


Ci dessous une fonction qui recherche l'adresse de la colonne en fonction de l'entête .
Au lieu de mettre A ou B ou .. on utilise RechercheCol("Feuille1" , 1, "Texte").
La Fonction retourne A ou B ..AA

Code:
Function RechercheCol(Nomfeuille As String, LigEntete As Long, Entete As String) As String
Dim Cell As Range, Plg As Range
Dim £a As String
With Sheets(Nomfeuille)
Set Plg = .Range(.Cells(LigEntete, 1), .Cells(LigEntete, .Cells(LigEntete, Rows(1).Cells.Count).End(xlToLeft).Column))
For Each Cell In Plg
       If Entete = Cell Then
            £a = Cell.Address
            £a = Replace(£a, LigEntete, "")
            RechercheCol = Replace(£a, "$", "")
            Exit Function
        End If
 Next Cell
End With
End Function

JP
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Fonction "mise par une macro"

Re

Bonsoir JP :)


Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("C3:F65000") = "" Then Exit Sub
If Not Intersect(Target, Range("D3:D65000")) Is Nothing Then
Target.Offset(0, 1) = Application.Sum(Target.Offset(0, -1), Target.Offset(0, 0))
Target.Offset(0, 2) = WorksheetFunction.VLookup(Target.Offset(0, 1), Feuil2.[A:B], 2, 0)
End If
End Sub
 

LeRevenant

XLDnaute Occasionnel
Re : Fonction "mise par une macro"

Salut :)
Merci pour ta réponse.

Code:
Function RechercheCol(Nomfeuille As String, LigEntete As Long, Entete As String) As String
Dim Cell As Range, Plg As Range
Dim £a As String
With Sheets(Nomfeuille)
Set Plg = .Range(.Cells(LigEntete, 1), .Cells(LigEntete, .Cells(LigEntete, Rows(1).Cells.Count).End(xlToLeft).Column))
For Each Cell In Plg
       If Entete = Cell Then
            £a = Cell.Address
            £a = Replace(£a, LigEntete, "")
            RechercheCol = Replace(£a, "$", "")
            Exit Function
        End If
 Next Cell
End With
End Function
Je pense que ta macro est bonne, mais il s'avère qu'il manque "End Sub" dans la macro, j'ai donc essayé de le mettre à la fin, ou juste au dessus de "End With" et ça n'a pas marché :/ T'as une idée d'où je dois le mettre s'il te plait?
Merci :)
À bientôt
 

LeRevenant

XLDnaute Occasionnel
Re : Fonction "mise par une macro"

Bonjour,

Si jamais le revenant revient :
nomme tes plages C3:C6 elem1 et D3:D6 elem2.
Ta formule en E3 devient =elem1+elem2 et supportera l'insertion/suppression de colonnes.
eric

J'avais pensé à faire un truc comme ça, mais comment lui faire comprendre que pour E5 il faut prendre en compte la 5ème ligne de [elem1] et la 5ème ligne de [elem2]? Et ainsi de suite (pour E2000 la 2000ème ligne de [elem1] et la 2000ème ligne de [elem2])
 

LeRevenant

XLDnaute Occasionnel
Re : Fonction "mise par une macro"

Salut,
Cette macro semble très bien.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("C3:F65000") = "" Then Exit Sub
If Not Intersect(Target, Range("D3:D65000")) Is Nothing Then
Target.Offset(0, 1) = Application.Sum(Target.Offset(0, -1), Target.Offset(0, 0))
Target.Offset(0, 2) = WorksheetFunction.VLookup(Target.Offset(0, 1), Feuil2.[A:B], 2, 0)
End If
End Sub

Je comprends juste pas pourquoi j'ai le même problème qu'avec JP14 où Excel me dit "il manque End Sub dans votre macro"
Alors qu'il y est très bien.

Je vous tiens au jus.
 

eriiic

XLDnaute Barbatruc
Re : Fonction "mise par une macro"

Bonjour,

J'avais pensé à faire un truc comme ça, mais comment lui faire comprendre que pour E5 il faut prendre en compte la 5ème ligne de [elem1] et la 5ème ligne de [elem2]? Et ainsi de suite (pour E2000 la 2000ème ligne de [elem1] et la 2000ème ligne de [elem2])
Il le comprend tout seul sinon je ne l'aurais pas mis.
Essaie
eric
 

jp14

XLDnaute Barbatruc
Re : Fonction "mise par une macro"

Bonjour LeRevenant, Le Forum

Ce n'est pas une macro mais une fonction.

En reprenant le code de la macro

Range("G3").Select

on remplace G par la fonction
Range(RechercheCol("Calcul plus tard" , 2, ") & "Nom") & "3").Select

RechercheCol contient le résultat de la recherche.


Bonne journée

JP
 
Dernière édition:

LeRevenant

XLDnaute Occasionnel
Re : Fonction "mise par une macro"

Salut,

Même si le problème a été résolu d'une très bonne et simple manière par Éric, j'ai essayé de comprendre ta méthode (car ce qui compte c'est apprendre).

Mais je ne comprends absolument rien à ce que tu racontes... :/

Bonne aprème :)
 

Discussions similaires

Réponses
5
Affichages
398

Membres actuellement en ligne

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal