Mise en place d'un gestionnaire de Bon de Livraison et Bon de Commande Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
Avatar du membre
Dan
Modérateur
Modérateur
Messages : 6'369
Appréciations reçues : 110
Inscrit le : 27 avril 2007
Version d'Excel : Office 365, Mac 2011

Message par Dan » 4 septembre 2017, 14:07

Re

Essaie avec ces deux codes. Le bouton doit pointer sur les macros Suppression.
Sub Suppression()
Dim sh As String
''''''''''''''''''''''''''''''''''''''
'Suppression des données saisies pour laisser place à une nouvelle saisie

''''''''''''''''''''''''''''''''''''''
With Sheets("Bon de Livraison")
    .Unprotect 'Retire la protection de la feuille
    sh = .Name
    effaceimage sh ', sh 'Appel le code pour effacer les images logo
    .Rows("62:800").Delete Shift:=xlUp 'Supprime le lignes de 62 à 800
    .Protect 'Protège la feuille en cours
End With

With Sheets("Bon de Commande")
    .Unprotect 'Retire la protection de la feuille
    sh = .Name
    effaceimage sh 'BC, BC 'Appel le code pour effacer les images logo
    .Rows("62:800").Delete Shift:=xlUp 'Supprime le lignes de 62 à 800
    .Range("E14,E16,H16:J16,C21:C54,H21:H54,C57:D57").ClearContents 'Efface le contenu des cellules sélectionnées
    .Range("G4") = .Range("G4") + 1 'Ajoute 1 pour les prochain N° de BL
    .Range("E14").Select 'Place le curseur en cellule E14
    .Protect 'Protège la feuille en cours
End With
End Sub

Sub effaceimage(sh)
Dim img As Byte
On Error Resume Next
If sh = "Bon de Livraison" Then img = 2 Else img = 4
With Sheets(sh)
    For i = img To .Shapes.Count
        .Shapes(i).Delete
    Next i
End With
End Sub
Je te mets le code en présentation VBA car dans le msg précédent ce n'est pas trop lisible ...
Pour rendre le code visible, sélectionne le code puis utilise les balises en cliquant sur le bouton CODE au dessus.

Cordialement
1 membre du forum aime ce message.
@+ Dan ;)
D
DUAL ex
Membre habitué
Membre habitué
Messages : 85
Inscrit le : 4 août 2017
Version d'Excel : 2016

Message par DUAL ex » 15 novembre 2017, 09:55

Salut Dan,

Je suis de retour et jspr que tu vas bien.

Pour continuer dans ce projet je n'arrive pas à adapter ce code au fichier. Je voudrais, lors du click bouton "nouvelle page" générer une nouvelle page identique au dessous.

