XL pour MAC AIDE erreurs VBA MAC-Excel (2019)

nobodyuse

XLDnaute Occasionnel
Bonjour à toutes et tous

je suis totalement novice dans excel et encore plus en VBA, je vais donc essayer d'expliquer au mieux mon soucis

Alors voila j'ai créer un bon de commande d'articles pour les agents dont j'ai la charge
la macro que j'ai assemblé au mieux de petit morceaux chopés à droit à gauche et lancé depuis un bouton sur mon fichier elle permet de:
- Copier le bon de commande initial
- renommer le bon de commande initial sous la forme "bon de commande" avec le nom de l'agent pris dans la cellule C4 (afin de le garder en sauvegarde)
- un nouveau bon de commande est généré à partir de la copie et les données saisi y sont effacés
- et un PDF du fichier initial est créer afin de pouvoir être imprimé

Sur la version initiale du fichier cela fonctionne comme il faut
mais des que j'ai remplie à partir de la copie j'ai droit a une erreur 400 juste après l'affichage de "InputBox" pour choisir le nom de la prochaine feuille

vu mes connaissances mon code doit être totalement foireux et lors de la reproduction ça doit merder quelques part mais je sèche complétement la :/

j’espère avoir été suffisamment clair dans mes explications je vous met le code et le fichier
et m'excuse par avance si ça pique les yeux 😁

Merci d'avance

VB:
Sub dupliquerSavePDF()

'partie copie du fichier'
    Dim numFacture As String                ' Création d'une nouvelle variable de type string (= chaîne de caractères) afin d'y stocker des caractères alphanumériques
    nameBdC = InputBox("Nommez le nouveau Bon de commande", Title:="Nommez le nouveau bon de Commande Vierge", Default:="Bon de Commande ") ' Présentation d'une zone de saisie pour demander le numéro du bon de commande à l'utilisateur
ActiveSheet.Name = "Bon de commande " & Range("C4")
Sheets("Bon de commande " & Range("C4")).Copy After:=Sheets(Sheets.Count)
    ActiveSheet.Name = nameBdC           ' Assignation du nom de la feuille

'partie effacement des données nommé Saisi de la nouvelle feuille'
For Each cell In ActiveSheet.Range("Saisi")
cell.MergeArea.ClearContents
Next cell

'generation du PDF'
Dim Chemin As String
Dim texte As String

With ThisWorkbook
    Chemin = .Path & Application.PathSeparator
        With .Sheets("Bon de commande " & Range("C4"))
        titre = "Bon de commande " & Range("C4") 'Nom du fichier avec le nom de l'agent pour creation du fichier
        fichier = "Le Bon de commande de " & Range("C4") & ".pdf" 'Nom du fichier avec le nom de l'agent et extension pour messagebox
            Application.DisplayAlerts = False
            .ExportAsFixedFormat Type:=xlTypePDF, _
            FileName:=Chemin & titre & ".pdf", _
            Quality:=xlQualityMinimum, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
        End With
End With
    MsgBox fichier & (" a été sauvegardé dans le dossier.")

End Sub
 

Pièces jointes

  • Commande AgentsdiffusableV4.xlsm
    32.1 KB · Affichages: 25
Solution
Bonjour nobodyuse,

Voyez ce fichier (3) et la macro complétée :
VB:
Sub Archivage()
Dim nom$, derlig&, i&
With Sheets("Bon de commande")
    .Visible = xlSheetVisible 'au cas où...
    If Trim(.[C4]) = "" Then MsgBox "Nom et prénom doivent être renseignés !", 48: Application.Goto .[C4]: Exit Sub
    derlig = .Cells.Find("TOTAL*", , xlValues).Row - 1
    If derlig < 9 Or Application.CountA(.Range("D9:D" & derlig)) = 0 Then _
        MsgBox "Il faut au moins un article !", 48: Application.Goto .[D9]: Exit Sub
    For i = 9 To derlig
        If .Cells(i, 4) <> "" Then
            If LCase(.Cells(i, 5)) = "taille unique" Then .Cells(i, 7) = " " 'pour que la cellule ne soit pas vide
            If Application.CountA(.Cells(i, 7).Resize(, 2)) <...

Dudu2

