Problème avec fonction vba

Le
ttcpp
Bonjour,

J'ai créé une fonction en vba avec 2 critères en entrée. J'ai mis
Application volatile true pour que celle-ci se recalcule automatiquement en
cas de changement d'un ou 2 paramètres.
Le problème c'est que j'utlise le résultat de la fonction dans une autre
feuille et que si je fait des maj dedans le résultat de la fonction se trouve
changé alors que les paramètres ne le sont pas. Que je sois en calcul manuel
ou auto, c'est pareil.

Merci pour votre aide

Thierry
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #20639931
Bonjour,

Sans voir la fonction, c'est difficile de se prononcer !
Tu devrais la publier.





"ttcpp" :
Bonjour,

J'ai créé une fonction en vba avec 2 critères en entrée. J'ai mis
Application volatile true pour que celle-ci se recalcule automatiquement en
cas de changement d'un ou 2 paramètres.
Le problème c'est que j'utlise le résultat de la fonction dans une autre
feuille et que si je fait des maj dedans le résultat de la fonction se trouve
changé alors que les paramètres ne le sont pas. Que je sois en calcul manuel
ou auto, c'est pareil.

Merci pour votre aide

Thierry
ttcpp
Le #20641971
Voici le code de la fonction :
Option Explicit
Public Ref_Nom_fichier As String
Public Pos_Control As Integer

Public Function Mois_Budget(arg1 As Range, arg2 As Double) As Double
'arg1 = cellule sur lequel il y a la chaine de caractére qui determine le
mois sur lequel on calcul le prorata
'arg2 = coefficient multiplicateur
Application.Volatile True

Dim N_Ligne, N_Colonne As Integer
Dim Adresse_Fonction As String

N_Ligne = Test_Ligne(arg1)
Adresse_Fonction = Application.Caller.Address(ReferenceStyle:=xlR1C1)
N_Colonne = Val(Right(Adresse_Fonction, Len(Adresse_Fonction) - InStr(1,
Adresse_Fonction, "C")))

If arg1.Value Like "*Q1*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 8,
N_Colonne).Value * arg2
If arg1.Value Like "*Q2*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 6,
N_Colonne).Value * arg2
If arg1.Value Like "*Q3*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 4,
N_Colonne).Value * arg2
If arg1.Value Like "*Q4*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 2,
N_Colonne).Value * arg2

'Application.Volatile False

End Function

Public Function Test_Ligne(r As Range) As Integer
Test_Ligne = r.Row
End Function




"michdenis" wrote:

Bonjour,

Sans voir la fonction, c'est difficile de se prononcer !
Tu devrais la publier.





"ttcpp" :
Bonjour,

J'ai créé une fonction en vba avec 2 critères en entrée. J'ai mis
Application volatile true pour que celle-ci se recalcule automatiquement en
cas de changement d'un ou 2 paramètres.
Le problème c'est que j'utlise le résultat de la fonction dans une autre
feuille et que si je fait des maj dedans le résultat de la fonction se trouve
changé alors que les paramètres ne le sont pas. Que je sois en calcul manuel
ou auto, c'est pareil.

Merci pour votre aide

Thierry



michdenis
Le #20643381
Voici ta fonction modifiée :

A ) Ta fonction n'a pas à être "volatile"... dès que tu changeras
un des 2 paramètres que tu passes à la fonction, cette dernière
sera d'elle-même relancée et réévaluée.

B ) Je n'ai pas vu ton application, mais ta fonction ressemble plus
à une procédure événementielle de ce type existant pour chaque
feuille dans leur feuille respective. Si cela s'applique à un grand
nombre de feuille, il y a un autre événement du ThisWorkbook
qui fait le travail.
'-------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
'-------------------------------

Voilà une suggestion :
'-------------------------------------
Function Mois_Budget(arg1 As Range, arg2 As Double) As Double
'arg1 = cellule sur lequel il y a la chaine de
'caractére qui determine le mois sur lequel on
'calcul le prorata
'arg2 = coefficient multiplicateur

Dim N_Ligne, N_Colonne As Integer
Dim Adresse_Fonction As String
Dim Nom_Feuille As String

N_Ligne = arg1.Row
N_Colonne = arg1.Column
Nom_Feuille = arg1.Parent.Name

If arg1.Value Like "*Q1*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 8, N_Colonne).Value * arg2
If arg1.Value Like "*Q2*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 6, N_Colonne).Value * arg2
If arg1.Value Like "*Q3*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 4, N_Colonne).Value * arg2
If arg1.Value Like "*Q4*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 2, N_Colonne).Value * arg2

End Function
'-------------------------------------




"ttcpp" :
Voici le code de la fonction :
Option Explicit
Public Ref_Nom_fichier As String
Public Pos_Control As Integer

Public Function Mois_Budget(arg1 As Range, arg2 As Double) As Double
'arg1 = cellule sur lequel il y a la chaine de caractére qui determine le
mois sur lequel on calcul le prorata
'arg2 = coefficient multiplicateur
Application.Volatile True

