Garder une valeur de variable d'une procédure à l'autre

mathioustone

XLDnaute Nouveau
Bonjour à tous,

Sur mon programme, j'ai trois fonctions qui sont les suivantes:


•sub worksheet_change(Byval target as range) qui effectue une première saisie
•sub saisie2() qui permet une saisie manuelle des cellules restantes
•sub calcul() qui effectue les calculs selon les infos précédemment remplies

Le problème est le suivant:
j'utilise dans la fonction worksheet_change
i = Target.Row afin d'avoir la ligne sélectionnée => date_travaux = Range("AV" & i)

cependant, la valeur de i disparaît dès que je quitte ma fonction sub worksheet_change...
A quoi celà est dû? puis-je parer ce problème et si oui comment?
Merci de l'attention et bonne continuation
Math'
 

Etienne2323

XLDnaute Impliqué
Re : Garder une valeur de variable d'une procédure à l'autre

Salut mathioustone,
À noter que les varibles qui sont déclarer dans une routine se ferment lorsque tu atteint le "End Sub" ou un "Exit Sub". Si tu souhaites les conserver, il faut les déclarer différemment.

Ainsi, si les 3 macros sont dans le même module, alors tu n'as qu'à déclarer ton i en haut du module, au dessus de ton premier Sub

Code:
Dim i as integer

Si les 3 macros se trouvent dans des modules différents, alors utlises ceci

Code:
Public i as integer

Cordialement,

Étienne
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Garder une valeur de variable d'une procédure à l'autre

Bonjour
Sans doute parce que c'est une variable locale à la Sub Worksheet_Change (et non pas fonction).
c'est à dire qu'elle est déclarée dans cette Sub ou nulle part.
Déclarez la en tête du module pour qu'elle soit connue par toutes les procédures de celui ci,
Déclarez la Public, même, si vous voulez qu'elle soit connue dans tous le projet VBA.

On s'est croisé.
 

mathioustone

XLDnaute Nouveau
Re : Garder une valeur de variable d'une procédure à l'autre

Pour info: mes trois procédures sont dans le même module et les déclarations sont toutes faites dans la zone tout en haut de la page: "déclaration", ainsi:

Dim Reponse, Secteur, surface, COP, N, coeff, R, Dateconstruction, cumac, construction, P, Uw, rendement As Integer
Public i, saisie As Integer
Dim reference, energie, zone, activite As String

' Ecriture
Sub Worksheet_Change(ByVal Target As Range)

i = Target.Row
j = Target.Column
date_travaux = Range("AV" & i)
If Target.Column = Range("AW" & i).Column Then...[...] et mon code continue
End sub

Cependant, ma valeur se perd automatiquement après le "End Sub".
 
G

Guest

Guest
Re : Garder une valeur de variable d'une procédure à l'autre

Bonjour,

Dans le même module oui mais pas dans le même que Worksheet_change, dans un module général avec les macros.

Si tu veux garder i dans le module de la feuille, même déclarée en public, tes macro dans un module général ne pourront l'atteindre qu'en la faisant précéder de la feuille à laquelle elle appartient suivi d'un point.
Code:
Sub MaMacro()
Dim Ligne as Long
Ligne= Sheets("Feuil1").i 
End Sub
Parce que le module de code de la feuille est un module 'objet' et i une de ses propriétés.

Petites précision:
dans une ligne comme celle ci-dessous, seulle la dernière variable est de type Integer, Les autres sont des variant. Répéter autant de fois As Integer que de variables. (Idem pour tous les types)
Code:
Dim Reponse, Secteur, surface, COP, N, coeff, R, Dateconstruction, cumac, construction, P, Uw, rendement As Integer
 
Dernière modification par un modérateur:

mathioustone

XLDnaute Nouveau
Re : Garder une valeur de variable d'une procédure à l'autre

ok pour la déclaration, mais le code ne va toujours chercher la valeur de ma variable.
J'y ai un peu réfléchis et la procédure: worksheetchange est évenementielle, elle ne s'active que lorsque ma souris sélectionne une cellule puis se remet au repos une fois que le code s'est effectué.
C'est peut-être pourquoi la valeur de ma variable i ne se garde pas.
Pour finir, ta solution Hasco me fait apparaître une erreur d'exécution '438' où la propriété ou la méthode non gérée par à l'objet -_-
Je plane unpeu sur ce coup la :'(
 
G

Guest

Guest
Re : Garder une valeur de variable d'une procédure à l'autre

Bonjour,

Dans le fichier joint un exemple avec une variable pubique déclarée dans Module1
Une variable public déclarée dans le module de code de la feuille 1
une valeur passée en paramètre à une macro de module1.
Toutes les variables sont affichée par la macro.

A+