XLDnaute Barbatruc
Bonjour,
Je ne comprends rien dans ta description. Ça tient pas debout et c'est pour ça que t'as pas de réponse.
- Copier le bon de commande initial dans une autre feuille à priori ?
- renommer le bon de commande initial pourquoi le bon de commande initial plutôt que la copie ??? Le renommage concerne la feuille ? Quelle feuille ? sous la forme "bon de commande" avec le nom de l'agent pris dans la cellule C4 (afin de le garder en sauvegarde) Il n'y a rien dans la cellule C4, d'où vient le nom de l'agent ??? En C4 de quelle feuille ?
- un nouveau bon de commande est généré à partir de la copie donc on créé une feuille copie de la feuille copie ??? et les données saisi y sont effacés y a pas de données nulle part.
- et un PDF du fichier initial est créer afin de pouvoir être imprimé

Franchement qu'est-ce que tu veux qu'on fasse avec ça, à part passer à la discussion suivante ?
 
Dernière édition:

nobodyuse

XLDnaute Occasionnel
Bonjour,
Je ne comprends rien dans ta description. Ça tient pas debout et c'est pour ça que t'as pas de réponse.
- Copier le bon de commande initial dans une autre feuille à priori ?
- renommer le bon de commande initial pourquoi le bon de commande initial plutôt que la copie ??? Le renommage concerne la feuille ? Quelle feuille ? sous la forme "bon de commande" avec le nom de l'agent pris dans la cellule C4 (afin de le garder en sauvegarde) Il n'y a rien dans la cellule C4, d'où vient le nom de l'agent ??? En C4 de quelle feuille ?
- un nouveau bon de commande est généré à partir de la copie donc on créé une feuille copie de la feuille copie ??? et les données saisi y sont effacés y a pas de données nulle part.
- et un PDF du fichier initial est créer afin de pouvoir être imprimé

Franchement qu'est-ce que tu veux qu'on fasse avec ça, à part passer à la discussion suivante ?
Bonjour Dudu2
déjà merci pour ta réponse

j'ai dit que j’essayai de m'expliquer au mieux, a priori ça dois pas être très clair mais je rappel que je suis complétement novice pour ma défense 😁
je vais essayer de t'expliquer un peu mieux désolé

Donc la feuille en question est la Feuille Bon de Commande (La feuille listing article et valeur sert de "base de donnée")

le fichier Bon de commande est a remplir à l'aide des données des liste déroulantes que ce soit le nom (le fameux nom de la cellule C4), les articles, les tailles ...un certains nombre de données s'affiche automatiquement en fonction de la sélection dans la liste comme l'immatriculation de l'agent lors de la sélection de l'agent dans la liste déroulante C4

Une fois le bon de commande rempli, le clique dans le la case "Dupliquer et Création" lance la macro qui:
- Renomme cette La feuille bon de commande sous la forme "Bon de commande et Nom de l'agent" pour sauvegarde et archivage
- Copie le fichier et le vide des données remplie afin d'avoir un nouveau bon de commande Vierge prêt à être remplit pour l'agent suivant.
- Un fichier PDF est créer a partir du premier Bon de Commande rempli (la feuille renommé avec le Nom de l'agent)

en gros au premier coup ça fonctionne, mais des que je veux passer a l'agent suivant ... j'ai une erreur ..

Voila, j’espère avoir réussi à être un peu plus clair dans l'explication 😕
Merci
 

job75

XLDnaute Barbatruc
Bonjour nobodyuse, bienvenue sur XLD, salut Dudu2,

Ceci est très simple, il suffit de remplir la feuille 'Bon de commande" puis de cliquer sur le bouton PDF :
VB:
Sub PDF()
Dim derlig&
With Sheets("Bon de commande")
    .Visible = xlSheetVisible 'au cas où...
    If .[C4] = "" Then MsgBox "Nom et prénom doivent être renseignés": Application.Goto .[C4]: Exit Sub
    If Not IsDate(.[D6]) Then .[D6] = Date
    .Rows(7).Hidden = True 'masque la ligne 7
    .ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & Application.PathSeparator & "Bon de commande " & .[C4]
    MsgBox "Fichier PDF créé"
    '---RAZ---
    .Rows(7).Hidden = False 'affiche la ligne 7
    .[C4:C5,D6,G6] = ""
    derlig = .Cells.Find("Total*", , xlValues).Row - 1
    If derlig > 8 Then Union(.Range("C9:D" & derlig), .Range("G9:H" & derlig)) = ""
End With
End Sub
Voyez aussi la formule en H24.

A+
 

Pièces jointes

  • Bon de commande(1).xlsm
    28.6 KB · Affichages: 6

Dudu2

XLDnaute Barbatruc
Bonjour @job75,
Merci pour ta contribution. J'étais en ballade dans les bois cet après-midi et tu as eu raison d'en profiter :)

