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)) <...

nobodyuse

XLDnaute Occasionnel
BonjourJob75

je me permet de revenir vers toi
j'ai je pense réglé tous mes soucis et adapté de la manière qui me conviens le mieux et tout cela grace a toi ;) encore merci !
j'enregistre la nouvelle feuille dans le même classeur pour sauvegarde car je ferais un classeur par Année et n'ai pas beaucoup d'agents a gérer donc cela ne ferra pas de trop gros fichiers ;)

du coup je me heurte a un petit soucis si par cas j'ai un meme agents qui fait 2 commande la même année ce qui est possible comme ca génère un feuille nommé BC " & Range("D4") j'ai du coup une erreur qui monte puisque le nom existe déjà

serais t'il possible de faire un test de vérification si la feuille existe déjà,
si la feuille n'existe pas elle s'enregistre de manière normal
si la feuille existe deja avoir par exemple une InputBox me proposant de choisir un nouveau nom a la nouvelle feuille

pour rappel voici la code tu verra que c'est ton code qui a été utilisé
j'ai passé 2 jours complet a tester des codes trouvé a droite a gauche mais je ne trouve jamais la bonne solution

d'avance Merci pour ton aide

VB:
With Sheets("BC") 'avec feuille BC
    .Visible = xlSheetVisible 'au cas où...
    If Trim(.[D4]) = "" Then MsgBox "Nom et prénom doivent être renseignés": Application.Goto .[D4]: 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
    Nom = ThisWorkbook.Path & Application.PathSeparator & "Bon de Commande " & Trim(.[D4]) & Format(.[D6], " DD-MM-YY")
'---fichier PDF---
    .ExportAsFixedFormat xlTypePDF, Nom
    '---Nouvelle feuille---
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    ActiveSheet.Copy before:=Sheets(Sheets.Count) 'nouveau document
    ActiveSheet.Name = "BC " & Range("D4")   ' Assignation du nouveau nom à la feuille
    ActiveSheet.Protect Password:="XXXX", DrawingObjects:=True, Contents:=True, Scenarios:=True
    '---message---
    Application.ScreenUpdating = True
    MsgBox "Le Bon de commande de " & Range("D4") & ".pdf" & (" a été sauvegardé et Vérouillé dans le dossier.")


Call Archive(reponse)
  '---RAZ---
    .[D4] = ""
    derlig = .Cells.Find("Total*", , xlValues).Row - 1
    If derlig > 8 Then Union(.Range("D9:D23" & derlig), .Range("G9:H" & derlig)) = ""

Exit Sub

sortie1:
MsgBox "Merci de renseigner les champs obligatoires", vbCritical
Exit Sub

sortie2:
MsgBox "Le fichier est ouvert, veuillez le fermer", vbCritical
End With
End Sub

j'ai eut un debut de resultat en essayant de cette facon
mais ca ne semble pas marcher correctement
en cas de doublons ca me propose bien L'INPUTBOX
mais dans le cas contraire ca ne m'enregistre pas la feuille avec sous la forme BC " & Range("D4") mais me la crée en BC(2), BC(3) ...


Code:
    '---Nouvelle feuille---
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False
 ActiveSheet.Copy before:=Sheets(Sheets.Count) 'nouveau document

         '---TeST---
      On Error Resume Next
    Set f = Sheets("BC " & Range("D4"))
    If Err = 0 Then ActiveSheet.Name = "BC " & Range("D4")               ' Assignation du nom de la feuille
     '---FIN---
    FeuilleExiste = True
    nameBC = 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 = nameBC           ' Assignation du nom de la feuille en cas de doublons
    Set f = Nothing


Merci


d'avance Merci
 

job75

XLDnaute Barbatruc
Bonjour nobodyuse,

Avec la solution que j'ai proposée il n'y a pas de problème puisque :

- l'archivage se fait dans des fichiers

- le nom est suivi de la date pour distinguer les bons de commande d'un même agent.

Je vous ai dit de ne pas archiver dans des feuilles et si vous le faites vous le ferez sans moi.

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+


d'accord Job75 mais j'ai tenu compte des vos remarques justement car je n'aurai jamais 1000 onglets puisque peu d'agents a gérer (env 20) et j'ai tenu compte aussi de l'histoire des Nom trop long qui aprés essai passent tous

je me débrouillerai sans vous dommage
Merci tout de même pour l'aide fournis précédemment
 

nobodyuse

XLDnaute Occasionnel
Bonjour Job75

Je me permet de revenir vers vous
je suis revenu a l’état initial de la proposition que vous m'aviez faites car finalement on me demande de faire le suivi de plus d'agents donc votre solutions comme vous le saviez est bien plus propre et pérenne

Maintenant je me confronte a un autre soucis:

Il faudrait que je puisse faire des "stats" a partir du fichier suivi a savoir
réaliser un tableau a partir des données de suivi pour connaitre le nombre de produits commandé et pour chaque taille
en gros tel article en Taille L = X produits
Tel article en taille XL = X produits
....

je pense que vous voyez ce que je veux dire

pensez vous qu'il soit possible de le faire de maniere automatique a partir de la feuille suivi ?

Merci
 

job75

XLDnaute Barbatruc
Bonjour nobodyuse,

Il s'agit d'un nouveau problème alors créez une nouvelle discussion.

Pour terminer celle-ci je vois que la formule en Bon de commande!H24 ne convient pas.

Prenez ce fichier (4) qui utilise cette fonction VBA SP :
VB:
Function SP(plage1 As Range, plage2 As Range)
Dim i&
For i = 1 To plage1.Count
    If IsNumeric(plage1(i)) And IsNumeric(plage2(i)) Then SP = SP + plage1(i) * plage2(i)
Next
End Function
A+
 

Pièces jointes

  • Bon de commande(4).xlsm
    31.3 KB · Affichages: 5

nobodyuse

XLDnaute Occasionnel
Bonjour nobodyuse,

Il s'agit d'un nouveau problème alors créez une nouvelle discussion.

Pour terminer celle-ci je vois que la formule en Bon de commande!H24 ne convient pas.

Prenez ce fichier (4) qui utilise cette fonction VBA SP :
VB:
Function SP(plage1 As Range, plage2 As Range)
Dim i&
For i = 1 To plage1.Count
    If IsNumeric(plage1(i)) And IsNumeric(plage2(i)) Then SP = SP + plage1(i) * plage2(i)
Next
End Function
A+
qu'est ce qui ne vas pas en H24 ??
c'est quoi le soucis que je comprenne

Oui en effet il s'agit d'un autre problème mais je suis revenu ici pour revenir vers vous qui connaissez le fichier
j'ai donc crée un nouvelle discution:


Merci
 

Discussions similaires

Réponses
10
Affichages
318

Membres actuellement en ligne

Statistiques des forums

Discussions
314 783
Messages
2 112 923
Membres
111 702
dernier inscrit
ELEHMAEA