|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Bonsoir à tous,
A chaque jour sa difficulté. Chaque "bout de mon programme" écrit (avec parfois votre aide), m'amène vers d'autres lignes de codes et ... leurs lots de difficultés. Alors ... Mon problème du jour. Il me semblait pourtant banal d'écrire ces quelques lignes ... hélas "ça passe pas" et je ne comprends pas pourquoi. Voici le problème. J'ai un programme principal qui contient mes macros. L'une d'elle me permet d'ouvrir des fichiers déjà enregistrés sur le disque dur. A l'ouverture de ces fichiers, je crée deux boutons sur ces fichier qui s'ouvrent, l'un pour Imprimer, l'autre pour Enregistrer. Avec votre aide, tout cela fonctionne très bien. Donc je me trouve avec mon "FichierOuvert" au premier plan par rapport à mon "ClasseurPrincipal". Après l'enregistrement de mon "FichierOuvert" et avant de le refermer, je souhaiterais agir sur l'une des feuilles de mon "ClasseurPrincipal". C'est là que se situe mon problème. Il me faut "repasser" mon "ClasseurPrincipal" au plemier plan (ce que j'ai fait (il me semble) avec "Minimized", ensuite, je sélectionne bien la feuille concernée, mais je ne parviens pas à me positionner dessus (je dois, au départ, me placer en A4, puis sélectionner, dans cette colonne, la plage de cellule qui contient des données). Une fois la feuille sélectionnée, sur mes commandes : Range ("A4").Select,, par exemple, je reçois le message : Erreur 1004, La méthode Select de la classe range a échoué. Voici le "bout de code concerné" : Code :
Encore une fois, merci de votre aide pour ce problème qui, je le pense doit être d'une grande évidence pour beaucoup ... Danad38 |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Non, il ne faut pas procéder ainsi, il te faut créer 2 variables Workbook pointant chacune sur un des classeurs, il n'est ainsi plus utile de faire apparaître est disparaître les classeurs. Il faut d'ailleurs éviter de faire ainsi, le résultat est parfois... aléatoire. Met une plus grande partie de ton code (surtout le début) ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
10
|
|
|
#3 | ||||
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Bonjour Qwazerty,
Décidement, je crois que je "nage un peu ...". De plus, à force de modifier mon code et d'ajouter tout un tas de lignes ... je suis un peu perdu ! J'ai compris le but de ta proposition mais je ne parviens pas à "transférer" ma variable "NomClasseurPrincipal" (classeur sur lequel je travaille et sur lequel j'ai mes macros). Lorsque je suis sur le classeur de ma feuille ouverte (qui est maintenant ma feuille active) et que je veux lancer ma procédure "Enregistrer", je "plante". Si je regarde mes variables dans la fenêtre Visual Basic, je ne trouve rien ou alors ma variable ne contient rien. Je te fournis tout le code : 1 - Du module qui me lance mon UserForm avec mes ListView et qui après le clic sur le CommandButton1, m'ouvre mon fichier et place les boutons. Code :
Code :
Encore merci. Danad38 |
||||
|
|
00
|
|
|
#4 | ||||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Alors beaucoup de choses J'ai modifié un grosse partie de ton code, mais il reste certainement des modification à lui apporter. J'ai mis en place des boucle pour éviter d'avoir 3 fois le même code. Code :
Il faut aussi revoir le code de tes boutons, pour éliminer les Select, Active... Petit conseille, soit attentif à bien déclarer toutes tes variables, pour t'y aider place au début de ton module Option explicit, qui t'oblige à les déclarer. Tu as déclaré beaucoup de variable de porté module (elles se trouve au début du module et ne sont pas incluses dans une des procédures) Est-ce bien utile? Voila pour le code du bouton enregistrer Code :
Essai de modifier le code du bouton Imprimer Un autre point, attention avec tes structure If, Elseif, Else, tu devrais lire ou relire un tutoriel a se sujet, tes structures sont fausses. Personnellement j'évite d'utiliser les : pour mettre les lignes de codes à la queue leuleu, c'est juste bon pour faire des erreurs de fermeture d'imbrication et ça rend le code difficile à entretenir par la suite. Bonne nuit! ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||||
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Salut Qwazerty,
Alors là, tu m'épates ! Cette longue réponse avec tes remarques m'impressionne. J'imprime et j'étudie cela. Je te tiens au courant. Merci. Danad38 Re Bonjour Qwazerty, J'ai étudié ton travail. Ta manière de "simplifier" le programme me laisse encore plein d'admiration ! J'essaie de retenir la leçon ... Il aurait été "trop" simple que tout fonctionne à merveille, il faut bien qu'il me reste quelques recherches à effectuer. Là pourtant je coince. Au lancement du programme principal j'ai systématiquement "une erreur 438 : Propriété ou méthode non gérée par cet objet" qui survient et qui me ramène sur la ligne de départ de mon programme : "UserForm6.Show". Après avoir suivi le déroulement du programme pas à pas, j'ai trouvé où se situe l'erreur mais je ne parviens pas à la supprimer. Mes recherches sur le Net n'ont pas abouti. Je n'ai pas trouvé de cas suffisamment semblables. L'erreur survient à la ligne 158 : Code :
Montant=.Columns("B:B").Find("----------",.[B1],,,,xlPrevious).Offset(-1,0).Value Je n'arrive pas au stade de l'apparition de mon UserForm donc je ne sais pas s'il sera correctement rempli, mais le balayage des feuilles semble s'effectuer correctement, les variables semblent elles aussi bonnes. Merci encore. Danad38 Salut Qwazerty, Décidément, à force de lire, relire et modifier, je ne vois même plus les erreurs les plus simples ! Dans la ligne qui "plantait", j'avais tout simplement effacé le "s" de Columns ! ... Et l'ordinateur ne m'a rien dit ! J'ai alors crié victoire ...mais, le même message d'erreur, avec le même effet de l'arrêt du programme, est venu à la ligne suivante : Code :
Me.Controls(iList + 1).Value = Montant Danad38 |
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
En programmation il est important de savoir manipuler les boucles pour limiter la quantité de code. Voila la correction, j'en ai profité pour aussi vérifier qu'une cellule est bien trouvée par Find Code :
++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Salut Qwazerty,
J'ai bien étudié ta réponse. (Hier soir, à la suite de mon erreur d'écriture, et devant la seconde erreur survenue immédiatement sur la ligne suivante, j'avoue ne pas avoir beaucoup cherché avant "d'appeler de l'aide". Le fait que le contrôle (Me.Controls) ne soit pas défini m'est apparu plus tard dans la soirée ...). D'habitude je m'efforce de chercher au maximum par moi même ... Voici donc l'état d'avancement de mon programme. J'ai été amené à effectuer une modification car le programme plantait. Je ne sais pas si mon action est très judicieuses mais ça ne plante plus. Voici cette modification : Programme principal : 1 - Ligne 186, j'ai ajouté .CodeModule en fin de ligne. Code :
With UneFeuille.Parent.VBProject.VBComponents(UneFeuille.CodeName).CodeModule tout va bien pour l'ouverture du UserForm, les ListView et les Totaux sont corrects, les sélections sans problèmes. MAIS une fois ma feuille ouverte, losrque je lance la procédure d'enregistrement, elle commence par se dérouler correctement (Le fichier s'enregistre) mais après, alors que ce fichier est encore à l'écran et qu'il faut re-basculer sur la feuille des listes des factures du programme principal (Pour supprimer la ligne qui contient le nom de cette facture), ça plante avec le message : "L'indice n'appartient pas à la sélection" C'est à la ligne 40 du programme "Enregistrer_Click()": Code :
Set SheetFacture = .Sheets("Facture " & Préparateur) J'ai "aménagé" le programme "Imprimer" qui semble fonctionner, lui, sans problème. Qu'en penses-tu ? Danad38 |
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Pour la 1ere correction, c'est parfait. Par contre pour ton 2ème soucis, tu as supprimer le teste du contenu de la cellule F3 si j'ai bien compris, donc ceci Code :
Code :
Set SheetFacture = .Sheets("Facture " & Préparateur) ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||
|
|
00
|
|
|
#9 | ||
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Salut Qwazerty,
Je vais essayer d'être plus précis. Dans mes premiers messages, j'ai utilisé des "noms" qui n'étaient pas forcement ceux, réels, des feuilles et fichiers. Jusqu'à maintenant, j'ai toujours pu "rétablir" l'équilibre. Aujourd'hui, c'est peut-être cela qui cloche. J'ai donc un classeur, disons "général" dans lequel j'ai toutes les feuilles relatives à mon programme. C'est dans ce classeur que sont stockées mes macros. Dans ce classeur, il y a 3 feuilles nommées exactement : "Fact non payées - Sébastien" ; "Fact non payées - Juliette" et "Fact non payées - Jean-François". Chacune de ces feuilles contient une liste de noms de factures encore non payées. Ces noms sont tous du style : Date-Numéro-Nom, par exemple "9-12-2011-124-MACHIN". Ce sont ces listes qui alimentent les ListViews du UserForm. Chacun de ces noms ("9-12-2011-124-MACHIN" ...) correspond à un fichier enregistré sur le disque. Le nom du fichier est le même : "9-12-2011-124-MACHIN.xls". Enfin, chacune de ces factures ne contient qu'une seule feuille nommée : "Facture - Devis en cours". Au lancement de ma macro, voici ce qui doit se passer : 1 - Initialisation du UserForm. (Au passage, récupération du montant global encore non payé pour chaque ListView). 2 - Choix d'un (ou plussieurs) fichier dans une des ListViews. 3 - Après clic sur un CommandButton, ouverture du (ou des) fichier. 4 - Placement sur la (ou les) feuille de 2 boutons "Enregistrer" et "Imprimer". 5 - Fermeture du UserForm. A ce moment, j'ai à l'écran mon (ou mes) fichier facture. Je peux inscrire la date du paiement ... Etc. Puis je peux imprimer si nécessaire et enregistrer ce fichier avec le même nom, au même endroit du disque. Jusque là ... tout va bien... Ensuite il me faudra fermer le fichier corrigé (à quel moment le fermer ?), il faut également "basculer" sur la feuille "Fact non payée - ...Nom du préparateur" du classeur principal afin de retrouver le nom de cette facture et ensuite supprimer la ligne contenant ce nom. C'est au moment de cette "bascule" que le problème se pose. Si j'ai, provisoirement, considéré que la cellule F3 portait toujours le mot "Facture" (plus tard j'envisage autre chose si ce mot est "Devis"), j'ai gardé le test, cela donne sur mon programme : Code :
Code :
Set SheetFacture=.Sheets("Fact non payées - " & Préparateur) Voilà ou j'en suis en ce moment. J'espère, cette fois, avoir été suffisamment précis afin que tu puisses y voir plus clair dans ma démarche. Bonne journée. Danad38 |
||
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Donc si je comprend bien, Tu sélectionnes les factures que les clients viennent de payer. Un proposition, plutôt que d'ouvrir toutes tes fenêtres d'un coup, pourquoi ne pas les ouvrir une par une?
Voila une idée de fonctionnement, regarde si ça collerait à ce que tu souhaites faire. Il peut être intéressant de savoir ce que tu saisis dans la feuille facture, est-ce les mêmes données dans toutes les factures? ou les données sont elles différentes en fonction du client/du rédacteur? Avant de te lancer dans le code, peaufine bien l’enchaînement que tu souhaites réaliser, ensuite seulement tu pourras commencer à en réaliser l'ossature. ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
00
|
|
|
#11 |
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Salut Qwazerty,
Beaucoup d'heures devant l'écran à chercher et comprendre ... mais au bout du compte rien! A force de "triturer" les lignes de codes, d'en ajouter, d'en supprimer j'obtiens une "usine à gaz" ... qui ne fonctionne pas! J'en suis donc revenu à mon point de départ. (Celui du 8 décembre). La programmation n'est pas toujours chose simple ... Il faut s'accrocher pour ne pas laisser tomber. Heureusement que j'avance (lentement mais plus sûrement) sur d'autres parties de mon programme. J'ai lu attentivement tes propositions, elles me semblent excellentes mais ... je ne suis pas être encore à la hauteur de leurs réalisations ... 1 Mon premier échec (pourtant je pensais franchir l'obstacle facilement). Je ne parviens pas à stopper l'ouverture multiple de mes fichiers sélectionnés. Je place bien un test du Caption : If (le Caption est "Suivant") Then ???? (Quoi) là je n'ai rien trouvé qui m'arrête ET me permette de repartir en cliquant à nouveau sur Suivant. En revanche j'ai trouvé les lignes de codes pour ajouter les boutons Réduire et Agrandir dans le haut d'un UserForm. C'est beau, ça fonctionne mais cela ne m'avance guère ... Ceci dit, l'ouverture de tous les fichiers en même temps ne me gêne pas ... (mais j'aimerais bien y parvenir tout de même, pour comprendre). 2 Mon deuxième échec est toujours le même, lorque j'ai ouvert un fichier(Rappel : du style 13-12-2011-143-MACHIN.xls) avec mon UserForm et ses ListView, j'ai la main pour toutes les actions que je dois mener sur celui-ci (là, rien à automatiser, pas d'impression systématique) MAIS après l'enregistrement de ce fichier, je ne parviens toujours pas à re-basculer sur mon Classeur Principal, celui sur lequel j'ai les feuilles récapitulatives de mes factures encore non payées. Si je minimise le fichier des factures à l'écran avec une ligne de code, je "vois bien" mon Classeur Principal mais "le programme" ne parviens pas à reprendre la main sur celui-ci. Je ne parviens pas à transférer une variable portant le nom de mon Classeur Principal, depuis ce Classeur Principal vers le Code qui s'inscrit "dans mon fichier ouvert", à la création de mes CommandButtons (Enregistrer et Imprimer). En clair, lorsque je regarde mes variables au lancement du code de mon bouton "Enregistrer", je n'ai pas celle portant le nom de mon Classeur Principal) Cela fait bientôt 5 jours que je tourne en rond et je ne vois pas de sortie ... 3 En ce qui concerne ton conseil de ne pas effacer les fichiers "Payés", tu as raison. Je vais m'orienter dans ce sens même si, aujourd'hui, je n'en suis pas à cet endroit de programmation. Je ne sais si tu pourras me sortir de tout cela. Si c'est au delà de "mes capacités actuelles de programmation" je verrais à orienter mon programme dans une direction plus "sinueuse". Je pensais pouvoir grimper la falaise directement ... Je vais peut-être être obligé de faire le tour. Il faut savoir quelquefois rester humble. Merci encore et bonne soirée. Danad38 |
|
|
00
|
|
|
#12 | |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Citation:
Essai de mettre un fichier démo avec des données bidons, inutile d'avoir 50 lignes de facture 2/3 lignes par rédacteur suffiront amplement, histoire de voir comment s'organise ton fichier ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
|
00
|
|
|
#13 |
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Salut Qwazerty,
Merci pour ta patience. Je te fais donc parvenir un "mini-modèle" de mon programme. Il se compose du programme principal compressé au format .zip et nommé : - Modèle programme - 16-12-2011.zip et de 4 fichiers facture répartis sur les 3 vendeurs. Ces fichiers sont tous de la forme : - 9-12-2011-50-TOTO.xls Pour que la recherche des fichiers sur le disque fonctionne, j'ai choisi le premier disque C avec un répertoire et un sous répertoire. Le programme principal se trouve donc en : - C:\Mon programme\ Et toutes les factures se trouvent en : - C:\Mon programme\Factures\ Le Bouton de lancement est sur la feuille "Lancement". Après le clic sur le bouton, le UserForm6 s'affiche avec la liste des factures pour chacun. La validation d'un choix provoque l'ouverture de la facture. Je peux refermer le UserForm6. J'effectue mes modifications et à l'aide du bouton "Enregistrer" j'enregistre à nouveau cette facture (qui, au passage s'enregistre, bien sûr, au format xlsx ... il me faudra modifier cela par la suite). Juste après l'enregistrement le programme bogue sur la ligne de code : Code :
Sheets("Fact non payées - " & Préparateur).Select "Nom du fichier" feuil22 (Code) Je précise que j'ai pris bonne note de tes remarques (éviter les accents, pas de else : ..., utiliser des boucles au lieu de répéter les parties de programme ...). Lorsque "tout fonctionnera à peu près ..." je reprendrais par écrit mes lignes de code pour modifier et essayer d'améliorer mon style de programmation. Merci encore. Bon Weekend Danad38 |
|
|
00
|
|
|
#14 |
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Qwazerty,
Je constate que je n'ai pas répondu à ta première question. Une fois mon classeur facture ouvert, j'ai à noter, manuellement le paiement de la facture et le mode de paiement. Il se peut aussi que l'ouverture soit une erreur et que je n'ai rien à écrire ... Ceci serait un cas particulier. Une fois la modification effectuée, j'enregistre ce classeur Facture avec le même nom et au même endroit, puis, et c'est là mon problème, je dois fermer ce fichier (tout de suite ou plus tard ... ?) et je dois revenir sur mon classeur principal, celui sur lequel se trouvent mes feuilles Factures des vendeurs. Puis j'agis sur les noms de fichiers inscrits sur celle-ci. La recherche de la feuille et du nom de fichier doit s'effectuer de manière automatique. (Au départ je voulais supprimer la ligne du nom, après ton conseil, je marquerai cette facture comme payée avec le moyen de paiement et de plus je mettrai son écriture en bleu). En ce qui concerne le UserForm, j'ai deux options. Soit j'ouvre tous les fichiers factures surlignés d'un seul coup, je n'ai donc plus besion de lui et je peux le fermer (Peut-être le plus simple) soit j'ouvre les fichiers les uns après les autres mais dans ce cas il faut systématiquement effectuer la bascule entre : Fichier facture ouvert, Classeur Principal et UserForm ... A priori, cela me semble plus complexe à mettre en oeuvre. Voilà, j'espère avoir été assez précis. Danad38 |
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Alors après avoir vu ton fichier, j'ai changé mon fusil d'épaule. Si j'ai bien compris, la feuille "Facture - Devis en cours" contenue dans ton classeur Programme sert lors de la génération de tes fichiers Facture. Dés lors, il faut placer la macro d'enregistrement directement dans cette feuille. La macro Imprimer est inutile, une fois la zone d'impression défini, elle suivra lors de la copie (au moment de la génération) et elle se redimensionnera toute seule lors de l'insertion de ligne (ajout d'articles). J'ai aussi rajouté les info RelanceMail et RelanceTel sur la feuille de facture, cette partie étant en dehors de la zone d'impression, elles ne seront jamais imprimées. Elle servent à renseigner le fichier programme lors de l'enregistrement (via le bouton) des classeurs facture. J'ai ajouté des noms à certaines cellules de ta feuille "Facture - Devis en cours" ("InfoFacturePayee", "RelanceMail", "RelanceTel"), ces noms sont utilisés dans la macro enregistrement, leur présence permet de suivre les cellules contenants ces infos malgré l'ajout de lignes de facturation. Pour que cela fonctionne, il faut que tu régénères tes fichier facture avec la nouvelle structure de feuille "Facture - Devis en cours", attention à l'extension des fichiers qui doit être .xlsm. ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
10
|
|
|
#16 |
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Salut Qwazerty,
Merci pour ta réponse et pour le temps passé ... Ce que tu proposes est une mine de renseignements pour moi ! J'en suis, aujourd'hui, à décortiquer ton code afin de bien comprendre toutes ses finesses. Parallèlement, je l'inclue dans mon programme en adaptant certaines choses (Nom de variables pour avoir les mêmes termes tout au long du programme, chemins, nom des feuilles) et ,bien sûr, ça coince souvent à un moment ou à un autre. Pour l'instant j'ai "surmonté" les problèmes. Je vais donc continuer. Je te tiens au courant de l'avancée de mon travail, même si, dans cette période, le temps consacré à la programmation est réduit ... Merci encore et Joyeux Noël à toi et ceux qui t'entourent. Danad38 |
|
|
00
|
|
|
#17 |
|
Invité régulier
![]() Inscription : décembre 2010 Messages : 35 ![]() |
Salut Qwazerty,
Après cette longue coupure (Fêtes + Nouvel an au fond du lit ... pour cause de maladie) je reprends mon programme. Je te remercie encore pour ton aide et ta patience. Ce que tu m'as fourni a été capital. J'ai "adapté" car je ne suis pas parvenu à faire fonctionner correctement certains passages mais peu importe, maintenant j'ai résolu mon problème. Je suis donc près à affronter les difficultés suivantes qui ne tarderont pas à venir ... Je te souhaite une excellente année 2012, une bonne santé et une belle réussite. Au plaisir de te retrouver sur ce forum. Danad38 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com