Microsoft 365 Pb de valeur de variable entre Sub

loreak

XLDnaute Nouveau
Bonjour à tous,

Mon problème est que dans le 1er Sub je défini la valeur de deux variables "nomDossier" et "N_Dossier". Durant l'exécution du 1er programme à chaque fois que j'appel les variables elles sont égales aux valeurs que je leur ai définies. Cependant, dans le second Sub, les variables ne sont pas égales aux valeurs défini dans le 1er Sub. Elles sont égales à 0. Que faire ?

PS : Le 2ème Sub est Appeler dans le 1er sub

Voci le 1er Sub :
VB:
Public Sub CreerNouveauDossier()
    
    ' Spécifie le nom du dossier à créer
    Dim nomDossier As Integer
    Dim N_Dossier As Integer
    Dim Firstcell As Long
    Dim maFormule As String
    Dim Lignecoller As Long
    Dim cheminDossier As String
    Dim nomFichier As String
    Dim plageDonnees As String
    Dim feuilleSource As String
    Dim colonneResultat As String
    
    nomDossier = InputBox("Veuillez saisir le nom du nouveau dossier : [exemple : Ligne 24 (attention à ne pas mettre d'espace,ni avant, ni après)]", "Nouveau Dossier")
    N_Dossier = InputBox("Veuillez saisir le N° de la nouvelle ligne : (exemple : 24)", "Nouveau Dossier")
    
    ' Vérifie si l'utilisateur a saisi un nom de dossier
    If nomDossier <> "" Then
        ' Spécifie le chemin complet du nouveau dossier
      
        cheminDossier = "S:\Fabrication\Service_Fabrication\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\" & nomDossier

        ' Vérifie si le dossier n'existe pas déjà
        If Dir(cheminDossier, vbDirectory) = "" Then
            ' Crée le dossier
            MkDir cheminDossier
            cheminDossierArchives = "S:\Fabrication\Service_Fabrication\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\" & nomDossier & "\" & "Archives"
            MkDir cheminDossierArchives
            MsgBox "Le dossier '" & nomDossier & "' a été créé dans S:\Fabrication\Service_Fabrication\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\"
            
            'identifier le chemin du fichier (Copie du fichier que l'on doit réaliser)
            chemin_Orginal = "S:\Fabrication\Service_Fabrication\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\Fichier OEE (original)" & "\"
            Nom_Original = "OEE Lxx année en cours.xlsm" 'Nom du fichier
            chemin_fichier = chemin_Orginal & Nom_Original
            
            'identifier le chemin du fichier (destination)
            Chemin_Archive = "S:\Fabrication\Service_Fabrication\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\" & nomDossier & "\" 'Chemin d'accès au dossier
            Nom_Archive = "OEE L" & N_Dossier & " année en cours.xlsm" 'Nom du fichier
            chemin_destination = Chemin_Archive & Nom_Archive
            
            'copier le fichier sans l'ouvrir
            FileCopy chemin_fichier, chemin_destination
                        
            'Parametre le fichier crée au nom du fichier choisi par l'utilisateur
            Workbooks.Open chemin_destination
            Sheets("suppression données").Activate
            ActiveSheet.Unprotect "1234"
            Sheets("suppression données").Range("B20").Value = N_Dossier
            DonnéesD16 = Sheets("suppression données").Range("D16").Value
            ActiveSheet.Protect Password:="1234", Contents:=True, AllowUsingPivotTables:=True
            ActiveWorkbook.Close SaveChanges:=True 'pas sur du code, il peut fermer le fichier ou le code se situe
            
            
            'Derterminer la 1ère cellule vide dans la feuille Sauvegarde&Sup des données
            Worksheets("Données").Activate
            DernièreLigne1 = Cells(Rows.Count, 1).End(xlUp).Row
            DernièreLigne = DernièreLigne1 + 1
            
            'permet de créer les chemins de destination
            Range("A" & DernièreLigne).Value = "L" & N_Dossier
            Range("B" & DernièreLigne).Value = DonnéesD16
            Range("C" & DernièreLigne).Value = Nom_Archive
            Range("D" & DernièreLigne).Value = "S:\Fabrication\Service_Fabrication\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\" & nomDossier & "\Archives"
            
            'Call du 2ème Sub
            Call Insertion_Fichier_Suivi_OEE
            
        
              Else
            ' Affiche un message d'erreur si le dossier existe déjà
            MsgBox "Le dossier '" & nomDossier & "' existe déjà dans S:\Fabrication\Service_Fabrication\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\. Veuillez choisir un autre nom.", vbExclamation
            Exit Sub ' Arrête le processus en cas d'erreur
        End If
    Else
        ' Affiche un message d'erreur si aucun nom de dossier n'a été saisi
        MsgBox "Veuillez saisir un nom de dossier.", vbExclamation
        Exit Sub ' Arrête le processus en cas d'erreur
    End If
End Sub

Voici le 2ème sub :

