Rechercher : dans
Par :

Application VB et Excel

Dernière réponse le 17 jun 2009 à 09:56:51 Berty59, le 15 jun 2009 à 10:10:48 
 Signaler ce message aux modérateurs

Bonjour,
J’utilise actuellement VB pour faire des opérations dans un classeur Excel.
J’ai donc un menu principal avec plusieurs boutons, chacun relié à une autre feuille de type Form dans VB.
Dès que je clique sur un bouton, une autre fenêtre (Form) s’ouvre donc.
Avec dans le form load de cette autre feuille :
Set appExcel = CreateObject("Excel.application")
Set wbExcel = appExcel.workbooks.open("chemin vers mon classeur excel")
Et dans le (Général) :
Dim appExcel as Excel.application
Dim wbExcel as Excel.workbook
Dim wsExcel as Excel.worksheet

Il y a également dans cette feuille un bouton « retour au menu principal » :
Private Sub cmdretour_Click()
wbExcel.close
appExcel.quit
set appExcel = nothing
set wbExcel = nothing
set wsExcel = nothing
feuille1.visible = false
menuprincipal.visible = true

Jusque là tt va bien, au menu principal je clique sur le bouton me menant à cette feuille, je fais les opérations dans le fichier, tt marche a merveille jusqu’à ce que je retourne au menu principal, le fichier excel se ferme alors et lorsque je clique de nouveau sur le bouton me menant à cette feuille, le fichier excel ne s’ouvre plus.
Je cherche donc une solution à ce problème car c’est plus que gênant si je suis obligé de fermer et relancer tte mon application a chaque fois que je veux retourner sur cette feuille.
Si vous voulez des précisions demandez-les moi, j’ignore si c’est très clair présenté comme ça.
Merci pour vos réponses !

Configuration: Windows XP Internet Explorer 8.0

Meilleures réponses pour « Application VB et Excel » dans :
Excel - Convertir fichier(s) CSV / XLS VoirComme dit dans le titre, cette application convertit des fichiers CSV en fichiers XLS N’est pas nécessaire pour Excel 2007, ce dernier faisant la conversion automatiquement La conversion n’ayant pas de mise en forme, en cas de modification...

1

tech_57, le 15 jun 2009 à 15:13:00

Bonjour,

Dans ce genre d'application, il faut créer une boucle de controle qui gere l'ouverture de chaque feuille
j'explique:

dans un module, déclarer une variable globale Menu de type Integer et ecrire une sub() qui contient ce code

Dim Menu as Integer 'variable globale accessible partout

Sub test()
'
'initialisation
'
'
'boucle de controle
Menu=1 'affiche le Menu

While menu>0

Select case menu

Case 1
userform1.show 'Feuille principale avec le Menu

Case 2
userform2.show 'Autre feuille

Case 3
userform3.show '...

'et ainsi de suite

End Select

Wend
'
'Fin du programme

End Sub


La Feuille Principale avec le Menu doit contenir un bouton Quitter en plus des autres boutons
avec ce code:

Private Sub CommandQuitter_Click()
Menu=0 'quitte la boucle
Me.Hide
End Sub

Les autres boutons de la feuiile sont codés sur le meme schéma

Private Sub CommandForm2_Click()
Menu=2 'affiche feuille2
Me.Hide
End Sub

Private Sub CommandForm3_Click()
Menu=3 'affiche feuille3
Me.Hide
End Sub

et ainsi de suite...

et chaque userform doit contenir un bouton Retour avec ce code;

Private Sub CommandRetour_Click()
Menu=1 'affiche le Menu
Me.Hide
End Sub

Ainsi la boucle tourne sans fin en activant la userform concernée
Chaque userform se termine et relance le menu jusqu'a clic sur bouton Quitter
qui met Menu=0 et sort de la boucle While..Wend

A+

Répondre à tech_57

2

Berty59, le 16 jun 2009 à 09:27:38

Salut et merci pour ta réponse.
Ta solution semble être a peu près ce que je recherche. Mais ... je ne sais comment déclarer une variable globale...
Une variable globale, c'est bien une variable qui sera utilisable dans tt le Projet, dans n'importe quelle userform? C'est bien ça?
Si c'est ça alors c'est bien ce que je recherche mais j'ignore comment faire pour la déclarer, je vais cherche un peu mais si tu pouvais encore me donner un piti coup de pouce ce serai sympa...
Merci encore d'avoir répondu si vite !

Répondre à Berty59

3

tech_57, le 16 jun 2009 à 14:02:20

Bonjour,

Les variables globales se déclarent dans un module, en dehors d'un bloc Sub ... End Sub.
En général on les place tout en haut du module, juste derririère la directive Option Explicit si elle est definie.

Pour inserer un module, va dans l'explorateur de projet (partie de gauche du VB Editor), clic droit , Inserer Module.

Dans l'exemple que j'ai donné, tu remarqueras que l'instruction, Dim Menu as Integer , se trouve isolée , en dehors d'une procédure. Dans ce cas la variable Menu est une variable globale, connue de tout le projet.

Si tu ne comprend pas l'exemple donné, je peux le détailler d'avantage.

A+.

Répondre à tech_57

4

Berty59, le 16 jun 2009 à 15:20:51

