Application VB et Excel

Résolu/Fermé
Berty59 Messages postés 38 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 21 janvier 2010 - 15 juin 2009 à 10:10
 Moz - 27 mai 2010 à 11:31
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 !
A voir également:

12 réponses

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+
0
Berty59 Messages postés 38 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 21 janvier 2010 2
16 juin 2009 à 09:27
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 !
0
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+.
0
Berty59 Messages postés 38 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 21 janvier 2010 2
16 juin 2009 à 15:20
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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+.
0
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.zip

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+
0
Berty59 Messages postés 38 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 21 janvier 2010 2
17 juin 2009 à 09:56
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
0
Bonjour ,
Mon problème est un peux compliquer , j'ai des données excel que je dois transmettre a une application ,( chaque cellule doit etre affecter a un champ dans l'ecran de saisie de l'application ) , avec VB5 , j'ai pu faire un petit programme qui extrait le contenu dde la cellule et le mettre dans une variable VB5 , mais je n'arrive pas ensuite a copier le contenu de cette variable dans le champ de l'application .
Si quelqu'un peux m'aider , je serai reconnaissant . Merci
0
Bonjour,

Qu'est ce que tu endends par "Champ de l'application"?

Si c'est un controle TextBox, rien de plus simple:
TextBox1.Text=MaVariable

Sinon, est ce que tu peux etre plus clair?

A+.
0
Bonjour ,
Desolai , je me suis mal explique , en effet j'ai un fichier Excel quotidient de presque 600lignes , ces données je dois faire des copie coller dans les differents champs de saisie une application (Mise a jour des bases de donnés ) on a aucun accée a ces bases de données que via des masque de saisie de l'application , on ne sais meme pas de quel type de base de données , donc pour contourner la mise a jours de ces base de donnéesavec les methodes classique , j'ai creer un petit programme VB5 qui extrait les données du fichier Excel et les stockes dans des variables ( chaque cellule correpond a un champ de saisie ) mais mon problème est comment ensuite coller ces contenus dans les champs correspondant ) sachant que cette application possede un menu ou on peut creer des scriptes que j'ai utilise actuellement pour creer des raccourcis .
J'espere que cette fois ci bien expliqué , et je vous remerci d'avance
0
Bonsoir,

Cette fois je comprend mieux. Il s'agit d'exporter le contenu d'un tableau Excel vers une application de type base de données.
Tu dis que cette appli peut être commandée par des scripts, je pense que la solution est plutot de ce coté.
L'idée est d'exporter les données du fichier excel dans un fichier texte au format csv. Ce format est reconnu par la plupart des bases de données. Ensuite tu crées un script qui va lire ce fichier csv et intègre les données dans la base de donnée.

C'est une piste qui vaut d'être explorée. Salut.
0
Merci bien de prendre le temp pour me répondre
Le probleme que je ne metrise pas trop les scripts pour que je puisse extraire les données du fichier , c'est pour cela que j'essai avec VB5 , meme si je ne le metrise pas trop mais quand meme j'arrive a placer les données dans des variables .
Si vous pouver bien me donner le bout du fil , je serai reconnaissant
Merci
0
bonjour j'essaye de developper une application avec vb excel et je sais pas d'ou commencer pourrais tu m'envoyé ton fichier excel dont t'a crée l'application. merciiiiiiiiiiiiiiiiiiiii
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
30 avril 2010 à 10:29
Bonjour,

j'essaye de developper une application avec vb excel

Excel n'est pas un environnement de développement d'application.
0
Ton programe est pas bien ficellé. Remarque y à que dans le form_load où le parametrage reste presque bien determiné. Il te faut, à mon avis, une suite de code à la fin actuelle du code pouvant te permettre un retour (imprevisible) dans form_load.
0