VB:
Public Sub Insertion_Fichier_Suivi_OEE()
    Dim Firstcell As Long
    Dim maFormule As String
    Dim Lignecoller As Long
    Dim cheminDossier As String
    Dim nomFichier As String
    Dim plageDonnees As String
    Dim feuilleSource As String
    Dim colonneResultat As String
    
    ' Ouvrir le classeur contenant les données
    Workbooks.Open "G:\Bases de données ligne éléctronique UO1\OEE SMT\SHOP1 - Suivi OEE année en cours.xlsm"
    
    '******************************************************************************************************************************
    '******************************Daily OEE Janvier*******************************************************************************
    '******************************************************************************************************************************
    ' Activer la feuille "OEE QUOTIDIEN Janvier"
    Sheets("OEE QUOTIDIEN Janvier").Activate
    ' Trouver la première cellule vide dans la colonne B
    Firstcell = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row
    ' Insérer une nouvelle ligne
    Rows(Firstcell).Insert
    'Repères pour coller la formule + déterminer la dernière ligne
    JFMJAOD = "AH"
    AJSN = "AG"
    Fev = "AF"
    FinMois = JFMJAOD
    MsgBox (nomDossier)
    colonneResultat = "C" & Firstcell - 1
    colonneResultatMois = FinMois & Firstcell - 1 'Soit AH--> mois 31jours / AG--> mois 30jours ou AF--> Février à modif pour les différent mois
     'Noter le nom de la ligne
    Range("B" & Firstcell - 1).Value = "L" & N_Dossier
    ' formule à étirer pour l'OEE de chaque jour (à modifier pour chaque mois)
    maFormule = "=IFERROR(HLOOKUP(C$3,'G:\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\" & nomDossier & "\[OEE L" & N_Dossier & " année en cours.xlsm]Suivi OEE et OEE Suivi pertes'!$B$35:$AF$36, 2, FALSE), """")"
    Range(colonneResultat).Formula = maFormule
    'formule à étirer pour l'OEE de chaque jour [Soit AH--> mois 31jours / AG--> mois 30jours ou AF--> Février à modif pour les différents mois]
    Range(colonneResultat).AutoFill Destination:=Range(colonneResultat & ":AG" & Firstcell - 1), Type:=xlFillDefault
    Range(colonneResultatMois).Formula = "=IFERROR(HLOOKUP(" & FinMois & "$3,'G:\Bases de données ligne éléctronique UO1\OEE ligne électronique UO1\" & nomDossier & "\[OEE L" & N_Dossier & " année en cours.xlsm]Suivi OEE et OEE Suivi pertes'!$A$119:$M$120, 2, FALSE),"""")"
    
    End Sub

Merci d'avance pour vos réponses.
Bonne journée.
 
Solution
Re,
Sans fichier aucune idée.
D'après votre code il attend un nombre puisque déclaré en "Integer".
Cela devrait marcher comme avant.
En PJ un test avec :
VB:
    Public nomDossier As Integer
    Public N_Dossier As Integer
Public Sub CreerNouveauDossier()
    nomDossier = InputBox("Veuillez saisir le nom du nouveau dossier : [exemple : Ligne 24 (attention à ne pas mettre d'espace,ni avant, ni après)]", "Nouveau Dossier")
    N_Dossier = InputBox("Veuillez saisir le N° de la nouvelle ligne : (exemple : 24)", "Nouveau Dossier")
End Sub
Public Sub Insertion_Fichier_Suivi_OEE()
    MsgBox "NomDossier récupéré : " & nomDossier & Chr(10) & Chr(10) & _
            "N_Dossier récupéré : " & N_Dossier
End Sub
Le premier bouton permet de...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Loreak,
La déclaration d'une variable ne vaut que pour la macro en cours. Elle reste inaccessible aux autres macros.
Par contre vous pouvez définir une variable en "Public" (ou encore variable globale ). Ces variables sont alors visibles par tout le monde tant que le fichier reste ouvert.
Pour cela :
1- Vous supprimez la déclaration : Dim Toto as String
2- Avant la ligne Sub, vous déclarez : Public Toto as string.
La variable Toto conservera sa valeur même macro terminée.

Attention cependant, les "vrais" informaticiens ont horreur de cette approche car en cas de pb vous aurez beaucoup de difficulté à savoir qui a modifié cette variable la dernière fois, si plein de macros utilisent cette variables.

VB:
Remplacez :
Public Sub CreerNouveauDossier()
    ' Spécifie le nom du dossier à créer
    Dim nomDossier As Integer
    Dim N_Dossier As Integer
    
par
' Spécifie le nom du dossier à créer
Public nomDossier As Integer
Public N_Dossier As Integer
Public Sub CreerNouveauDossier()
    .... suite
Ne pas oublier aussi de supprimer la déclaration de ces deux variables dans toutes les macros.
 

loreak

XLDnaute Nouveau
Bonjour @sylvanu,

Merci pour ta réponse.

Je viens de faire les modifs, cependant lorsque que je défini la 1ere variable "nomDossier" , j'ai ce message qui apparait.

1701855517656.png
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Sans fichier aucune idée.
D'après votre code il attend un nombre puisque déclaré en "Integer".
Cela devrait marcher comme avant.
En PJ un test avec :
VB:
    Public nomDossier As Integer
    Public N_Dossier As Integer
Public Sub CreerNouveauDossier()
    nomDossier = InputBox("Veuillez saisir le nom du nouveau dossier : [exemple : Ligne 24 (attention à ne pas mettre d'espace,ni avant, ni après)]", "Nouveau Dossier")
    N_Dossier = InputBox("Veuillez saisir le N° de la nouvelle ligne : (exemple : 24)", "Nouveau Dossier")
End Sub
Public Sub Insertion_Fichier_Suivi_OEE()
    MsgBox "NomDossier récupéré : " & nomDossier & Chr(10) & Chr(10) & _
            "N_Dossier récupéré : " & N_Dossier
End Sub
Le premier bouton permet de rentrer les valeurs puis quitte la macro.
Le second bouton restitue les valeurs mémorisées en public.

... sinon donnez un fichier, ma boule de cristal est en réparation. :)
 

Pièces jointes

  • Classeur3.xlsm
    14.4 KB · Affichages: 1

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 933
Messages
2 093 734
Membres
105 803
dernier inscrit
metroMBP