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é :

7validation.xlsm (170.71 Ko)

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... La situation n'ayant guère varié depuis hier, je peux me concentrer un moment sur la reconfiguration de ton dispositif Excel...

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 ! Ce qui évitera d'avoir à les éliminer lors de l'export ! (Cette question est à garder en considération lors des évolutions ultérieures).

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 ! et remplacée par une TextBox (tbNb) assortie d'un SpinButton (spbNb). La valeur Min par défaut du bouton est mise à 1 (et c'est sa valeur par défaut à l'ouverture). Le Max est laissé à 100 (ce qui pourra éventuellement être modifié...).

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 conserve donc ce dispositif.

- 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 Sub

Il 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 Sub

Les 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 Sub

La 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 Sub

La 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
[La commande est :
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

oui très bien merci

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

12validation.xlsm (202.09 Ko)

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 !!??? Désolé mais ça ne veut rien dire, et ça ne peut se faire !

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.

Rechercher des sujets similaires à "probleme creant nouveau fichier deux"