@nobodyuse
Une fois le bon de commande rempli, le clique dans le la case "Dupliquer et Création"
C'est curieux que tu dupliques le bon de commande une fois rempli ce qui nécessite ensuite de
le vider des données remplie afin d'avoir un nouveau bon de commande Vierge prêt à être remplit pour l'agent suivant.
Si tu dupliquais le bon de commande vierge et saisissais tes données sur le bon dupliqué ça ne serait pas plus logique ?
 
Dernière édition:

nobodyuse

XLDnaute Occasionnel
Bonjour nobodyuse, bienvenue sur XLD, salut Dudu2,

Ceci est très simple, il suffit de remplir la feuille 'Bon de commande" puis de cliquer sur le bouton PDF :
VB:
Sub PDF()
Dim derlig&
With Sheets("Bon de commande")
    .Visible = xlSheetVisible 'au cas où...
    If .[C4] = "" Then MsgBox "Nom et prénom doivent être renseignés": Application.Goto .[C4]: Exit Sub
    If Not IsDate(.[D6]) Then .[D6] = Date
    .Rows(7).Hidden = True 'masque la ligne 7
    .ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & Application.PathSeparator & "Bon de commande " & .[C4]
    MsgBox "Fichier PDF créé"
    '---RAZ---
    .Rows(7).Hidden = False 'affiche la ligne 7
    .[C4:C5,D6,G6] = ""
    derlig = .Cells.Find("Total*", , xlValues).Row - 1
    If derlig > 8 Then Union(.Range("C9:D" & derlig), .Range("G9:H" & derlig)) = ""
End With
End Sub
Voyez aussi la formule en H24.

A+
Bonjour et Merci Job75

j'avais déjà envisagé cette solution plus simple de juste créer le PDF et vider le bon de commande de son contenu ce que j'avais fait initialement, mais mon idée pour parfaire le truc était de garder le bon de commande rempli pour archivage, le copier et vider le nouveau de son contenu de maniere a pouvoir repartir d'un nouveau pour l'agent suivant .
 

nobodyuse

XLDnaute Occasionnel
Bonjour @job75,
Merci pour ta contribution. J'étais en ballade dans les bois cet après-midi et tu as eu raison d'en profiter :)

@nobodyuse

C'est curieux que tu dupliques le bon de commande une fois rempli ce qui nécessite ensuite de

Si tu dupliquais le bon de commande vierge et saisissais tes données sur le bon dupliqué ça ne serait pas plus logique ?
re Dudu2

je ne m'y prend ptet pas de la bonne manière mais je débute, soyez indulgent :D
En effet ce serai plus pratique, mais il faudrait que je copie des le départ et ajoute celui replie en arrière mais je n'ai pas réussi a faire la commande "lastsheet" n'existant pas
vraiment je débute, sans doute pour vous cela est simple pour moi cela n'est pas le cas et je m'y prend sans doute de la très mauvaise façon
 

job75