Dim N_Ligne, N_Colonne As Integer
Dim Adresse_Fonction As String

N_Ligne = Test_Ligne(arg1)
Adresse_Fonction = Application.Caller.Address(ReferenceStyle:=xlR1C1)
N_Colonne = Val(Right(Adresse_Fonction, Len(Adresse_Fonction) - InStr(1,
Adresse_Fonction, "C")))

If arg1.Value Like "*Q1*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 8,
N_Colonne).Value * arg2
If arg1.Value Like "*Q2*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 6,
N_Colonne).Value * arg2
If arg1.Value Like "*Q3*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 4,
N_Colonne).Value * arg2
If arg1.Value Like "*Q4*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 2,
N_Colonne).Value * arg2

'Application.Volatile False

End Function

Public Function Test_Ligne(r As Range) As Integer
Test_Ligne = r.Row
End Function




"michdenis" wrote:

Bonjour,

Sans voir la fonction, c'est difficile de se prononcer !
Tu devrais la publier.





"ttcpp" discussion
:
Bonjour,

J'ai créé une fonction en vba avec 2 critères en entrée. J'ai mis
Application volatile true pour que celle-ci se recalcule automatiquement en
cas de changement d'un ou 2 paramètres.
Le problème c'est que j'utlise le résultat de la fonction dans une autre
feuille et que si je fait des maj dedans le résultat de la fonction se trouve
changé alors que les paramètres ne le sont pas. Que je sois en calcul manuel
ou auto, c'est pareil.

Merci pour votre aide

Thierry



ttcpp
Le #20644411
Merci pour ta réponse.
Par contre je ne comprends pas les instructions suivantes
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub


j'ai collé le code dans la feuille ThisWorkbook ou la feuille dans laquelle
se trouve les fonctions, mais je n'ai pas vu de différences. De plus même si
je les met en commentaires, c'est pareil !!!!
Je pense avoir loupé quelque chose.



"michdenis" wrote:

Voici ta fonction modifiée :

A ) Ta fonction n'a pas à être "volatile"... dès que tu changeras
un des 2 paramètres que tu passes à la fonction, cette dernière
sera d'elle-même relancée et réévaluée.

B ) Je n'ai pas vu ton application, mais ta fonction ressemble plus
à une procédure événementielle de ce type existant pour chaque
feuille dans leur feuille respective. Si cela s'applique à un grand
nombre de feuille, il y a un autre événement du ThisWorkbook
qui fait le travail.
'-------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
'-------------------------------

Voilà une suggestion :
'-------------------------------------
Function Mois_Budget(arg1 As Range, arg2 As Double) As Double
'arg1 = cellule sur lequel il y a la chaine de
'caractére qui determine le mois sur lequel on
'calcul le prorata
'arg2 = coefficient multiplicateur

Dim N_Ligne, N_Colonne As Integer
Dim Adresse_Fonction As String
Dim Nom_Feuille As String

N_Ligne = arg1.Row
N_Colonne = arg1.Column
Nom_Feuille = arg1.Parent.Name

If arg1.Value Like "*Q1*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 8, N_Colonne).Value * arg2
If arg1.Value Like "*Q2*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 6, N_Colonne).Value * arg2
If arg1.Value Like "*Q3*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 4, N_Colonne).Value * arg2
If arg1.Value Like "*Q4*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 2, N_Colonne).Value * arg2

End Function
'-------------------------------------




"ttcpp" :
Voici le code de la fonction :
Option Explicit
Public Ref_Nom_fichier As String
Public Pos_Control As Integer

Public Function Mois_Budget(arg1 As Range, arg2 As Double) As Double
'arg1 = cellule sur lequel il y a la chaine de caractére qui determine le
mois sur lequel on calcul le prorata
'arg2 = coefficient multiplicateur
Application.Volatile True

Dim N_Ligne, N_Colonne As Integer
Dim Adresse_Fonction As String

N_Ligne = Test_Ligne(arg1)
Adresse_Fonction = Application.Caller.Address(ReferenceStyle:=xlR1C1)
N_Colonne = Val(Right(Adresse_Fonction, Len(Adresse_Fonction) - InStr(1,
Adresse_Fonction, "C")))

If arg1.Value Like "*Q1*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 8,
N_Colonne).Value * arg2
If arg1.Value Like "*Q2*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 6,
N_Colonne).Value * arg2
If arg1.Value Like "*Q3*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 4,
N_Colonne).Value * arg2
If arg1.Value Like "*Q4*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 2,
N_Colonne).Value * arg2

'Application.Volatile False

End Function

Public Function Test_Ligne(r As Range) As Integer
Test_Ligne = r.Row
End Function




"michdenis" wrote:

> Bonjour,
>
> Sans voir la fonction, c'est difficile de se prononcer !
> Tu devrais la publier.
>
>
>
>
>
> "ttcpp" > discussion
> :
> Bonjour,
>
> J'ai créé une fonction en vba avec 2 critères en entrée. J'ai mis
> Application volatile true pour que celle-ci se recalcule automatiquement en
> cas de changement d'un ou 2 paramètres.
> Le problème c'est que j'utlise le résultat de la fonction dans une autre
> feuille et que si je fait des maj dedans le résultat de la fonction se trouve
> changé alors que les paramètres ne le sont pas. Que je sois en calcul manuel
> ou auto, c'est pareil.
>
> Merci pour votre aide
>
> Thierry
>


