Probleme. en créant un nouveau fichier j'en ai deux
Je conçois votre réponse, Je n arrive pas a copier une feuille du classeur et la coller dans un nouveau fichier
Pour l instant j'en reste là mais le Useform servira aussi avec l ajout de boutons de valider une commande passée sans bon (ajout dans le titre N°de chantier et type de matériel pris ou de valider une commande en allant chercher le bon vierge et de remplir
Le bouche sert à éditer une liasse de bons j ai mis 1 5 etc. mais la moyenne se situera à 25
Bonjour Bruno, le forum,
je te retourne ton fichier modifié :
⚠ j'ai fait plein d'modifs dans le formulaire et son code VBA, alors regarde bien tout !
⚠ toutes les subs courtes sont fonctionnelles ; la sub de validation est non testée,
et elle devra probablement être adaptée.
dhany
Merci merci
Je rencontre toujours le même problème pour le copier coller
.("A1:K41").copy Wbk.Worksheets("Feuil1").(A1) j'avais déjà essayé ce genre de formule et c est toujours au copier coller que ca bloque
Bonjour, Salut à tous !
J'ai été un peu occupé pour m'assurer de la situation des barrages dans ma zone de proximité et des possibilités de certains approvisionnements...
1) Dédoublement de la FEUILLEVIERGE : FEUILLEVIERGE ne comportant que le bon de commande, et masquée.
Une feuille comprenant ce qui cohabitait avec le bon, soit un bouton libellé ENREGISTREMENT, et un tableau dont l'utillisation dans le dispositif n'est pas précisée, et qui n'est pour l'instant pas utilisé.
Cela met en place le modèle de bon de commande, la feuille modèle restant masquée.
2) Feuille ADZA : Quelques tableaux à examiner.
Le tableau INITIALES, initiales des personnes appelées à éditer des bons, qui alimente une Combo du formulaire, à conserver donc.
Un tableau qui alimentait une autre Combo pour le nombre de bons à produire paraît par contre en contradiction avec les propos du demandeur à cet égard : moyenne de bons produits simultanément estimée à 25, nombre qui ne figurait pas dans cette liste... On ne perdra donc rien à le supprimer, et à mettre en place une fixation du nombre de façon continue sans être limité ainsi par des palliers. On examinera ça avec le formulaire.
Un 3e tableau, qui n'était pas sous forme de tableau Excel, sous l'intitulé VARIABLES, comporte 3 mentions, dans l'ordre, le dernier numéro de bon utilisé, l'année en cours en 2 chiffres, l'initiale de la personne ayant procédé à l'émission des bons. L'intérêt principal de ce tableau est la conservation du dernier numéro utilisé, mais ça ne coûte rien de garder les 2 autres infos, bien qu'elles fassent double emploi...
Par contre rien n'empêche de constituer ce tableau en tableau Excel, ce qui en facilitera l'utilisation.
3) Les noms de tableaux Excel sont insérés automatiquement comme noms (dans le gestionnaire de noms) par Excel. Les noms de plage doublant ces noms de tableaux peuvent s'avérer utiles dans Excel, nullement en VBA. On les supprime donc !
A suivre concernant le formulaire...
Venons-en au formulaire, qui était bâti, contrairement aux habitudes, principalement sur des Labels...
Sans en éliminer une certaine sophistication, on va s'efforcer d'en rétablir simplicité et rationnalité centrée sur son objet, et on en profite pour renommer les contrôles utilisés dans le code :
- ComboBox : cbxNom. Ce contrôle est conservée. Sa liste reste alimentée par la propriété RowSource définie par défaut (sous cette forme : Tableau3[INITIALES]). Il permet de sélectionner la personne assurant la production des bons.
- Combo nombre de bons à éditer, supprimée !
La TextBox ne sert qu'à afficher la valeur du SpinButton (et est verrouillée car n'a pas à recevoir de saisie).
- TextBox accueillant le numéro du dernier bon utilisé (tbDerBon), remplace un Label. Deux boutons adjoints (cbPlus et cbMoins) sont conservés.
Ce dispositif est censé permettre un ajustement (ou une rectification) simultanément à l'utilisation du numéro du dernier bon utilisé. On suppose donc que l'utilisateur peut être amené à faire une rectification de ce dernier numéro enregistré. On aurait pu penser que ce type de rectif devrait être réalisé hors opération de production. Mais rien n'empêche cette sophistication... à l'utilisateur de bien maîtriser la chose.
- On fait disparaître les assemblages de Labels pour produire les numéros... au profit d'éléments plus simples.
2 Labels "DE" et "A" (lbDeA1 et lbDeA2) et 2 TextBox (tbDeA1 et tbDeA2).
La 1re TextBox demeure visible et accueillera le numéro de bon (ou le 1er numéro si plusieurs). La 2e TextBox et les 2 Labels sont masqués à l'ouverture et n'apparaîtront lors de l'affichage de numéros de bons que si le nombre de bons est supérieur à 1.
- Bouton de validation (cbValid) naturellement conservé, maintenu désactivé à l'ouverture, devient actif lorsque la validation est possible...
En résumé, l'utilisateur n'a à intervenir dans ce formulaire que sur la Combo Nom et le spinButton Nombre. Et éventuellement les boutons "+" ou "-" s'il le juge utile. La totalité des Textbox affichant des infos sont verrouillés car les infos sont déterminées automatiquement. Les numéros de bons s'affichent automatiquement, dès lors qu'un choix est fait dans la Combo Nom.
On va revenir plus en détail sur l'économie interne fonctionnelle du formulaire, qui diffère quelque peu de la situation antérieure.
A suivre...
Le formulaire s'ouvre avec tous ses contrôles aux valeurs par défaut et est initialisé avant affichage en ce qui concerne les éléments variables. Un seul a à intervenir à ce titre au moyen de la procédure d'initialisation.
Private Sub UserForm_Initialize()
tbDerBon.Value = [Tableau1].Cells(1, 1)
End SubIl s'agit de l'affichage du numéro de dernier bon utilisé, qui servira pour numéroter les bons à créer.
Comme on l'a vu, on a constitué le tableau conservant ce numéro en tableau Excel, lequel a été nommé Tableau1 automatiquement par Excel. Et on utilise ce nom de tableau, à l'instar d'un nom de plage, en VBA, pour récupérer la valeur voulue (sans avoir à invoquer la feuille, le nom de tableau permettant un accès direct...)
Avant de procéder à la validation, l'utilisateur a la possibilité d'intervenir sur divers contrôles : La Combo Nom, le SpinButton Nombre, les boutons "+" et "-".
Private Sub cbMoins_Click()
Dim q%
q = CInt(tbDerBon.Value) - 1
tbDerBon.Value = q
MajNumBon
End Sub
Private Sub cbPlus_Click()
Dim q%
q = CInt(tbDerBon.Value) + 1
tbDerBon.Value = q
MajNumBon
End Sub
Private Sub cbxNom_Change()
MajNumBon
End Sub
Private Sub spbNb_Change()
tbNb.Value = spbNb.Value
MajNumBon
End SubLes boutons "+" et "-" augmentent ou diminuent de 1 (à chaque clic), la valeur du dernier numéro, ce qui est répercuté dans la TextBox afférente.
La variation de valeur du SpinButton est de même répercutée sur la TextBox attenante.
Et l'ensemble de ces modifications, y compris le choix dans la Combo Nom qui n'a pas d'autre effet, interviennent pour composer les numéros des bons à produire. Ce qui est fait pour tous ces contrôles par renvoi sur une procédure destinée à le faire.
Sub MajNumBon()
Dim n%, db%, ini$, nbon$
db = CInt(tbDerBon.Value)
n = CInt(tbNb.Value)
ini = cbxNom.Value
If ini <> "" Then
nbon = db + 1 & " - " & Year(Date) Mod 100 & " - " & ini
tbDeA1.Value = nbon
If n > 1 Then
nbon = db + n & " - " & Year(Date) Mod 100 & " - " & ini
tbDeA2.Visible = True: tbDeA2.Value = nbon
lbDeA1.Visible = True: lbDeA2.Visible = True
Else
tbDeA2.Visible = False: lbDeA1.Visible = False: lbDeA2.Visible = False
End If
cbValid.Enabled = True
Else
tbDeA1.Value = ""
tbDeA2.Visible = False: lbDeA1.Visible = False: lbDeA2.Visible = False
cbValid.Enabled = False
End If
End SubLa procédure recense les éléments intervenant dans la numérotation : dernierbon, nombre, initiales.
Si les initiales manquent, le numéro ne peut être composé (les autres éléments sont nécessairement présents) : dans ce cas pas de valeur dans tbDeA1, et les autres contrôles utilisés dans la numérotation masqués, et le bouton validation désactivé.
Si elles sont présentes : on compose le numéro du premier bon et on l'affecte à tbDeA1, le bouton de validation est activé. Si le nombre de bons est supérieur à 1, on compose aussi le numéro du dernier bon qu'on affecte à tbDeA2, sinon ce dernier ainsi que les Labels demeurent masqués.
Ces modifications interviennent au sein du Userform et n'ont pas d'effet à l'extérieur avant validation.
A suivre la validation.
A noter avant de poursuivre que tu peux voir avec les codes déjà cités comment se présente un code correctement indenté. L'indentation permet de distinguer visuellement la structure du code d'un simple regard et permet de le lire et le travailler beaucoup plus vite. Il me paraît clair que lorsqu'on manipule du code écrit n'importe comment, c'est qu'on ne sait pas ce qu'on lit, sans quoi on commencerait à se préoccuper de pouvoir le lire sans faire d'erreur d'interprétation, et on indenterait pour faire ressortir les blocs d'instructions.
La procédure de validation intervient au clic sur le bouton Valider :
Private Sub cbValid_Click()
Dim n%, db%, a%, i%, ini$, nbon$, chDos$, Fich$, FV As Worksheet
ini = cbxNom.Value: n = spbNb.Value: db = CInt(tbDerBon.Value)
a = Year(Date) Mod 100
With [Tableau1]
.Cells(1, 1) = db
.Cells(2, 1) = a
.Cells(3, 1) = ini
End With
chDos = ThisWorkbook.Path & "\BON1000\"
Set FV = Worksheets("FEUILLEVIERGE")
FV.Visible = xlSheetVisible
For i = 1 To n
nbon = db + i & "-" & a & "-" & ini
Fich = nbon & ".xlsx"
FV.Copy
With ActiveSheet
.Range("J2") = nbon
.Range("I39") = Date: .Range("K39") = Date
.Name = "BON" & db + i
End With
With ActiveWorkbook
.SaveAs chDos & Fich
.Close
End With
Next i
[Tableau1].Cells(1, 1) = db + n
FV.Visible = xlSheetHidden
Unload Me
End SubLa structure est simple :
- on récupère les paramètres issus du Userform : ini (les initiales), n (le nombre de bons), db (le numero du dernier bon), et on calcule a (l'année en cours sous 2 chiffres)
(- on répercute db, a et ini dans le tableau Variables, opération quelque peu superflue, mais bon...)
- d'autres éléments constants, quel que soit le nombre de bons : chDos (le chemin du dossier d'enregistrement)
[NB- je n'ai pas repris le chemin indiqué dans le fichier initialement mais défini le chemin par celui du classeur avec un sous-dossier "BON1000" supplémentaire. Rien n'empêche de modifier, mais ce type d'organisation me paraît préférable car permet des changements sans avoir à modifier le code. J'ai ainsi pu tester sans avoir de changement de code fonction de l'emplacement où j'allais mettre les fichier...]
et on affecte la FEUILLEVIERGE à une variable (FV), et on la rend visible (nécessaire pour pouvoir la copier)
- on amorce une boucle de 1 à n pour créer les bons :
- pour chaque bon on compose le numéro (nbon), le nom du fichier à enregistrer (Fich)
- on crée une copie de la feuille dans un nouveau classeur
FV.Copy, ce qui est tout de même sans commune mesure avec ton montage surréaliste antérieur.]- sur la feuille copiée : on porte le numéro de bon, on fixe les dates, on renomme la feuille
- on enregistre le classeur et on le ferme
- en fin de boucle, on met à jour le dernier numéro de bon sur ADZA, on remasque la feuille modèle, on ferme le Userform, ce qui clôt l'opération.
Et le fichier !
Je viens d 'arriver et je sais comment vous remercier, pas encore vu le fichier mais vu les post il y a beaucoup de travail
marche pas. snifff
il va falloir que je mette a analyser tout ca car j avoue que mon langage était basique comparé au votre
ca bloque dans cbvalid
save as chDos & fich
Je vais essayé de modifier quelques bricoles car la feuille TABLEAU était prévu pour accueillir les boutons de commande.
en tout il y en aura trois, Création d'un bon libre ( celui que vous avait fait), validation d'un bon ( change le nom et renseigne le fournisseur et le montant) et le troisième validation d'une facture sans bon
en totu cas merci
cool tres cool ca marche par contre je dois mettre le dossier validation sur mon bureau
Je pense que cela va poser un problème car en fait et je ne vous l avait pas dit, le fichier réel s 'appelle bon 100 et est placé sur un serveur commun que les utilisateur vont aller ouvrir
Bon 100 est partage d'ou les initiales de chaque utilisateur
Bonsoir Bruno, le forum,
as-tu essayé le fichier de ce post :
https://forum.excel-pratique.com/viewtopic.php?p=708837#p708837
j'ai oublié de dire que Ctrl e ouvre le formulaire ; même si ça ne fait pas ce que tu veux pour l'enregistrement dans un nouveau classeur, regarde attentivement le code VBA des autres subs, car il est souvent plus simple que la version initiale (les résultats sont identiques).
⚠ les 2 boutons « + » et « - » ne font rien si le champ « NOMBRE : » est vide ; c'est normal, car il faut un N° de Bon pour « DE » et « A »
dhany
ok, merci de ton retour !
dhany
Bonjour,
Un chemin est quelque chose qui s'adapte. Il y a une variable pour le chemin (qui ne varie pas durant l'opération), une pour le fichier (dont le nom change pour chaque).
L'essentiel est de comprendre une méthode et comment s'articulent ses différents éléments.
J ai change le chemin d accès, il n y a aucun problème
ce qui me pose problème maintenant: si bruno34 validation est sur le bureau marche très bien
des que je le mets dans un dossier. la macro bloque sur save as
pour stocker un fichier sur le bureau, tu as utilisé le dossier Desktop ; à la place, utilise le dossier Documents pour stocker dans un dossier.
dhany
Je vous remercie pour votre aide
j ai rencontre un problème avec le fichier que vous m avez donné, impossible d' avoir le fichier que vous m'avez donne dans le m^me dossier que le nouveau fichier qui est enregistré
bon alors j ai repris mon dossier que j ai modifié, j ai fait une comparaison sur la création de 15 bons (alors que la moyenne sera de 25) et en temps avec mon code de novice je mets moins de temps qu'avec votre code
je vous remets votre code sur ce post et le mine sur celui qui suit
mon code n est pas académique vous allez le critiqué, il me fait gagnerdu temps car si j ai 25 bons a faire j évite de cliquer 25 fois sur plus. De plus je peux mettre mon fichier dans le même fichier ou sont enregistrés les bons de commande, chose que je n'arrive pas a faire avec le votre
la réalisation De la macro met le même temps
j évite de cliquer 25 fois sur plus
C'est quoi cette invention ! ?
Si tu ne comprends pas le fichier qu'on te fournit...
Le nombre est défini au moyen d'un bouton toupie. Si tu ne sais pas te servir d'un bouton-toupie, il faut commencer par le b-a-ba !
Mettre un fichier dans un fichier !!???
Et pour ce qui est du dossier d'enregistrement, il t'appartenait en effet d'adapter selon tes vues. C'est pas sorcier et il est tout de même aisé de se mettre en position de savoir faire ce genre de choses.
Je n'ai aucune vocation à t'empêcher de mettre en avant un code qu'un cochon aurait mieux écrit. Si tu ne comprends rien aux explications fournies, c'est sans doute qu'il faut commencer par les bases qui manquent !
Je ne perdrai pas mon temps à poursuivre dans ce contexte.
Cordialement.