voici le code que je n'arrive pas à adapter :
Private Sub NOUVELLEPAGE_Click()
Dim lig As Integer

    With Sheets("MACBC")
        .Unprotect
        lig = .Cells.Find("*", Lookln:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 2
        .Row("1:55").Copy.Range ("A" & lig)
        lig = lig + 23
        
            .Range("C" & lig & ":C" & lig + 33).ClearContents
            .Range("I" & lig & ":I" & lig + 33).ClearContents
       
            .PageSetup.PrintAre = "$A$1:$K$" & lig + 40
            .Protect
        End With
    
End Sub

Je te joins une capture image pour visualiser la présentation.
Merci pour ton aide.

Bonne journée,
Alex
NOUVELLE PAGE.png
D
DUAL ex
Membre habitué
Membre habitué
Messages : 85
Inscrit le : 4 août 2017
Version d'Excel : 2016

Message par DUAL ex » 15 novembre 2017, 13:46

Hello Dan,

Je ne sais pas si tu reçois bien mes MP alors voici le dernier fichier en cours suite à mon absence. Je te tenais informé que celui ci à été construit depuis Windows 7 et que je suis passé par des contrôles actives X et non pas des contrôles de formulaire.

Est-ce optimal comme procédé ? Perso je trouve que ça classe mieux mes CODES VBA (par feuille) et j'ai plus de facilité à m'y retrouver quand je remets les mains dans le cambouis ^^.

pour le travail en cours : je n'arrive pas à adapter le code NOUVELLE PAGE au format de la page MACBC
Private Sub NOUVELLEPAGE_Click()
Dim lig As Integer


    With Sheets("MACBC")
        .Unprotect
        lig = .Cells.Find("*", Lookln:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 2
        .Row("1:55").Copy.Range ("A" & lig)
        lig = lig + 23
        
            .Range("C" & lig & ":C" & lig + 33).ClearContents
            .Range("I" & lig & ":I" & lig + 33).ClearContents
       
            .PageSetup.PrintAre = "$A$1:$K$" & lig + 40
            .Protect
        End With
    
    

End Sub
Je te joins le fichier qu'il à fallu que je sabre pour diminuer la taille. Mais l'essentiel est dedans.

Encore merci.
Alex.
V2.4 Prises de commandes - Copie.xlsm
(285.88 Kio) Téléchargé 10 fois
Avatar du membre
Dan
Modérateur
Modérateur
Messages : 6'369
Appréciations reçues : 110
Inscrit le : 27 avril 2007
Version d'Excel : Office 365, Mac 2011

Message par Dan » 15 novembre 2017, 18:59

Re

J'ai retenu que tu étais sous MAC donc là surtout ne pas utiliser les activesX qui ne fonctionnent pas sur MAC ... donc c'est pas une bonne idée du tout.
Est-ce optimal comme procédé ? Perso je trouve que ça classe mieux mes CODES VBA (par feuille) et j'ai plus de facilité à m'y retrouver quand je remets les mains dans le cambouis ^^.
A ne pas faire non plus. Ce n'est pas une bonne idée car si par hasard tu supprimes une feuille tu perds tout tandis que dans un module les macros peuvent servir pour tout le fichier et tu ne les perds que si tu supprimes le fichier....
De plus si tu dupliques des feuilles et que tu as des codes dedans, tu vas avoir autant de codes que de feuilles alors qu'un simple code dans un module peut être utilisé pour toutes tes feuilles. ... là le poids du fichier va augmenter et cela complique si tu dois changer quelque chose dans un code..... faudra le changer dans tous les codes qui ont la même action dans les feuilles concernées.
pour le travail en cours : je n'arrive pas à adapter le code NOUVELLE PAGE au format de la page MACBC
Vois le code ci-dessous
Private Sub NOUVELLEPAGE_Click()
Dim lig As Integer

With Sheets("MACBC")
    .Unprotect
    lig = .Cells.Find("*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 2
    .Rows("1:55").Copy .Range("A" & lig)
    lig = lig + 23
    .Range("C" & lig & ":C" & lig + 22).Clear
    .Range("I" & lig & ":I" & lig + 22).Clear
   
    .PageSetup.PrintArea = "$A$1:$K$" & lig + 40
    .Protect
End With
End Sub
Si tu le replaces dans un module, modifie la première ligne comme ceci --> Private Sub NOUVELLEPAGE() et ensuite réassocier le code à un bouton.
1 membre du forum aime ce message.
@+ Dan ;)
D
DUAL ex
Membre habitué
Membre habitué
Messages : 85
Inscrit le : 4 août 2017
Version d'Excel : 2016

Message par DUAL ex » 16 novembre 2017, 10:53

Super Dan,

Au final j'y étais presque... à croire que j'ai fais exprès de ne pas trouver :oops: :oops: :oops:

J'ai tout de même apporté ma petite touche au code : j'ai rallongé la copie jusqu'à la colonne L.
Toutefois, au bout de 3 ajouts de feuille, j'ai le haut d'une feuille qui se copie et me donne, lors de l'impression 4 feuille au lieu de trois. Surement un petit réglage.

Maintenant je suis sur la partie "NOUVELLE SAISIE" : je veux donc supprimer les pages supplémentaires que je viens de créer pour laisser place à une nouvelle saisie.

Peux-tu encore, stp, vérifier mon code ci dessous : il fonctionne très bien mis à part la partie "CALL EFFACEIMG" que je ne sais pas à quelle moment l'appeler.
Est il optimisé ?

De plus, sur ton code tu avais intégré des variantes i = 1 To 2 qui indique les onglets en position 1 et 2.
Etait-ce important ? j'ai sabrer cette partie que, j'avoue, je ne maîtrise pas trop.


Private Sub EFFACE_Click()
'VALIDATION DE VOTRE CHOIX AVANT SUPPRESSION
    If MsgBox("Voulez-vous supprimer les données saisies ?", 36, "Continuer ?") = vbYes Then
    
'Code à exécuter si OUI
ActiveSheet.Unprotect 'ote la protection

 Range("C24:C47,I24:I47,E14,E16,H16,E19,C50").Select 'efface les données saisies au préalable (code MAC et quantités)
    Selection.ClearContents
ActiveSheet.Rows("54:800").Delete Shift:=xlUp 'Supprime le lignes de 54 à 800

'Change de feuille
Sheets("NUMEROBON").Select
Sheets("NUMEROBON").Range("E6").Select
    Sheets("NUMEROBON").Range("E6") = Sheets("NUMEROBON").Range("E6") + 1 ' Ajoute +1 au bon de commande

'Change de feuille
Sheets("MACBC").Select
Sheets("MACBC").Range("E14").Select

ActiveSheet.Protect 'protège la feuille

    End If
End Sub
 
    
''''''''''''''''''''''''''''''''''''''
'voici le VBA que tu m'avais écrit pour la dernière version du programme
''''''''''''''''''''''''''''''''''''''
'Dim lig As Integer
'Dim i As Byte
'For i = 1 To 2 'Sélectionne les deux premier onglets
'    With Sheets(i) 'avec ces onglets selectionnés :
'        .Unprotect 'ote la protection

'Il faudra que j'adapte de nouveau ce code efface image
'Call effaceimage 'Appel le code pour effacer les images logo
'    .Rows("54:800").Delete Shift:=xlUp 'Supprime le lignes de 54 à 800
    
'If i = 1 Then
'    Range("E14,E16,H16:J16,C21:C54,H21:H54,C57:D57").Select
'    Selection.ClearContents 'Efface les cellules sélectionnées
'    Range("G4") = .Range("G4") + 1 'Ajoute 1 pour les prochain N° de BL
'    Range("E14").Select
'End If

'        .Protect 'Protge les onglets
'    End With
'Next i
    
Avatar du membre
Dan
Modérateur
Modérateur
Messages : 6'369
Appréciations reçues : 110
Inscrit le : 27 avril 2007
Version d'Excel : Office 365, Mac 2011

Message par Dan » 16 novembre 2017, 12:59

Re,
Toutefois, au bout de 3 ajouts de feuille, j'ai le haut d'une feuille qui se copie et me donne, lors de l'impression 4 feuille au lieu de trois. Surement un petit réglage.
Il faudrait que j'ai le dernier fichier pour analyser
Peux-tu encore, stp, vérifier mon code ci dessous : il fonctionne très bien mis à part la partie "CALL EFFACEIMG" que je ne sais pas à quelle moment l'appeler.
Code à essayer
Private Sub EFFACE_Click()
'VALIDATION DE VOTRE CHOIX AVANT SUPPRESSION
    If MsgBox("Voulez-vous supprimer les données saisies ?", 36, "Continuer ?") = vbYes Then
    
    'Code à exécuter si OUI
    With ActiveSheet
        .Unprotect 'ote la protection
        'efface les données saisies au préalable (code MAC et quantités)
        .Range("C24:C47,I24:I47,E14,E16,H16:J16,E19:J19,C50:E50").Clear
        .Rows("54:800").Delete Shift:=xlUp 'Supprime le lignes de 54 à 800
        .Protect 'protège la feuille
    End With
    
    'Change de feuille
    Sheets("NUMEROBON").Range("E6") = Sheets("NUMEROBON").Range("E6") + 1 ' Ajoute +1 au bon de commande
    'Change de feuille
    Sheets("MACBC").Select
End If
End Sub
Au vu de ton code le For i = 1 to 2 n'a plus de raison d'être, je pense

Oublie pas de replacer dans un module...
1 membre du forum aime ce message.
@+ Dan ;)
D
DUAL ex
Membre habitué
Membre habitué
Messages : 85
Inscrit le : 4 août 2017
Version d'Excel : 2016

Message par DUAL ex » 22 novembre 2017, 16:01

Comme d'hab, le code fonctionne. Great !!!

Comme tu l'a demandé, j'ai tout mis sous des modules, créer des formes que j'ai associé aux macros. OK.
J'ai sabré le fichier pour qu'il soit < à 300 Mo.

J'ai laissé les 2 macros sur lesquelles je travail :

"NOUVELLE PAGE", le problème : dès l'ajout d'une page quand je fais enregistrement pdf ou impression, il sort trois page. La troisième étant vierge.
De la même façon, dès la troisième page ajoutée, un bout de haut de page s'insert.
Peux tu me dire d'où ça vient please.

"NOUVELLE SAISIE" : cette macro appelle la macro "EFFACEIMAGE" mais cette dernière ne supprime pas les images ajoutées !!! :cry:
de plus, lors de la suppression des données, la macro supprime TOUTES les mises en pages des cellule sélectionnées ! plus de cellule fusionnées, plus de liste déroulante ou de mise en forme conditionnelle !!! WTF ??


Enfin, tu pourra voir que j'ai mis une DATAbase de plus. Il y en aura beaucoup d'autre.
La question est la suivante : (je vais essayer d'être synthétique)

Depuis la feuille de saisie des données... (MACBC)
comment appeler les produits avec leurs codes sachant que :
- J'ai un tableau par fournisseur (chaque tableau doit être évolutif et il est nécessaire que ce soit des tableaux séparés)
(Tous les tableaux ont les même colonnes.)
à la base je voulais créer autant de fiche de saisie que j'avais de base de données fournisseur. Mais le fichier aurais pesé 3 tonnes !

Je pensais à ouvrir une autre feuille qui aura pour but d'additionner tous les tableau en un seul.
J'ai cru voir que c'était possible sur un tuto.
ainsi les RECHERCHEV irons chercher la réforme taper dans cette nouvelle feuille... Qu'en penses tu ?

Merci pour ton aide Dan...
Alex.
V3.1 Prises de commandes.xlsm
(281.61 Kio) Téléchargé 10 fois
Avatar du membre
Dan
Modérateur
Modérateur
Messages : 6'369
Appréciations reçues : 110
Inscrit le : 27 avril 2007
Version d'Excel : Office 365, Mac 2011

Message par Dan » 23 novembre 2017, 13:17

Re
"NOUVELLE PAGE", le problème ....
Dans le code, remplace le 40 par 29 dans cette ligne
.PageSetup.PrintArea = "$A$1:$L$" & lig + 40
Je vois pour le reste. Mais de base toujours éviter les cellules fusionnées. Cela met toujours le souc à un moment ou un autre avec le code VBA. Comme de plus ici on essaie de faire fonctionner sous Windows et sous MAC, il y a parfois quelques particularités
Depuis la feuille de saisie des données... (MACBC)
comment appeler les produits avec leurs codes sachant que :
C'est peut être une bete question mais pourquoi tu ne mets pas le nom du fournisseur dans une cellule de la feuille MACBC ou alors utiliser la ref des trois premières lettres du fournisseur dans le "code" utilisé en colonne C (MAC001 au lieu de 1 ?). La première solution me semble la meilleure mais à toi de me dire. Je suppose que tu utilises toujours la même feuille MACBC pour tous les fournisseurs et que chaque MACBC ne concerne qu'un fournisseur ?
1 membre du forum aime ce message.
@+ Dan ;)
D
DUAL ex
Membre habitué
Membre habitué
Messages : 85
Inscrit le : 4 août 2017
Version d'Excel : 2016

Message par DUAL ex » 23 novembre 2017, 14:45

Hello Dan,

Super ça fonctionne. (au bout de la deuxième feuille ajoutées j'ai tout de même le haut d'une autre page, mais cela n'apparait pas lors de l'enregistrement pdf.)

Pour le fait que cela supprime mes mise en page, j'ai trouvé l'erreur : dans le code il y avait écrit Clear
alors qu'il fallait écrire ClearContents.

Et ça fonctionne.

Reste plus qu'à supprimer l'image qui traine après la suppression.

Le nom du fournisseur y sera (après le numéro de bon en haut).
De plus je ne vais pas avoir le choix que de taper la ref entièrement dans code pour appeler la référence... en tapant 1 pour avoir MA001 je voulais faciliter la tache de la personne en charge de la saisie des commandes.

J'attends ton retour pour EFFACEIMAGE.

Merci,
Alex.
Avatar du membre
Dan
Modérateur
Modérateur
Messages : 6'369
Appréciations reçues : 110
Inscrit le : 27 avril 2007
Version d'Excel : Office 365, Mac 2011

Message par Dan » 23 novembre 2017, 21:25

Re

Ok pour le Clearcontents, je l'avais changé en Clear car j'avais quelques soucis sous MAC. Mais là cela fonctionne...
Le nom du fournisseur y sera (après le numéro de bon en haut).
De plus je ne vais pas avoir le choix que de taper la ref entièrement dans code pour appeler la référence... en tapant 1 pour avoir MA001 je voulais faciliter la tache de la personne en charge de la saisie des commandes.
Si je considère les points suivants :
- Chaque fournisseur est identifié par 3 lettres (MAC, MEM, ...)
- Les feuilles de base de données sont identifiées comme ceci --> MACDATA, MEMDATA

Voici ce que tu peux faire:
- En I4, tu mets --> .MAC ou .MEM (Bizarre ce point devant, tu aurais pu mettre sans le point..)
- Dans tes formules RECHERCHEV à boite remplace MACDATA!$A$2:$Q$279 par --> INDIRECT(DROITE($I$4;3)&"DATA" & "!$A$2:$Q$279")
- Tu recopies cette formule jusque la ligne 46

Comme cela dans la colonne Code, tu mets uniquement le chiffre sans MAC ou MEM

Je dois regarder pour les images car le code ne fonctionne pas très bien sachant que l'on doit laisser la première image au dessus

Amicalement
1 membre du forum aime ce message.
@+ Dan ;)
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message