XLDnaute Barbatruc
Puisque vous voulez un double archivage voyez ce fichier (2) et la macro :
VB:
Sub Archivage()
Dim nom$, derlig&
With Sheets("Bon de commande")
    .Visible = xlSheetVisible 'au cas où...
    If Trim(.[C4]) = "" Then MsgBox "Nom et prénom doivent être renseignés": Application.Goto .[C4]: Exit Sub
    If Not IsDate(.[D6]) Then .[D6] = Date
    .Rows(7).Hidden = True 'masque la ligne 7
    nom = ThisWorkbook.Path & Application.PathSeparator & "Bon de commande " & Trim(.[C4]) & Format(.[D6], " yyyy-mm-dd")
    '---fichier PDF---
    .ExportAsFixedFormat xlTypePDF, nom
    '---fichier xlsx---
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    ActiveSheet.Copy 'nouveau document
    ActiveSheet.UsedRange = ActiveSheet.UsedRange.Value 'supprime les formules
    ActiveSheet.DrawingObjects.Delete 'supprime le bouton
    ActiveWorkbook.SaveAs nom & ".xlsx", 51 '51 => format xlsx
    ActiveWorkbook.Close
    '---message---
    Application.ScreenUpdating = True
    MsgBox "Archivage effectué"
    '---RAZ---
    .Rows(7).Hidden = False 'affiche la ligne 7
    .[C4:C5,D6,G6] = ""
    derlig = .Cells.Find("Total*", , xlValues).Row - 1
    If derlig > 8 Then Union(.Range("C9:D" & derlig), .Range("G9:H" & derlig)) = ""
End With
End Sub
J'ai ajouté la date dans le nom du fichier, elle est au format aaaa-mm-jj pour que les fichiers soient classés chronologiquement dans le dossier.
 

Pièces jointes

  • Bon de commande(2).xlsm
    30.9 KB · Affichages: 8

nobodyuse

XLDnaute Occasionnel
Puisque vous voulez un double archivage voyez ce fichier (2) et la macro :
VB:
Sub Archivage()
Dim nom$, derlig&
With Sheets("Bon de commande")
    .Visible = xlSheetVisible 'au cas où...
    If Trim(.[C4]) = "" Then MsgBox "Nom et prénom doivent être renseignés": Application.Goto .[C4]: Exit Sub
    If Not IsDate(.[D6]) Then .[D6] = Date
    .Rows(7).Hidden = True 'masque la ligne 7
    nom = ThisWorkbook.Path & Application.PathSeparator & "Bon de commande " & Trim(.[C4]) & Format(.[D6], " yyyy-mm-dd")
    '---fichier PDF---
    .ExportAsFixedFormat xlTypePDF, nom
    '---fichier xlsx---
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    ActiveSheet.Copy 'nouveau document
    ActiveSheet.UsedRange = ActiveSheet.UsedRange.Value 'supprime les formules
    ActiveSheet.DrawingObjects.Delete 'supprime le bouton
    ActiveWorkbook.SaveAs nom & ".xlsx", 51 '51 => format xlsx
    ActiveWorkbook.Close
    '---message---
    Application.ScreenUpdating = True
    MsgBox "Archivage effectué"
    '---RAZ---
    .Rows(7).Hidden = False 'affiche la ligne 7
    .[C4:C5,D6,G6] = ""
    derlig = .Cells.Find("Total*", , xlValues).Row - 1
    If derlig > 8 Then Union(.Range("C9:D" & derlig), .Range("G9:H" & derlig)) = ""
End With
End Sub
J'ai ajouté la date dans le nom du fichier, elle est au format aaaa-mm-jj pour que les fichiers soient classés chronologiquement dans le dossier.


Bonjour Job75
C'est une solution en effet, Bravo et Merci
dommage que la feuille ne s'archive pas dans le même classeur tout de meme
 

job75

XLDnaute Barbatruc
Bonjour nobodyuse, le forum,
dommage que la feuille ne s'archive pas dans le même classeur tout de meme
Pourquoi dommage ?

- cela alourdirait le fichier : avec 1000 onglets bons de commande le fichier pèserait plus de 4 Mo

- à chaque création il faut trier les onglets : avec 1000 onglets cela prend entre 7 et 14 secondes chez moi

- le nom d'un onglet ne peut dépasser 31 caractères : De la Rochefoucauld François 2021-02-01 ne va pas.

A+
 

nobodyuse

XLDnaute Occasionnel
Bonjour nobodyuse, le forum,

Pourquoi dommage ?

- cela alourdirait le fichier : avec 1000 onglets bons de commande le fichier pèserait plus de 4 Mo

- à chaque création il faut trier les onglets : avec 1000 onglets cela prend entre 7 et 14 secondes chez moi

- le nom d'un onglet ne peut dépasser 31 caractères : De la Rochefoucauld François 2021-02-01 ne va pas.

A+
je n'avais pas vu ca ainsi en effet 😉
en tous cas merci pour ton aide 👍
 

nobodyuse