P.S. c'est à toi normalement de nous passer un fichier exemple!!!!!
 

mathioustone

XLDnaute Nouveau
Re : Garder une valeur de variable d'une procédure à l'autre

Merci bien pour les infos, voici mon code:

Code:
Dim Reponse As Integer
Public i, saisie As Integer
Dim reference, energie, zone, activite As String

' Ecriture
Sub Worksheet_Change(ByVal Target As Range)    
i = Target.Row
j = Target.Column
date_travaux = Range("AV" & i)

If Target.Column = Range("AW" & i).Column Then
    Reponse = MsgBox(" Accepter secteur:" & Range("AW" & i).Text & "?", vbYesNo, "Message d'alerte")
    If Reponse = vbYes Then
        Range("AX" & i).Activate
    ElseIf Reponse = vbNo Then
        Range("AX" & i).Activate
        MsgBox ("Sélectionner un nouveau secteur")
        Range("AW" & i).Activate
    End If
End If
' [...] code supprimé taille trop importante
If Range("BC" & i) = "Construite avant 1975" Then
    construction = 1
ElseIf Range("BC" & i) = "Construite après 1975 et avant 2006" Then
    construction = 2
End If
End Sub

Sub saisie2()
If saisie = 1 Then
MsgBox (" Veuillez saisir les paramètres correspondants au certificat choisi puis appuyer sur OK dans la cellule kWh cumac ")
End If
End Sub

Private Sub ok_Click()
    If (Not IsEmpty(Range(Cells(i, 49), Cells(i, 52)))) And (Not IsEmpty(Cells(i, 54))) Then
        R = Range("BH" & i).Value
        COP = Range("BG" & i)
        surface = Range("BD" & i).Value
        P = Range("BF" & i).Value
        Uw = Range("BH" & i).Value
        rendement = Range("BI" & i).Value
        N = Range("BE" & i).Value
            If reference = "BAR-EN-01" Then
        end sub
Voila le code en question, mais je n'y comprend toujours rien car les différentes méthodes utilisées sont similaires à celle-ci... Quelques explications seraient les bienvenues ^^ Merc d'avance
 
G

Guest

Guest
Re : Garder une valeur de variable d'une procédure à l'autre

Re,

Ceci est faux
worksheetchange est évenementielle, elle ne s'active que lorsque ma souris sélectionne une cellule

C'est WorkSheet_SelectionChange qui le fait.

Je ne peux rien faire avec ton code.

Sois tu nous donnes un fichier exemple <50ko sur le forum (pas ailleurs) avec quelques données bidons et anonymes et les macros soit j'abandonne, sinon nous allons tourner en rond et dans 50 messages le problème ne sera pas résolu.

A+
 

Dranreb

XLDnaute Barbatruc
Re : Garder une valeur de variable d'une procédure à l'autre

Bonjour,
Le mieux serait de mettre des points d'arrêts et un espion sur ta variable et de dérouler en pas à pas pour voir à quel moment sa valeur cesse d'être bonne.
Pas exclut qu'il faille mettre Application.EnableEvents = False à certains endroits.
Et puis ne plus laisser Variant la plupart des variables, comme déjà dit par Hasco, les typer explicitement.
 

Banzai64

XLDnaute Accro
Re : Garder une valeur de variable d'une procédure à l'autre

Bonjour
En suivant l'idée de Hasco
Places tes déclarations de variable dans un module
Mais attention cette variable ne sera initialisée quand une cellule de la page aura été modifiée
Alors vérifies la valeur de cette variable dans une macro qui l'utilise
Bonne journée
 

mathioustone

XLDnaute Nouveau
Re : Garder une valeur de variable d'une procédure à l'autre

ce que je souhaite faire:
lorsque je sélectionne ma cellule et que je change la valeur, ma cible obtient comme valeurs les coordonnées de la cellule: ça ok, à l'aide de sub worksheet_change(byval target as range)
ensuite, j'extrait la ligne des coordonnées: i = target.row
et enfin j'utilise cette donnée dans une autre module, fonction ou procédure ( je sais plus trop lequel utiliser à présent) r = range("A" & i) par exemple.

Le problème est que ( grâce au pas à pas) j'ai pu remarquer que la valeur retourne à son état initial lorsque je quitte la procédure worksheet_change.
j'en conclue que je ne dois donc pas utiliser de procédure mais plutôt une fonction ou un module qui pourront renvoyer cette valeur mais comment établir une fonction ou un module à partir de ma procédure déjà programmée?
HELP je couuuuuule :( merci d'avance (je peux envoyer le code par mail si besoin est.
Merci à tous pour l'aide fournie
 

Discussions similaires

Statistiques des forums

Discussions
312 222
Messages
2 086 390
Membres
103 199
dernier inscrit
ATS1