OVH Cloud OVH Cloud

Fermeture impossible

5 réponses
Avatar
DoMi
Bonjour !

J'ai une application qui utilise plusieurs classeurs : le premier,
c'est le programme, les autres sont des fichiers de donn=E9es. Pour que
les utilisateurs ne puissent pas fermer ces fichiers de donn=E9es, j'ai
emp=EAch=E9 leur fermeture dans le Sub Workbook_BeforeClose, et on quitte
l'appli par un bouton quitter qui sauvegarde les donn=E9es et ferme les
fichiers, en terminant par le classeur "programme".
La saisie des donn=E9es se fait sans voir les fichiers de donn=E9es par
un jeu de ScreenUpdating.
Pour que les utilisateurs puissent consulter les donn=E9es saisies dans
l'un des fichiers de donn=E9es, je mets ScreenUpdating =E0 True et
j'affiche la feuille, l'utilisateur retourne au menu du classeur-prog
en cliquant sur un bouton d'une barre cr=E9=E9e dans le Workbook_Open de
ce classeur de donn=E9es. Cette barre est d=E9truite lors du
Workbook_BeforeClose du m=EAme classeur.
Or, si je quitte apr=E8s avoir fait diverses saisies, impressions ou
autres, pas de probl=E8me.
Si je veux quitter apr=E8s consultation, et clic sur ce bouton de
retour, le classeur-prog ne se ferme pas.

Merci pour votre aide !

5 réponses

Avatar
DoMi
Bon, je vois que ça n'inspire personne !
Je vais vous aider à m'aider...

J'ai simplifié à l'extrême:

Un classeur "TestDat.xls" va enregistrer les données.
Dans ThisWorkbook de ce classeur:

Private Sub Workbook_Open()
Dim BarreDeBoutons As CommandBar, Bouton1
Set BarreDeBoutons = _
Application.CommandBars.Add(Name:="Bouton", _
Position:=msoBarFloating, temporary:=True)

Set Bouton1 = BarreDeBoutons.Controls.Add(msoControlButton, , , ,
True)
With Bouton1
.Style = msoButtonCaption
.Caption = "&Retour accueil"
.OnAction = "Accueil"
End With
BarreDeBoutons.Visible = False
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.CommandBars("Boutons").Delete
End Sub

Et dans un module:

Sub Accueil()
Application.CommandBars("Boutons").Visible = False
Application.Run "'Test.xls'!RetourAccueil"
End Sub

Le classeur "Test.xls" sera le classeur principal. C'est l'ouverture de
celui-ci qui va déclancher l'ouverture de "TestDat.xls".
Dans ce classeur, un UserForm nommé ufMenu avec 3 boutons:

Private Sub CommandButton1_Click()
AjoutDonnées
End Sub

Private Sub CommandButton2_Click()
Consultation
End Sub

Private Sub CommandButton3_Click()
QuitterAppli
End Sub

Dans ThisWorkbook:

Private Sub Workbook_Open()
Dim Dossier As String
Application.ScreenUpdating = False
Dossier = ActiveWorkbook.Path & ""
Workbooks.Open Filename:=Dossier & "TestDat.xls"
RetourAccueil
End Sub

Et dans un module:

Sub RetourAccueil()
Application.CommandBars("Boutons").Visible = False
Windows("Test.xls").Activate
Application.ScreenUpdating = True
ufMenu.Show
End Sub

Sub AjoutDonnées()
ufMenu.Hide
Application.ScreenUpdating = False
Windows("TestDat.xls").Activate
ActiveCell = Format(Now(), "h:mm:ss")
ActiveCell.Offset(1, 0).Select
RetourAccueil
End Sub

Sub Consultation()
ufMenu.Hide
Application.CommandBars("Boutons").Visible = True
Windows("TestDat.xls").Activate
End Sub

Sub QuitterAppli()
ufMenu.Hide
Application.ScreenUpdating = False
Windows("TestDat.xls").Activate
ActiveWorkbook.Save
Windows("TestDat.xls").Close
Application.Quit
End Sub