XLDnaute Occasionnel
Merci Beaucoup job75
j'ai repris ton codage en y apportant quelques modifications pour en venir a ce que je souhaitai en tenant compte de tes mises en garde!
c'est TOP 👍


Maintenant je suis confronté a un autre soucis
j'aimerai avoir une sorte de test conditionnel sur mon fichier
en effet j'ai la liste déroulante d'articles en Colonne D et j'aimerai mettre en Valeur d'une manière ou d'une autre l'obligation de Saisir La taille dans un menu déroulant en colonne G et la quantité en colonne H
j'ai utilisé une mise en forme conditionne pour les tailles en colonne G lorsque qu'un article est en taille Unique.
L'idée serais en VBA de tester si en Cellule Dx s'il y a une saisi, et mettre en Valeur les cellules correspondantes de taille en Gx (Sauf pour le cas des tailles uniques) et Quantité en Hx
par exemple par un encadré les cellules Gx et Hx en rouge jusqu'a ce quelle soit remplies et dans le cas contraire (Sauf cas de la taille unique (les tailles sont indiqué en colonne E ou dans une liste sur une feuille de donnée puisque pour afficher j'utilise " =SI(D9="";"";RECHERCHEV(D9;Liste;4;0)) " ) ouvrir un MsgBox rappelant de saisir la taille et la quantité souhaité

j’espère avoir été clair, finalement pas simple a expliquer clairement mon idée

d'avance Merci
et encore bravo job75😉
 

job75

XLDnaute Barbatruc
Bonjour nobodyuse,

Voyez ce fichier (3) et la macro complétée :
VB:
Sub Archivage()
Dim nom$, derlig&, i&
With Sheets("Bon de commande")
    .Visible = xlSheetVisible 'au cas où...
    If Trim(.[C4]) = "" Then MsgBox "Nom et prénom doivent être renseignés !", 48: Application.Goto .[C4]: Exit Sub
    derlig = .Cells.Find("TOTAL*", , xlValues).Row - 1
    If derlig < 9 Or Application.CountA(.Range("D9:D" & derlig)) = 0 Then _
        MsgBox "Il faut au moins un article !", 48: Application.Goto .[D9]: Exit Sub
    For i = 9 To derlig
        If .Cells(i, 4) <> "" Then
            If LCase(.Cells(i, 5)) = "taille unique" Then .Cells(i, 7) = " " 'pour que la cellule ne soit pas vide
            If Application.CountA(.Cells(i, 7).Resize(, 2)) < 2 Then _
                MsgBox "Taille et quantité doivent être renseignées !", 48: _
                    Application.Goto .Cells(i, 6).Resize(, 3).Find("", , xlValues): Exit Sub
        Else
            .Cells(i, 7).Resize(, 2) = ""
        End If
    Next
    If Not IsDate(.[D6]) Then .[D6] = Date
    .Rows(7).Hidden = True 'masque la ligne 7
    nom = ThisWorkbook.Path & Application.PathSeparator & "Bon de commande " & Trim(.[C4]) & Format(.[D6], " yyyy-mm-dd")
    '---fichier PDF---
    .ExportAsFixedFormat xlTypePDF, nom
    '---fichier xlsx---
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    ActiveSheet.Copy 'nouveau document
    ActiveSheet.UsedRange = ActiveSheet.UsedRange.Value 'supprime les formules
    ActiveSheet.DrawingObjects.Delete 'supprime le bouton
    ActiveWorkbook.SaveAs nom & ".xlsx", 51 '51 => format xlsx
    ActiveWorkbook.Close
    '---message---
    Application.ScreenUpdating = True
    MsgBox "Archivage effectué"
    '---RAZ---
    .Rows(7).Hidden = False 'affiche la ligne 7
    .[C4:C5,D6,G6] = ""
    Union(.Range("C9:D" & derlig), .Range("G9:H" & derlig)) = ""
End With
End Sub
Vous avez encore du boulot pour que les listes de validation et les MFC soient correctes.

A+
 

Pièces jointes

  • Bon de commande(3).xlsm
    32.4 KB · Affichages: 7

Discussions similaires

Réponses
3
Affichages
306

Statistiques des forums

Discussions
311 720
Messages
2 081 899
Membres
101 834
dernier inscrit
Jeremy06510