Refus de fermeture (workbooks.close)

Résolu
borntobealive Messages postés 167 Statut Membre -  
baladur13 Messages postés 47339 Date d'inscription   Statut Modérateur Dernière intervention   -
slt,

Probleme original pour moi puisque excel ne me balance aucun message d'erreur... il se contente de planter et de quitter.

Situation : je creer des fichier qui sont des comptes mensuels à partir d'un fichier
Template.xlsm
, quand je voulais faire une modification des macro contenu dans ce fichier Template je devais aussi le modifier dans chacun de mes fichiers... sauf que maintenant ils sont trops nombreux pour que je le fasse à la main du coup j'ai écris un petit bout de code qui fait des mises à jour.

La suppression marche du tonerre, l'ajout aussi mais quand je veux modifier un module excel ne parvient pas à executer
dec.wk_ComptaMensuel.close
(oups). il bloque sur la ligne jusqu'à l'erreur

quelqu'un à une idée ?
d'avance merci

(le code pour les acharnés)

Sub MAJ()
If ThisWorkbook.name <> "Template.xlsm" Then Exit Sub
Declaration.RAZ_comptaGen

Dim cel As Range
Dim module As String
Dim nom As String
Dim faire As String

'donner le nom du module modifier
module = "Action"
' que faire ?
' 1 pour ajouter un nouveau module
'2 pour supprimer un module
'3 pour modifier un module existant
faire = 3


For Each cel In Dec.Tab_listeCompte.ListColumns("relevés mensuels").DataBodyRange
    nom = Month(cel.Value) & "_" & Year(cel.Value) & ".xlsm"
    cel.Offset(0, -1).Value = "en cours"
    Application.Workbooks.Open Filename:=Dec.chemin & Application.PathSeparator & nom
    Declaration.RAZ_ComptaMensuel (Replace(nom, ".xlsm", ""))
    Select Case faire
        Case Is = 1
            Call AjouterModule(module)
        Case Is = 2
            Call RetirerModule(module)
        Case Is = 3
            Call ModifierModule(module)
    End Select
    Application.DisplayAlerts = False
    Dec.Wk_ComptaMensuel.Save
    Dec.Wk_ComptaMensuel.Close
Next cel

End Sub

Sub AjouterModule(module As String)

Dim S As String

With Dec.Wk_ComptaMensuel.VBProject.VBComponents.Add(vbext_ct_StdModule)
    .name = module
End With
With ThisWorkbook.VBProject.VBComponents(module).CodeModule
    S = .Lines(1, .CountOfLines)
End With
With Dec.Wk_ComptaMensuel.VBProject.VBComponents(module).CodeModule
    .AddFromString S
End With

End Sub
Sub RetirerModule(module As String)

With Dec.Wk_ComptaMensuel.VBProject
    On Error GoTo fin
    .VBComponents.Remove .VBComponents(module)
End With
fin:
End Sub
Sub ModifierModule(module As String)

Dim S As String
Stop
With ThisWorkbook.VBProject.VBComponents(module).CodeModule
    S = .Lines(1, .CountOfLines)
End With

With Dec.Wk_ComptaMensuel.VBProject.VBComponents(module).CodeModule
    .DeleteLines 1, .CountOfLines
End With

With Dec.Wk_ComptaMensuel.VBProject.VBComponents(module).CodeModule
    .AddFromString S
End With

End Sub