Si on clique sur CommandButton1, on ne voit rien, mais l'heure du clic
est enregistré dans la cellule active (ça ne sert à rien, mais il
faut bien trouver quelque chose à lui faire faire...)
Un clic sur CommandButton2 affiche la feuille de données.
Si on clique sur CommandButton3 après un ou plusieurs clics sur
CommandButton1, on quitte l'appli: le classeur TestDat.xls est
enregistré et fermé, puis le Test.xls est fermé et on quitte Excel.
Si on clique sur CommandButton3 après CommandButton2, on enregistre
TestDat.xls et on le ferme, mais ça s'arrête là.
Quelqu'un pourra-t-il m'expliquer pourquoi ?

Merci !
DoMi



Bonjour !

J'ai une application qui utilise plusieurs classeurs : le premier,
c'est le programme, les autres sont des fichiers de données. Pour que
les utilisateurs ne puissent pas fermer ces fichiers de données, j'ai
empêché leur fermeture dans le Sub Workbook_BeforeClose, et on quitte
l'appli par un bouton quitter qui sauvegarde les données et ferme les
fichiers, en terminant par le classeur "programme".
La saisie des données se fait sans voir les fichiers de données par
un jeu de ScreenUpdating.
Pour que les utilisateurs puissent consulter les données saisies dans
l'un des fichiers de données, je mets ScreenUpdating à True et
j'affiche la feuille, l'utilisateur retourne au menu du classeur-prog
en cliquant sur un bouton d'une barre créée dans le Workbook_Open de
ce classeur de données. Cette barre est détruite lors du
Workbook_BeforeClose du même classeur.
Or, si je quitte après avoir fait diverses saisies, impressions ou
autres, pas de problème.
Si je veux quitter après consultation, et clic sur ce bouton de
retour, le classeur-prog ne se ferme pas.

Merci pour votre aide !


Avatar
Pierre Archambault
Salut DiMi,

J'utilise aussi une technique très semblable. Mon programme est dans un
classeur, (uniquement le programme) et les données dans des classeurs
différents. Au lieu de charger les classeurs contenant les données et de les
éditer avec le programme, je charge une copie des données dans des feuilles
que j'ajoute à la suite de l'unique feuille vide du programme.

Ainsi, les classeurs de données restent fermés et je travaille avec une
copie des données.

Après la mise à jour des données, j'exporte celles-ci en leur donnant le
même nom que le classeur utilisé pour charger les données originales.

Et voilà, le tour est joué. J'ai une procédure pour charger les données, une
pour les décharger, une autre pour charger un gabarit quand je veux créer un
nouveau classeur de données. Le programme est toujours lancé en mode
"lecture seule" et il est déchargé sans aucune sauvegarde.

Alors, si cela constitue une piste intéressante pour ton projet, fais-le moi
savoir et je te donne des détails.

Pierre



"DoMi" a écrit dans le message de news:

Bonjour !

J'ai une application qui utilise plusieurs classeurs : le premier,
c'est le programme, les autres sont des fichiers de données. Pour que
les utilisateurs ne puissent pas fermer ces fichiers de données, j'ai
empêché leur fermeture dans le Sub Workbook_BeforeClose, et on quitte
l'appli par un bouton quitter qui sauvegarde les données et ferme les
fichiers, en terminant par le classeur "programme".
La saisie des données se fait sans voir les fichiers de données par
un jeu de ScreenUpdating.
Pour que les utilisateurs puissent consulter les données saisies dans
l'un des fichiers de données, je mets ScreenUpdating à True et
j'affiche la feuille, l'utilisateur retourne au menu du classeur-prog
en cliquant sur un bouton d'une barre créée dans le Workbook_Open de
ce classeur de données. Cette barre est détruite lors du
Workbook_BeforeClose du même classeur.
Or, si je quitte après avoir fait diverses saisies, impressions ou
autres, pas de problème.
Si je veux quitter après consultation, et clic sur ce bouton de
retour, le classeur-prog ne se ferme pas.

Merci pour votre aide !
Avatar
DoMi
Merci, c'est une idée, je vais essayer, et te tiendrai au courant.

Cordialement,
DoMi


Salut DiMi,

J'utilise aussi une technique très semblable. Mon programme est dans un
classeur, (uniquement le programme) et les données dans des classeurs
différents. Au lieu de charger les classeurs contenant les données et de les
éditer avec le programme, je charge une copie des données dans des fe uilles
que j'ajoute à la suite de l'unique feuille vide du programme.

