Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec fonction vba

5 réponses
Avatar
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

5 réponses

Avatar
michdenis
Bonjour,

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





"ttcpp" a écrit dans le message de groupe de 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
Avatar
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" a écrit dans le message de groupe de 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



Avatar
michdenis
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" a écrit dans le message de groupe de 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" a écrit dans le message de groupe de
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



Avatar
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" a écrit dans le message de groupe de 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" a écrit dans le message de groupe de
> 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
>


Avatar
michdenis
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" a écrit dans le message de groupe de discussion
:
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" a écrit dans le message de groupe de
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" a écrit dans le message de groupe de
> 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
>