2 réponses

  1. borntobealive Messages postés 167 Statut Membre 7
     
    news sur ma demande :

    j'ai enlever le application.displayAlert = false , c'était pas lui qui me cachait une option.
    J'ai essayer avec un module vide et les 3 actions (ajouter, modifier, retirer) ont parfaitement fonctionner. Je pense que le fait de toucher à un module important de mon classeur ne l'aide pas. je vais creuser dans cette direction.
    0
  2. borntobealive Messages postés 167 Statut Membre 7
     
    Trouvé :

    le problème c'est que j'agissait sur des module directement reliés à ThisWorkbook qui contenanait une ribambelle d'évènement.
    Je me suis permis de rajouter des petits
    application.enableEvent = false 
    et paf Ca a fait des chocapic s

    Je reste ouvert à toute explication (Ca marche mais je sais toujours pas pourquoi ça ne marchais pas )

    Merci de m'avoir regarder faire mon monologue ;-)

    (mon nouveau code pour les acharnés)
    Sub MAJ()
    If ThisWorkbook.name <> "Template.xlsm" Then Exit Sub
    Declaration.RAZ_comptaGen
    
    Dim cel As Range
    Dim module As String
    Dim nom As String
    Dim faire As String
    
    'donner le nom du module modifier
    module = "ThisWorkbook"
    ' que faire ?
    ' 1 pour ajouter un nouveau module
    '2 pour supprimer un module
    '3 pour modifier un module existant
    faire = 3
    
    For Each cel In Dec.Tab_listeCompte.ListColumns("relevés mensuels").DataBodyRange
        nom = Month(cel.Value) & "_" & Year(cel.Value) & ".xlsm"
        With cel.Offset(0, -1)
            .Value = "en cours"
            .Interior.ColorIndex = 4
        End With
        Application.EnableEvents = False
        Application.Workbooks.Open Filename:=Dec.chemin & Application.PathSeparator & nom
        Declaration.RAZ_ComptaMensuel (Replace(nom, ".xlsm", ""))
        'stop
        Select Case faire
            Case Is = 1
                Call AjouterModule(module)
            Case Is = 2
                Call RetirerModule(module)
            Case Is = 3
                Call ModifierModule(module)
        End Select
        Application.DisplayAlerts = False
        Dec.Wk_ComptaMensuel.Save
        'Stop
        Dec.Wk_ComptaMensuel.Close
        With cel.Offset(0, -1)
            .Value = ""
            .Interior.ColorIndex = 4
        End With
        Application.EnableEvents = True
    Next cel
    
    End Sub
    
    Sub AjouterModule(module As String)
    
    Dim S As String
    
    With Dec.Wk_ComptaMensuel.VBProject.VBComponents.Add(vbext_ct_StdModule)
        .name = module
    End With
    With ThisWorkbook.VBProject.VBComponents.Item(module).CodeModule
        S = .Lines(1, .CountOfLines)
    End With
    With Dec.Wk_ComptaMensuel.VBProject.VBComponents.Item(module).CodeModule
        .AddFromString S
    End With
    
    End Sub
    Sub RetirerModule(module As String)
    
    With Dec.Wk_ComptaMensuel.VBProject
        On Error GoTo fin
        .VBComponents.Remove .VBComponents.Item(module)
    End With
    fin:
    End Sub
    Sub ModifierModule(module As String)
    
    Dim S As String
    
    With ThisWorkbook.VBProject.VBComponents.Item(module).CodeModule
        If .CountOfLines = 0 Then Exit Sub
        S = .Lines(1, .CountOfLines)
    End With
    
    With Dec.Wk_ComptaMensuel.VBProject.VBComponents.Item(module).CodeModule
        .DeleteLines 1, .CountOfLines
    End With
    
    With Dec.Wk_ComptaMensuel.VBProject.VBComponents.Item(module).CodeModule
        .AddFromString S
    End With
    
    End Sub
    
    Sub instalation()
    
    If ThisWorkbook.name <> "Template.xlsm" Then Exit Sub
    Declaration.RAZ_comptaGen
    
    Dim cel As Range
    Dim module As String
    Dim nom As String
    Dim vbmod As VBComponent
    
    For Each cel In Dec.Tab_listeCompte.ListColumns("relevés mensuels").DataBodyRange
        nom = Month(cel.Value) & "_" & Year(cel.Value) & ".xlsm"
        With cel.Offset(0, -1)
            .Value = "en cours"
            .Interior.ColorIndex = 4
        End With
        Application.EnableEvents = False
        Application.Workbooks.Open Filename:=Dec.chemin & Application.PathSeparator & nom
        Call Declaration.RAZ_ComptaMensuel(Replace(nom, ".xlsm", ""))
        For Each vbmod In Dec.Wk_ComptaMensuel.VBProject.VBComponents
            module = vbmod.name
            Call ModifierModule(module)
        Next vbmod
        Application.DisplayAlerts = False
        Dec.Wk_ComptaMensuel.Save
            With cel.Offset(0, -1)
            .Value = ""
            .Interior.ColorIndex = 4
        End With
        Dec.Wk_ComptaMensuel.Close
        Application.EnableEvents = True
    Next cel
    
    
    End Sub
    
    0
    1. borntobealive Messages postés 167 Statut Membre 7
       
      Comme c'est un monologue je n'avais pas accès au bouton ( il faut avoir reçu au moins une réponse non ? )
      0
    2. baladur13 Messages postés 47339 Date d'inscription   Statut Modérateur Dernière intervention   14 395
       
      Effectivement, sans réponse, impossible, pour quiconque, de mettre une conversation en résolu. C'est la condition "sine qua none" mais la réponse peut tout à fait provenir de l'auteur de la question.
      0