Ainsi, les classeurs de données restent fermés et je travaille avec u ne
copie des données.

Après la mise à jour des données, j'exporte celles-ci en leur donna nt le
même nom que le classeur utilisé pour charger les données originale s.

Et voilà, le tour est joué. J'ai une procédure pour charger les don nées, une
pour les décharger, une autre pour charger un gabarit quand je veux cr éer un
nouveau classeur de données. Le programme est toujours lancé en mode
"lecture seule" et il est déchargé sans aucune sauvegarde.

Alors, si cela constitue une piste intéressante pour ton projet, fais-l e moi
savoir et je te donne des détails.

Pierre



"DoMi" a écrit dans le message de news:

Bonjour !

J'ai une application qui utilise plusieurs classeurs : le premier,
c'est le programme, les autres sont des fichiers de données. Pour que
les utilisateurs ne puissent pas fermer ces fichiers de données, j'ai
empêché leur fermeture dans le Sub Workbook_BeforeClose, et on quitte
l'appli par un bouton quitter qui sauvegarde les données et ferme les
fichiers, en terminant par le classeur "programme".
La saisie des données se fait sans voir les fichiers de données par
un jeu de ScreenUpdating.
Pour que les utilisateurs puissent consulter les données saisies dans
l'un des fichiers de données, je mets ScreenUpdating à True et
j'affiche la feuille, l'utilisateur retourne au menu du classeur-prog
en cliquant sur un bouton d'une barre créée dans le Workbook_Open de
ce classeur de données. Cette barre est détruite lors du
Workbook_BeforeClose du même classeur.
Or, si je quitte après avoir fait diverses saisies, impressions ou
autres, pas de problème.
Si je veux quitter après consultation, et clic sur ce bouton de
retour, le classeur-prog ne se ferme pas.

Merci pour votre aide !


Avatar
DoMi
Bonjour,

C'est une bonne idée, mais je me heurte dès le début à un
problème:
Dans Workbook_Open du classeur-programme:
Dossier = ActiveWorkbook.Path & ""
Workbooks.Open Filename:=Dossier & "TestDat1.xls"
Sheets("Données").Copy After:=Workbooks("Test.xls").Sheets(3)
et cette ligne me renvoie "l'indice n'appartient pas à la sélection"

Comment faire ?
DoMi


Salut DiMi,

J'utilise aussi une technique très semblable. Mon programme est dans un
classeur, (uniquement le programme) et les données dans des classeurs
différents. Au lieu de charger les classeurs contenant les données et de les
éditer avec le programme, je charge une copie des données dans des fe uilles
que j'ajoute à la suite de l'unique feuille vide du programme.

Ainsi, les classeurs de données restent fermés et je travaille avec u ne
copie des données.

Après la mise à jour des données, j'exporte celles-ci en leur donna nt le
même nom que le classeur utilisé pour charger les données originale s.

Et voilà, le tour est joué. J'ai une procédure pour charger les don nées, une
pour les décharger, une autre pour charger un gabarit quand je veux cr éer un
nouveau classeur de données. Le programme est toujours lancé en mode
"lecture seule" et il est déchargé sans aucune sauvegarde.

Alors, si cela constitue une piste intéressante pour ton projet, fais-l e moi
savoir et je te donne des détails.

Pierre



"DoMi" a écrit dans le message de news:

Bonjour !

J'ai une application qui utilise plusieurs classeurs : le premier,
c'est le programme, les autres sont des fichiers de données. Pour que
les utilisateurs ne puissent pas fermer ces fichiers de données, j'ai
empêché leur fermeture dans le Sub Workbook_BeforeClose, et on quitte
l'appli par un bouton quitter qui sauvegarde les données et ferme les
fichiers, en terminant par le classeur "programme".
La saisie des données se fait sans voir les fichiers de données par
un jeu de ScreenUpdating.
Pour que les utilisateurs puissent consulter les données saisies dans
l'un des fichiers de données, je mets ScreenUpdating à True et
j'affiche la feuille, l'utilisateur retourne au menu du classeur-prog
en cliquant sur un bouton d'une barre créée dans le Workbook_Open de
ce classeur de données. Cette barre est détruite lors du
Workbook_BeforeClose du même classeur.
Or, si je quitte après avoir fait diverses saisies, impressions ou
autres, pas de problème.
Si je veux quitter après consultation, et clic sur ce bouton de
retour, le classeur-prog ne se ferme pas.