Eh bien voila, pour tout te dire, ce que tu m'as envoyé ce n'est pas vraiment ce que je recherche, mon problème n'a pas grand chose à voire avec le changement de page comme tu me l'a proposé.
En fait, tu m'a fait prendre conscience du problème, et maintenant j'en ai la formulation exacte.
J'aimerai déclarer ceci :

Dim appExcel as Excel.application
Dim wbExcel as Excel.workbook
Dim wsExcel as Excel.worksheet

Set appExcel = CreateObject("Excel.application")
Set wbExcel = appExcel.Workbooks.open("C:\monfichier.xls")

Voilà, en fait j'aimerai ouvrir un fichier excel, qu'il le reste pendant toute l'utilisation de l'application et faire en sorte que je puisse intéragir avec dans chaque feuilles, sans avoir à le ré-annoncer à chaque fois.
donc autrement dit, en faire une variable globale. Est-ce possible ?
Merci !

Répondre à Berty59

5

tech_57, le 16 jun 2009 à 17:42:00

Re,

Autant pour moi, j'étais hors sujet.

Voici comment j'ai résolu le problème:

Dans le menu Projet Propriétés de... , dans la liste déroulante Objet de démarrage, choisir Sub Main

Ajouter un module au projet, voici le code:

Option Explicit

Global appExcel As Excel.application
Global wbExcel As Excel.workbook
Global wsExcel As Excel.worksheet

Sub main()
Form1.Show 1
End Sub

Ajuste le nom de la feuille à afficher, dans mon exemple c'est Form1

A l'execution, la procedure main affiche Form1

Sur la Form1 j'ai mis un bouton avec ce code
Private Sub Command1_Click()
Me.Visible = False
Form2.Show 1
Me.Visible = True
End Sub


L'appui sur ce bouton affiche le Form2, il faudra faire la même chose pour chaque bouton de ta feuille

Dans le code de la Form2 j'ai mis ce code:
Private Sub Form_Load()
Set appExcel = CreateObject("Excel.application")
appExcel.Visible = True
Set wbExcel = appExcel.workbooks.open("Mon_Fichier.xls")
End Sub

La Form2 s'ouvre et lance Excel avec le fichier spécifié.

Dans le code de Form2 j'ai mis aussi
Private Sub Form_Unload(Cancel As Integer)
appExcel.Quit
Set appExcel = Nothing
Set wbExcel = Nothing
Set wsExcel = Nothing
End Sub


Cette procedure s'execute quand on appuie sur le ControlButton de fermeture de la fenetre ( la petite croix en haut à droite), Excel se ferme.
Un nouvel appui sur le bouton de Form1 relance Excel.

Il y a surement moyen de faire plus propre, mais je n'ai pas trouvé. Fermer la fenetre avec un bouton (Retour) ne marche pas, je ne sais pas pourquoi. Je continue de chercher.


A+.

Répondre à tech_57

6

tech_57, le 17 jun 2009 à 00:32:09

Eureka! j'ai trouvé

L'erreur vient du fait que tu mets l'ouverture du classeur Excel dans le Load de la feuille.
En effet la procedure Form_Load() ne s'execute qu'une seule fois à la première ouverture de la feuille, quand elle est chargée en mémoire.
Meme si tu viens à fermer cette feuille puis à l'ouvrir à nouveau, la feuille étant déjà chargée en mémoire, la procédure Form_Load() n'agit plus.
Ceci explique pourquoi lorsqu'on ferme la feuille avec le bouton de controle (le X dans la barre de ritre de la feuille), qui à pour effet de décharger la feuille de la mémoire, le classeur Excel dans le Load de la feuille s'ouvre à nouveau.

Tu peux telecharger le code de cet exemple qui marche. J'utilise VB6 et Excel 2003.

http://www.cijoint.fr/cjlink.php?file=cj200906/cijcP9qzNE.zi­p

En résumé voici la solution:

Les variables globales (ou publiques) se déclarent en en-tete dans un module comme ceci:

Public appExcel As Excel.application
Public wbExcel As Excel.workbook
Public wsExcel As Excel.worksheet



L'ouverture d'Excel se fait en appuyant sur les boutons de feuille principale

Private Sub Command1_Click()
Dim Mon_Fichier As String
'ajuster le nom du fichier à ouvrir
Mon_Fichier = "D:\Mes documents\Mes tableaux\salaires2006.xls"
Me.Visible = False
Set appExcel = CreateObject("Excel.application")
appExcel.Visible = True
Set wbExcel = appExcel.workbooks.open(Mon_Fichier)
Form2.Show 1
Me.Visible = True
End Sub


Private Sub Form_Unload(Cancel As Integer)
End
End Sub


La fermeture d'Excel se fait en appuyant sur le bouton retour de la feuille 2

Private Sub Retour_Click()
appExcel.Quit
Set appExcel = Nothing
Set wbExcel = Nothing
Set wsExcel = Nothing
Me.Hide
End Sub


Private Sub Form_Unload(Cancel As Integer)
appExcel.Quit
Set appExcel = Nothing
Set wbExcel = Nothing
Set wsExcel = Nothing
End Sub


A+

Répondre à tech_57

7

 Berty59, le 17 jun 2009 à 09:56:51

Merci de t'être cassé la tête avec moi !! Avec ta solution je suis enfin débloqué, il me reste qu'a apporter ma touche finale sur mon projet et il sera prêt dans les temps. Merci encore, heureusement k'il y a des gens comme toi sur ces forums !
A + et encore merci

Répondre à Berty59