michdenis
Le #20644651
Si tu emploies ta fonction dans une cellule, le code doit être copié
dans un module standard.

Et dans une cellule, tu écris : =Mois_Budget(A1,5)
A1 est l'adresse de ta cellule à adapter selon ton application
5 -> coefficient multiplicateur

Si tu fais l'appel de cette fonction à l'intérieur d'une procédure
utilise ceci :

With Worksheets("NomDeLaFeuille")
x = =Mois_Budget(.range("A1"),5)
End Sub
NomDeLaFeuille doit être remplacé par le nom de la vraie feuille.




"ttcpp" :
Merci pour ta réponse.
Par contre je ne comprends pas les instructions suivantes
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub


j'ai collé le code dans la feuille ThisWorkbook ou la feuille dans laquelle
se trouve les fonctions, mais je n'ai pas vu de différences. De plus même si
je les met en commentaires, c'est pareil !!!!
Je pense avoir loupé quelque chose.



"michdenis" wrote:

Voici ta fonction modifiée :

A ) Ta fonction n'a pas à être "volatile"... dès que tu changeras
un des 2 paramètres que tu passes à la fonction, cette dernière
sera d'elle-même relancée et réévaluée.

B ) Je n'ai pas vu ton application, mais ta fonction ressemble plus
à une procédure événementielle de ce type existant pour chaque
feuille dans leur feuille respective. Si cela s'applique à un grand
nombre de feuille, il y a un autre événement du ThisWorkbook
qui fait le travail.
'-------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
'-------------------------------

Voilà une suggestion :
'-------------------------------------
Function Mois_Budget(arg1 As Range, arg2 As Double) As Double
'arg1 = cellule sur lequel il y a la chaine de
'caractére qui determine le mois sur lequel on
'calcul le prorata
'arg2 = coefficient multiplicateur

Dim N_Ligne, N_Colonne As Integer
Dim Adresse_Fonction As String
Dim Nom_Feuille As String

N_Ligne = arg1.Row
N_Colonne = arg1.Column
Nom_Feuille = arg1.Parent.Name

If arg1.Value Like "*Q1*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 8, N_Colonne).Value * arg2
If arg1.Value Like "*Q2*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 6, N_Colonne).Value * arg2
If arg1.Value Like "*Q3*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 4, N_Colonne).Value * arg2
If arg1.Value Like "*Q4*" Then Mois_Budget = _
Worksheets(Nom_Feuille).Cells(N_Ligne - 2, N_Colonne).Value * arg2

End Function
'-------------------------------------




"ttcpp" discussion
:
Voici le code de la fonction :
Option Explicit
Public Ref_Nom_fichier As String
Public Pos_Control As Integer

Public Function Mois_Budget(arg1 As Range, arg2 As Double) As Double
'arg1 = cellule sur lequel il y a la chaine de caractére qui determine le
mois sur lequel on calcul le prorata
'arg2 = coefficient multiplicateur
Application.Volatile True

Dim N_Ligne, N_Colonne As Integer
Dim Adresse_Fonction As String

N_Ligne = Test_Ligne(arg1)
Adresse_Fonction = Application.Caller.Address(ReferenceStyle:=xlR1C1)
N_Colonne = Val(Right(Adresse_Fonction, Len(Adresse_Fonction) - InStr(1,
Adresse_Fonction, "C")))

If arg1.Value Like "*Q1*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 8,
N_Colonne).Value * arg2
If arg1.Value Like "*Q2*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 6,
N_Colonne).Value * arg2
If arg1.Value Like "*Q3*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 4,
N_Colonne).Value * arg2
If arg1.Value Like "*Q4*" Then Mois_Budget = ActiveSheet.Cells(N_Ligne - 2,
N_Colonne).Value * arg2

'Application.Volatile False

End Function

Public Function Test_Ligne(r As Range) As Integer
Test_Ligne = r.Row
End Function




"michdenis" wrote:

> Bonjour,
>
> Sans voir la fonction, c'est difficile de se prononcer !
> Tu devrais la publier.
>
>
>
>
>
> "ttcpp" > discussion
> :
> Bonjour,
>
> J'ai créé une fonction en vba avec 2 critères en entrée. J'ai mis
> Application volatile true pour que celle-ci se recalcule automatiquement en
> cas de changement d'un ou 2 paramètres.
> Le problème c'est que j'utlise le résultat de la fonction dans une autre
> feuille et que si je fait des maj dedans le résultat de la fonction se trouve
> changé alors que les paramètres ne le sont pas. Que je sois en calcul manuel
> ou auto, c'est pareil.
>
> Merci pour votre aide
>
> Thierry
>


Publicité
Poster une réponse
Anonyme