Merci pour votre aide !


Avatar
Pierre Archambault
Salut,

Pardonne le retard à répondre, je me suis absenté...

Voici la procédure que j'utilise pour charger une feuille à partir d'un
classeur que je ne veux pas garder en mémoire.
Note: C'est une bonne idée de donner un nom à tes feuilles.
============================================== Public Sub ChargerFeuille()
Dim NomFichier As String
Dim NomProgramme As String

Application.ScreenUpdating = False

NomFichier = ActiveWorkbook.Path & "" & "FichierDeDonnées.xls"
NomProgramme = ActiveWorkbook.Name

Workbooks.Open Filename:=NomFichier, ReadOnly:=True

'Si plusieurs feuilles doivent être chargées
Sheets(Array("MaFeuille1", "MaFeuille2", "MaFeuille3")).Select

Sheets("MaFeuille1").Activate

'Le programme ne comporte qu'une seule feuille
'Si plusieurs feuilles doivent être chargées
Sheets(Array("MaFeuille1", "MaFeuille2", "MaFeuille3")).Copy
After:=Workbooks(NomProgramme).Sheets(1)
Sheets("MaFeuille1").Select
Range("A1").Select

'Fermer le fichier de données pour ne conserver que les feuilles désirées
NomFichier = "FichierDeDonnées.xls"
Windows(NomFichier).Activate
ActiveWindow.Close False

'"Menu" c'est le nom de l'unique feuille du programme
Sheets("Menu").Activate

Application.ScreenUpdating = True

End Sub
==============================================
"DoMi" a écrit dans le message de news:

Bonjour,

C'est une bonne idée, mais je me heurte dès le début à un
problème:
Dans Workbook_Open du classeur-programme:
Dossier = ActiveWorkbook.Path & ""
Workbooks.Open Filename:=Dossier & "TestDat1.xls"
Sheets("Données").Copy After:=Workbooks("Test.xls").Sheets(3)
et cette ligne me renvoie "l'indice n'appartient pas à la sélection"

Comment faire ?
DoMi


Salut DiMi,

J'utilise aussi une technique très semblable. Mon programme est dans un
classeur, (uniquement le programme) et les données dans des classeurs
différents. Au lieu de charger les classeurs contenant les données et de
les
éditer avec le programme, je charge une copie des données dans des
feuilles
que j'ajoute à la suite de l'unique feuille vide du programme.

Ainsi, les classeurs de données restent fermés et je travaille avec une
copie des données.

Après la mise à jour des données, j'exporte celles-ci en leur donnant le
même nom que le classeur utilisé pour charger les données originales.

Et voilà, le tour est joué. J'ai une procédure pour charger les données,
une
pour les décharger, une autre pour charger un gabarit quand je veux créer
un
nouveau classeur de données. Le programme est toujours lancé en mode
"lecture seule" et il est déchargé sans aucune sauvegarde.

Alors, si cela constitue une piste intéressante pour ton projet, fais-le
moi
savoir et je te donne des détails.

Pierre



"DoMi" a écrit dans le message de news:

Bonjour !

J'ai une application qui utilise plusieurs classeurs : le premier,
c'est le programme, les autres sont des fichiers de données. Pour que
les utilisateurs ne puissent pas fermer ces fichiers de données, j'ai
empêché leur fermeture dans le Sub Workbook_BeforeClose, et on quitte
l'appli par un bouton quitter qui sauvegarde les données et ferme les
fichiers, en terminant par le classeur "programme".
La saisie des données se fait sans voir les fichiers de données par
un jeu de ScreenUpdating.
Pour que les utilisateurs puissent consulter les données saisies dans
l'un des fichiers de données, je mets ScreenUpdating à True et
j'affiche la feuille, l'utilisateur retourne au menu du classeur-prog
en cliquant sur un bouton d'une barre créée dans le Workbook_Open de
ce classeur de données. Cette barre est détruite lors du
Workbook_BeforeClose du même classeur.
Or, si je quitte après avoir fait diverses saisies, impressions ou
autres, pas de problème.
Si je veux quitter après consultation, et clic sur ce bouton de
retour, le classeur-prog ne se ferme pas.

Merci pour votre aide !