Module imbrique dans un module en Public
Bonjour,
J'ai regardé les explications. Mais 2 modules sont en Public et j'ai le message suivant : pour le lancement du module de creation du dossier après vérification.
Pouvez-vous m'indiquer où j'ai commis une erreur.
Merci
Option Explicit
Public colonne, derLig, fin, i, ligne, ligne2, cMois, cAnnee, RepAnnee, RepMois As Integer
Public lMois As String
Public CheminDossier, Wks, Myfile_Name, fichier As VariantPublic Sub Enreg_Devis_pdf()
Application.DisplayAlerts = False
'Déclaration des variables
Dim CheminFichier As String
Dim fichier As String
ThisWorkbook.Sheets("Valeurs").Select
'Memorisation des variable
RepAnnee = Range("Num_annee")
RepMois = Range("Num_Mois")fichier = Range("Fic_Devis")
'Enregistrement au format pdf
Sheets("Devis-Fact").Select
Call CreatNouvDosDevis
le chemin du fichier
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
CheminFichier & fichier, Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
from:=1, To:=4, OpenAfterPublish:=False
Application.DisplayAlerts = True
End Subbonjour,
un module contient des procédures (identifiées par sub) et des fonctions (identifiées par function).
Si tu as ce message c'est que VBA détecte que CreatNouvDosDevis (car je suppose que c'est ce niveau que tu reçois l'erreur) est un module et non une procédure, ou que l'une de tes variables correspond à un nom de module.
Sinon pour t'aider davantage, merci de mettre ton classeur
plus d'explications ici
sache aussi que si tu définis tes variables ainsi
Public colonne, derLig, fin, i, ligne, ligne2, cMois, cAnnee, RepAnnee, RepMois As Integerseule Repmois est définie comme Integer, toutes les variables précédentes auront le type par défaut qui est Variant. Tu dois répéter le type pour chaque variable.
donc ainsi
Public colonne as integer, derLig as integer, fin as integer, i as integer, ligne as integer, ligne2 as integer, cMois as integer, cAnnee as integer, RepAnnee as integer, RepMois As Integereffectivement, je voudrais lancer un module à partir de ce module. J'ai effacé les données sensibles.
Bonjour
Petite remarque sur vos déclarations de variables.
Public colonne, derLig, fin, i, ligne, ligne2, cMois, cAnnee, RepAnnee, RepMois As IntegerAttention qu'ici seul RemMois est déclarée en Integer. Toutes les autres sont en variant....
Donc si toutes ces variables sont en Integer, vous devez faire comme ceci
Public colonne as integer, derLig as integer, fin, i as integer, ligne as integer, ligne2 as integer, cMois as integer, cAnnee as integer, RepAnnee as integer, RepMois As IntegerA voir mais il n'est peut être pas nécessaire de déclarer tout en public mais bien dans les procédures.
Dans votre code, je pense que vous avez omis de mettre l'apostrophe devant la ligne "le chemin du fichier"
Crdlt
edit : vu qu'H2so4 a édité sont post après le mien ce que j'ai écrit fait doublon.
j'ai modifier pour les variables
J'ai dû oublier l'apostrophe quand j'ai enlevé le chemin beaucoup trop long et qui n'apportait rien.
Je croyais qu'il était possible de lancer un module depuis un module car j'aimerai l'utiliser dans d'autres modules.
Si je recopie le module 2 sous la procédure, il me vide mes variables cMois, et lMois et là je n'ai plus le bon chemin à créer ou é vérifier.
bonjour,
tu ne peux avoir qu'une seule déclaration d'une variable Public dans ton projet. Le mieux est d'ajouter un nouveau module dans lequel tu mets la définition de toutes tes variables publiques, quand tu auras fait cela (et que tu n'auras plus d'erreur pour des variables définies plusieurs fois), tu remets ton fichier corrigé et je regarderai ton problème de variable ou procédure attendue. S'il n'est pas résolu entre temps.
Je t'invite à relire la documentation relative aux déclarations de variables et à leur portée. (Dim, Public)
https://learn.microsoft.com/fr-fr/office/vba/language/concepts/getting-started/declaring-variables
@Dan,
edit : vu qu'H2so4 a édité sont post après le mien ce que j'ai écrit fait doublon.
Désolé, ma mise à jour et ta réponse se sont croisées dans la même minute, je n'avais pas vu ta réponse.
Bonjour,
J'ai corrigé suivant vos explications et j'ai imbriqué mon second module dans le premier. Cela fonctionne parfaitement et je vais me contenter de ce résultat. Je n'ai pas trouvé pour exécuter un module à partir d'un autre module. Je vous joins mon module réécrit. Merci de votre aide
Option Explicit
Public colonne As Integer, derLig As Integer, fin As Integer, i As Integer, ligne As Integer, ligne2 As Integer
Public cMois As Integer, cAnnee As Integer
Public lMois As String, fichier As String
Public NouvDossier, CheminFichier, Wks, Myfile_Name
Sub Enreg_Devis_pdf()
Application.DisplayAlerts = False
ThisWorkbook.Sheets("Valeurs").Select
'Memorisation des variable
fichier = Range("Fic_Devis")
'Enregistrement au format pdf
Sheets("Devis-Fact").Select
CreatNouvDosDevis
'CheminFichier = "C:\Users\emcys\Documents\Dossier suivi\Devis\" & RepAnnee & "\" & RepMois & "\"
Application.DisplayAlerts = True
End Sub
Sub CreatNouvDosDevis()
cAnnee = Year(Date)
cMois = Month(Date)
If cMois = 1 Then
lMois = "Janvier"
ElseIf cMois = 2 Then lMois = "Fevrier"
ElseIf cMois = 3 Then lMois = "Mars"
ElseIf cMois = 4 Then lMois = "Avril"
ElseIf cMois = 5 Then lMois = "Mai"
ElseIf cMois = 6 Then lMois = "Juin"
ElseIf cMois = 7 Then lMois = "Juillet"
ElseIf cMois = 8 Then lMois = "Aout"
ElseIf cMois = 9 Then lMois = "Septembre"
ElseIf cMois = 10 Then lMois = "Octobre"
ElseIf cMois = 11 Then lMois = "Novembre"
ElseIf cMois = 12 Then lMois = "Décembre"
End If
TesteSiDossierExiste
End Sub
Sub TesteSiDossierExiste()
Dim NouvDossier As String
NouvDossier = "C:\Users\Gilou\Documents\Cyril\Devis\" & "Devis_" & cMois & "_" & lMois & "\"
If DossierExiste(NouvDossier) = True Then
MsgBox "Le dossier existe..."
CheminFichier = NouvDossier
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
CheminFichier & fichier, Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
from:=1, To:=4, OpenAfterPublish:=False
Else
MkDir NouvDossier
CheminFichier = NouvDossier & "\"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
CheminFichier & "\" & fichier, Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
from:=1, To:=4, OpenAfterPublish:=False
End If
End Sub
Public Function DossierExiste(NouvDossier As String)
NouvDossier = "C:\Users\Gilou\Documents\Cyril\Devis\" & "Devis_" & cMois & "_" & lMois & "\"
If Len(Dir(NouvDossier, vbDirectory)) > 0 Then
DossierExiste = True
Else
DossierExiste = False
End If
End FunctionSalut,
Et besoin d'autant de variables publiques ?
Est-ce la flemme de les déclarer dans chaque procédures ?
Je pense que colonne, derLig, fin, i, ligne, ligne2 peuvent être déclarer dans la procédure et encore mieux supprimées si utilisation d'un tableau structuré. Dans le pire des cas tu as la possibilité de les passer en paramètres. exemple : Public Sub ExportPDF(Byval FileName As String, Byval Index As Long).
Il est aussi très important de poser le projet sur papier avant de se lancer tête baissée dans la programmation.
Et en dernier s'informer un tant soit peu. Il y a sur ce site de très bon cours qui selon moi doivent-être lu au moins une fois quand on débute. (Tu aurais sûrement appris que tu ne peux pas lancer un module...)
Je n'ai pas trouvé pour exécuter un module à partir d'un autre module. Je vous joins mon module réécrit.
Tu dois insérer des procédures ou fonctions dans le module pour pouvoir les réutiliser.
J'utilise ces variables dans d'autres modules et je veux éviter de changer de noms par erreur.
J'ai déjà pas mal lu pour la conception de procédures mais je ne pensais pas arrivée à créer un programme aussi important alors je découvre encore des lacunes dans mes connaissances.
J'ai programmé il y a longtemps en basic et je pensais que Visual Basic pouvait se structurer pareillement par appel de sous-programmes. Erreur.
Je prends note de toutes ses remarques pour m'améliorer.
Encore merci de votre aide et de votre patience.
J'espère pouvoir rendre la pareil à d'autres un jour.
Bonjour à tous,
rien à voir avec ton pb mais comme ça fait plusieurs fois que je le vois et que ça me choque à chaque fois...
Tu peux remplacer :
If cMois = 1 Then
lMois = "Janvier"
ElseIf cMois = 2 Then lMois = "Fevrier"
ElseIf cMois = 3 Then lMois = "Mars"
ElseIf cMois = 4 Then lMois = "Avril"
ElseIf cMois = 5 Then lMois = "Mai"
ElseIf cMois = 6 Then lMois = "Juin"
ElseIf cMois = 7 Then lMois = "Juillet"
ElseIf cMois = 8 Then lMois = "Aout"
ElseIf cMois = 9 Then lMois = "Septembre"
ElseIf cMois = 10 Then lMois = "Octobre"
ElseIf cMois = 11 Then lMois = "Novembre"
ElseIf cMois = 12 Then lMois = "Décembre"
End Ifpar : lMois = Application.Proper(Format(Date, "mmmm"))
eric
Bonjour,
Merci je vais changer tout de suite, c'est plus simple.
Bonjour
Pour répondre à votre question de départ : Votre souci d'erreur vient du fait que le nom de votre procédure CreatNouvDosDevis est aussi le nom que vous avez donné à un module. Choisissez un autre nom pour un des deux.
Autres points que j'ai vu dans votre fichier :
- Dans Thisworbook, je ne vois pas l'intérêt de mettre la sub Sub workbook_open() en public puisqu'elle est uniquement utilisée pour ce fichier. Remplacez Public par Private.
- A titre d'info le code Sub CopyCompta() peut aussi être placé dans un module.
Pourquoi déclarez tant de variables dans ce code...??
Chaque fois que vous déclarez une variable c'est une allocation de mémoire excel que vous utilisez.
Je ferais le code comme ceci :
Private Sub workbook_open()
Application.ScreenUpdating = False
With ThisWorkbook
If .Name = "Devis-factures.xlsm" Then
'Sauvegarde du classeur
Dim TWay As String
TWay = "C:\Users\emcys\Documents\Dossier suivi\"
.SaveCopyAs TWay & "Sauve_" & .Name
'envoi pour le comptable
Call CopyCompta
'Se positionne sur Tableau de bord
.Worksheets("Tableau de Bord").Activate
End If
End With
End SubCordialement
Edit : A voir si d'autres choses sont à rgarder dans le projet
Re,
Public Function DossierExiste(NouvDossier As String)
NouvDossier = "C:\Users\Gilou\Documents\Cyril\Devis\" & "Devis_" & cMois & "_" & lMois & "\"
If Len(Dir(NouvDossier, vbDirectory)) > 0 Then
DossierExiste = True
Else
DossierExiste = False
End If
End FunctionPourquoi redéfinir NouvDossier alors que tu le passes en paramètre ? La fonction Dossier existe ne doit faire qu'une chose vérifier si le dossier passé en paramètre existe et c'est tout...
Essaye d'être plus strict dans les déclarations Excel te remerciera, et attention aux paramètres si tu ne spécifie rien ils sont passé par valeur et cela peut te poser des problèmes aussi. Donc pour être explicite c'est :
Public Function DossierExiste(Byval NouvDossier As String) As Boolean
'...
'...Edit: Il faut lire "...si tu ne spécifie rien ils sont passés par référence, et cela peut te poser des problèmes."
Merci à h2so4 d'avoir soulevé ma coquille.