Se connecter avec
S'enregistrer | Connectez-vous

J'ai un petit problème d'autoentrepreneur à vous soumettre

Dernière réponse : dans Programmation

Bonjour,

J'ai un petit problème d'autoentrepreneur à vous soumettre :
- je ne gère pas la tva.
- mes fournisseur me donnent leur tarifs en ht via des classeurs excel.
- mon logiciel de gestion commerciale ne sait pas intégrer prix_client_sans_tva = prix_fournisseur*tva*coef : il gère tout (achat/vente) avec ou sans tva mais ne sais pas appliquer la tva sur les achats mais pas sur les ventes...

Evidement les classeurs excel des prix fournisseurs comportent plusieurs feuilles avec des noms variants de l'un à l'autre.
Evidement dans une feuille il y a des lignes blanches entre type de produits
Evidement dans une colonne il y a parfois des données parasites ("PROMO", "FIN_DE_VIE", "ND") au lieu du prix ht par exemple.
Mais heureusement, seul les trois premières colonnes des feuilles m'interessent (référence, désignation, prix ht).

Il me faut donc consolider les différentes feuilles d'un classeur donné pour :
- obtenir une seule feuille avec tous les produits en liste.
- manipuler les données, rajouter des colonnes.
- exporter la feuille au format csv, séparateur point-virgule, sans guillemet délimitant les champs texte pour l'importer dans mon logiciel de gestion commerciale.

En suivant le canevas ci-dessous, pouvez-vous m'aider dans mon apprentissage vb excel ?
(En parcourant le phorhum j'ai vu qu'il fallait nommer des variables, indenter etc ... Je vais m'y essayer).


Merci.
  1. *************************************************************************
  2. ****** Attention pseudo code sans relation avec excel ou vb *******
  3. *************************************************************************
  4. // Variables
  5. char nom_du_fichier_à_traiter // car il change toute les semaines ex: 2011_S09.xls
  6. char fichier_traité = export_+"nom_du_fichier_à_traiter" // fichier export_2011_S09.xlsx que l'on garde mais exportera en csv
  7. char code_tva = "0" // code tva nécessaire au logiciel de gestion commerciale
  8. char nom_four = dim[30] // nom du fournisseur traité
  9.  
  10. int ligne_à_traiter = 1 // ligne en cours
  11. int tva = 1.196 // c'est la tva que l'on manipulera
  12. int coef = 0 // coef à appliquer.
  13.  
  14. const feuille_3 = worksheet(3) // c'est la troisième feuille du classeur par laquelle on commence.
  15.  
  16. // Programme
  17. Demander nom_du_fichier_à_traiter
  18. Demander nom du fournisseur en cours de traitement
  19. Demander coef à appliquer
  20.  
  21. Si erreur_ouverture(nom_du_fichier_à_traiter)
  22. exit
  23. Sinon
  24. Si erreur_creation(fichier_traité)
  25. exit
  26. sinon
  27. Utilisation nom_du_fichier_à_traiter
  28. Lecture feuille_3 // on commence toujours à la troisième feuille du classeur.
  29.  
  30. Tant que pas fin des feuilles
  31. aller ligne_à_traiter
  32.  
  33. Tant que pas fin des lignes
  34. Si colonne_3_ligne_à_traiter <> "" //on élimine les lignes blanche.
  35. Si colonne_3_ligne_à_traiter estnum //on élimine les lignes non numériques.
  36. On selectionne les colonne[1 à 3]de la ligne_à_traiter
  37. recopie dans fichier_traité[ligne_à_traiter]
  38. finsi
  39. finsi
  40. ligne_à_traiter + 1
  41.  
  42. feuille suivante
  43.  
  44. finsi
  45. finsi
  46.  
  47. fermeture nom_du_fichier_à_traiter
  48.  
  49. // Traitements sur le fichier créé.
  50. Utilisation fichier_traité
  51.  
  52. Insère une colonne entre colonne(2) et colonne(3).
  53. ligne_à_traiter = 1
  54.  
  55. Tant que pas fin des lignes
  56. On recopie colonne(2) dans colonne(3) // désignation courte et longue des produits
  57. colonne(5) = colonne(4) * tva // creation prix achat ttc
  58. effacer la formule et garder le résultat en colonne(5) // opération sur la cellule ou la colonne ? dedans ou hors boucle ?
  59. effacer colonne(4) // on garde que le prix d'achat ttc
  60. colonne(5) = coef // sera pris en compte par gestion commerciale.
  61. colonne(6) = colonne(4) * coef // prix vente ttc.
  62. colonne(7) = code_tva // code tva à 0
  63. colonne(8) = nom_four // contient le nom du fournisseur
  64. ligne_à_traiter + 1
  65.  
  66. enregistre le fichier_traité au format csv, séparateur point-virgule, sans guillemet délimitant les champs texte.
  67. enregistre fichier_traité au format xlsx.


fin de la macro
(on reste ouvert sur fichier_traité pour vérif visuelle rapide).

Grand débutant, par ou je commence pour en faire une macro ?

Merci d'avance.
Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Eh, eh. Relis mieux ton code.
Tes lignes vides ne sont pas copiées.
Mais si tu mets la ligne ligne_en_cours de la cible dans la ligne ligne_en_cours de la destination, ça revient au même :o 

Proposition à étudier :
  1. Option Explicit
  1. Dim four As String
  2. Dim coef As String
  3. Dim msgerr As String
  4. Dim first_wsn As Variant
  5. Dim last_wsn As Variant
  6. Dim fname As String
  7. Dim wb As Workbook
  8. Dim ws_interet As Worksheet
  9. Dim cellule_cible As Range
  10. Dim num_feuille As Integer
  11. Dim ws_source As Worksheet
  12. Dim ligne_source As Range
  13.  
  14. four = InputBox("Nom du fournisseur à traiter", "Fournisseur", "FOUR1")
  15. If four = "" Then Exit Sub
  16.  
  17. msgerr = ""
  18. Do While True
  19. coef = InputBox("Coefficent à appliquer" & msgerr, "Coefficent", "1,1")
  20. If coef = "" Then Exit Sub
  21. If IsNumeric(coef) Then Exit Do
  22. msgerr = vbCrLf & "(un nombre, s'il vous plaît !)"
  23. Loop
  24.  
  25. msgerr = ""
  26. Do While True
  27. first_wsn = InputBox("N° de la première feuille à traiter" & msgerr, "Première feuille à traiter", "1,1")
  28. If first_wsn = "" Then Exit Sub
  29. If IsNumeric(first_wsn) And Int(first_wsn) = first_wsn Then Exit Do
  30. msgerr = vbCrLf & "(un nombre entier, s'il vous plaît !)"
  31. Loop
  32.  
  33. fname = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
  34. If fname = False Then Exit Sub
  35. Set wb = Workbooks.Open(fname)
  36.  
  37. last_wsn = wb.Worksheets.Count
  38. Set ws_interet = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count))
  39. Set cellule_cible = ws_interet.Range("A1") ' // <-- cible mouvante :)
  40.  
  41. For num_feuille = first_wsn To last_wsn
  42. Set ws_source = wb.Worksheets(num_feuille)
  43. For Each ligne_source In ws_source.Rows
  44. If Not IsNull(ligne_source.Cells(3)) And IsNumeric(ligne_source.Cells(3)) Then
  45. ws_source.Range(ligne_source.Cells(1), ligne_source.Cells(3)).Copy Destination:=cellule_cible
  46. Set cellule_cible = cellule_cible.Offset(1)
  47. End If
  48. Next
  49. Next
Expert Programmation

Salut, et bienvenue.

Tu veux un truc qui marche ou tu veux apprendre VBA/Excel ?
(La meilleure réponse de mon point de vue est : Les deux ;)  )

---------------

Voici trois bons éléments pour commencer :
  • Apprendre le VBA dans un livre, sur un site, avec un tuto...
  • Tout faire avec l'enregistreur de macro, en comprendre le code, puis à force de mimétisme et de bon sens, finir par s'en passer ;) 
  • Poster la question sur PPC :lol: 

    ---------------

    Pour le bouquin/site/tuto, débrouille-toi. Si t'en trouves un bon, donne-nous la référence ;) 

    Pour l'enregistreur de macro, ben vas-y fais-en un max (découpe en autant de petites actions possibles).

    Et je te proposerais de faire coller ce que tu auras trouvé ou pas avec ton pseudo-code que je suis en train d'étudier ;) 

    Hello bonjour,

    Réponse rapide : les deux mon capitaine.
    Car enregistrer et regarder c'est bien mais j'aurais certainement besoin de guide.
    Je ne veux pas vraiment apprendre vba (pas mon objectif) mais savoir le manipuler au mieux pour quelques besoins qui pourraient survenir de ci de là.
    A+
    Expert Programmation

    Dans un premier temps, essaie de voir ce que tu peux faire avec ça :
    1. ' // Attention pseudo code en relation avec VBA/Excel
    2.  
    3. ' // Variables
    4. char nom_du_fichier_à_traiter ' // char[] --> String
    5. char fichier_traité ' // trop simple pour justifier une variable
    6. char code_tva = "0" ' // Utilisons un entier (Integer)
    7. char nom_four = dim[30] ' // char[] --> String
    8. int ligne_à_traiter = 1 ' // Impossible de définir et d'initialise en même temps. Il faut deux lignes
    9. int tva = 1.196
    10. int coef = 0
    11. const feuille_3 = worksheet(3) ' // trop simple pour justifier une variable
    12.  
    13. // Programme
    14. Demander nom_du_fichier_à_traiter ' // Utilise Application.GetOpenFilename
    15. Demander nom du fournisseur en cours de traitement ' // Utilise InputBox ou crée un formulaire
    16. Demander coef à appliquer ' // Utilise InputBox ou crée un formulaire
    17.  
    18. Si erreur_ouverture(nom_du_fichier_à_traiter)
    19. exit
    20. ' // Ouverture d'une classeur :
    21. Set mon_classeur = Workbooks.Open(chemin)
    22. ' // Quitter la procédure :
    23. Exit Sub
    24.  
    25. ' // Créer quoi ?
    26. Si erreur_creation(fichier_traité)
    27. exit
    28.  
    29. Utilisation nom_du_fichier_à_traiter
    30. Lecture feuille_3 // on commence toujours à la troisième feuille du classeur.
    31.  
    32. Tant que pas fin des feuilles
    33. aller ligne_à_traiter
    34. ' // La liste des feuilles, c'est Worksheets
    35. ' // La 3ème feuille, c'est Worksheets(3) Facile !
    36. ' // Eh, la quantité de feuilles est connue : Worksheets.Count
    37. ' // Il faut donc utiliser un For
    38.  
    39. For feuille_en_cours = 3 To Worksheets.Count
    40. ' // C'est ici qu'il faut initialiser ligne_à_traiter
    41.  
    42. Tant que pas fin des lignes
    43. ' // Comment détermines-tu la fin ?
    44.  
    45. Si colonne_3_ligne_à_traiter <> ""
    46. ' // On peut traiter la 3 cellule de la ligne en cours.
    47. ' // On peut aussi traiter la cellule (ligne_en_cours x 3)
    48. ' // Au choix :
    49. Worksheets(feuille_en_cours).Rows(ligne_en_cours).Cells(3)
    50. Worksheets(feuille_en_cours).Cells(ligne_en_cours, 3)
    51.  
    52. Si colonne_3_ligne_à_traiter estnum
    53. ' // Trop facile
    54. IsNum()
    55.  
    56. On selectionne les colonne[1 à 3]de la ligne_à_traiter
    57. recopie dans fichier_traité[ligne_à_traiter]
    58. ' // Non, non et non. On ne sélectionne pas, on désigne simplement et on agit dessus :
    59. Worksheets(feuille_en_cours).Range(Worksheets(feuille_en_cours).Cells(ligne_en_cours, 3), Worksheets(feuille_en_cours).Cells(ligne_en_cours, 5)).Copy Destination:=....
    60. ' // C'est un peu lourd. On verra plus tard.
    61.  
    62. ligne_à_traiter + 1
    63.  
    64. fermeture nom_du_fichier_à_traiter
    65. ' // Facile :
    66. mon_classeur.Close ' // Lire l'aide sur Close pour avoir quelques infos pertinentes


    C'est promis, je ne t'abandonne pas.
    A te lire

    J'en suis la avec une erreur "Erreur définie par l'application ou par l'objet" à ' Copie des colonnes 1 à 3 dans une nouvelle feuille'
    1. Sub ouvrir()
    2.  
    3. Dim Message, Title, Default, Fournisseur, FichierAOuvrir, FichierAEcrire, FichierCsv
    4. Dim ligne_en_cours, Coef, feuille_en_cours, Nbr_Feuille
    5.  
    6.  
    7. ' Demander nom du fournisseur en cours de traitement
    8. ' Définit le message.
    9. Message = "Nom du fournisseur à traiter"
    10. Title = "Fournisseur à traiter" ' Définit le titre.
    11. Default = "FOUR1" ' Définition la valeur par défaut.
    12. ' Affiche le message, le titre et la valeur par défaut.
    13. Fournisseur = InputBox(Message, Title, Default)
    14.  
    15. ' Demander coef a appliquer
    16. ' Définit le message.
    17. Message = "Coefficent à appliquer"
    18. Title = "Coef" ' Définit le titre.
    19. Default = "1.1" ' Définition la valeur par défaut.
    20. ' Affiche le message, le titre et la valeur par défaut.
    21. Coef = InputBox(Message, Title, Default)
    22.  
    23. ' Ouverture du fichier à traiter
    24. FichierAOuvrir = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
    25. If FichierAOuvrir <> False Then
    26. Set mon_classeur1 = Workbooks.Open(FichierAOuvrir)
    27.  
    28. ' Ajout d'une feuille ou seront recopiées les data interessantes
    29. Nbr_Feuille = Worksheets.Count
    30. Sheets.Add After:=Sheets(Sheets.Count)
    31.  
    32. ' Traitement feuille en cours
    33. ' A partir de quelle feuille ?
    34. Message = "Traiter à partir de la feuille N° ?"
    35. Title = "Feuille" ' Définit le titre.
    36. Default = "3" ' Définition la valeur par défaut.
    37.  
    38. ' Boucle de traitement des feuilles du classeur
    39.  
    40. For feuille_en_cours = InputBox(Message, Title, Default) To Nbr_Feuille
    41.  
    42. ' Traitement ligne par ligne
    43. For ligne_en_cours = 1 To Rows.Count
    44.  
    45. ' Traitement ligne_en_cours, colonne 3
    46. ' Si est numériques (donc non null)
    47. If IsNumeric(ActiveSheet.Cells(ligne_en_cours, 3)) Then
    48.  
    49. ' Copie des colonnes 1 à 3 dans une nouvelle feuille
    50. Worksheets(feuille_en_cours).Range(Cells(ligne_en_cours, 1), Cells(ligne_en_cours, 3)).Copy Destination:=Worksheets(Sheets(Sheets.Count)).Range(Cells(ligne_en_cours, 1), Cells(ligne_en_cours, 3))
    51.  
    52. End If
    53. Next
    54. Next
    55.  
    56. End If
    57. End Sub
    Expert Programmation

    Bon ap'. C'est Mardi Gras, mets-t'en plein la lampe !!!!! :miam: 
    (EDIT: Il est où le "j'ai les crocs" ?)

    -----------------------------------------

    Ben c'est pas mal tout ça.
    Y'a juste que t'as oublié d'initialiser ligne_en_cours.
    Ah, pis remets ton test sur le non nul, parce qu'Excel considère qu'une cellule vide est numérique :pfff: 

    J'attends tes autres questions

    zeb a dit :
    Bon ap'. C'est Mardi Gras, mets-t'en plein la lampe !!!!! :miam: 
    (EDIT: Il est où le "j'ai les crocs" ?)

    -----------------------------------------

    Ben c'est pas mal tout ça.
    Y'a juste que t'as oublié d'initialiser ligne_en_cours.
    Ah, pis remets ton test sur le non nul, parce qu'Excel considère qu'une cellule vide est numérique :pfff: 

    J'attends tes autres questions


    C'est fait, je m'en suis aperçu en cherchant (2 heures... ), l'erreur c'est déplacée sur la fonction copy. ' Copie des colonnes 1 à 3 dans une nouvelle feuille'.
    Je patauge.
    Erreur 1004 Erreur définie par l'application ou par l'objet.

    Je vais chercher par la.

    1. ' Boucle de traitement des feuilles du classeur
    2. For feuille_en_cours = InputBox(Message, Title, Default) To Nbr_Feuille
    3.  
    4. ' Traitement ligne par ligne
    5. For ligne_en_cours = 1 To Rows.Count
    6.  
    7. ' Traitement ligne_en_cours, colonne 3
    8. ' Si ce n'est pas null
    9. If Not IsNull(ActiveSheet.Cells(ligne_en_cours, 3)) Then
    10. ' Si c'est numérique
    11. If IsNumeric(ActiveSheet.Cells(ligne_en_cours, 3)) Then
    12.  
    13. ' Copie des colonnes 1 à 3 dans une nouvelle feuille
    14. Worksheets(feuille_en_cours).Range(Cells(ligne_en_cours, 1), Cells(ligne_en_cours, 3)).Copy Destination:=Worksheets(feuille_export).Range(Cells(ligne_en_cours, 1), Cells(ligne_en_cours, 3))
    15.  
    16. End If
    17. End If
    18.  
    19. Next
    20. Next

    Bon,

    J'ai corrigé la boucle de copie des cellules par :
    1. Worksheets(feuille_en_cours).Range("A" & ligne_en_cours & ":C" & ligne_en_cours).Copy _
    2. Destination:=Worksheets(feuille_export).Range("A" & ligne_en_cours)


    Et ca fonctionne nettement mieux.

    Par contre j'ai TOUTES la feuille qui se recopie, les lignes blanches y comprises, les lignes avec des valeurs non numériques aussi .... :pfff: 

    Mes deux If imbriqués ne fonctionnent pas. :??: 
    Question :
    Comment faire pour que les lignes blanches ne soient pas recopiées ?
    Comment faire pour que les lignes contenant des valeurs non numériques en C3 ne soient pas recopiées ?

    Merci

    J'en suis là pour l'instant, cela fonctionne pour mes besoins.
    Je vais voir comment fusionner les deux codes.

    1. Sub ouvrir()
    2.  
    3. Dim Message, Title, Default, Fournisseur, FichierAOuvrir, FichierAEcrire, FichierCsv, MonTrim 'Strings
    4. Dim ligne_en_cours, feuille_en_cours, nbre_ligne, Nbr_Feuille, feuille_export 'Ints
    5.  
    6. Dim ligne_en_cours_src As Long
    7. Dim ligne_en_cours_dest As Long
    8.  
    9.  
    10. ' Demander nom du fournisseur en cours de traitement
    11. ' Définit le message.
    12. Message = "Nom du fournisseur à traiter"
    13. Title = "Fournisseur à traiter" ' Définit le titre.
    14. Default = "FOUR1" ' Définition la valeur par défaut.
    15. ' Affiche le message, le titre et la valeur par défaut.
    16. Fournisseur = InputBox(Message, Title, Default)
    17.  
    18. ' Ouverture du fichier à traiter
    19. FichierAOuvrir = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
    20. If FichierAOuvrir <> False Then
    21. Set mon_classeur1 = Workbooks.Open(FichierAOuvrir)
    22.  
    23. ' Traitement feuille en cours
    24. Nbr_Feuille = Worksheets.Count
    25.  
    26. ' Ajout d'une feuille qui sera exportée
    27. Sheets.Add After:=Sheets(Sheets.Count)
    28. feuille_export = Worksheets.Count
    29. 'MsgBox Nbr_Feuille & " " & feuille_export
    30. Set FichierCsv = Worksheets(feuille_export)
    31.  
    32.  
    33. ' A partir de quelle feuille ?
    34. Message = "Traiter à partir de la feuille N° ?"
    35. Title = "Feuille" ' Définit le titre.
    36. Default = "3" ' Définition la valeur par défaut.
    37.  
    38. ligne_en_cours_dest = 0
    39.  
    40. ' Boucle de traitement des feuilles du classeur
    41. For feuille_en_cours = InputBox(Message, Title, Default) To Nbr_Feuille
    42.  
    43. ' Traitement ligne par ligne
    44. For ligne_en_cours_src = 1 To Worksheets(feuille_en_cours).UsedRange.Rows.Count
    45.  
    46. ' Traitement ligne_en_cours, colonne 3
    47.  
    48. ' Si ce n'est pas une ligne blanche intercalaire
    49. If Not IsEmpty(Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 3).Value) Then
    50.  
    51. ' Si la colonne C est numérique
    52. If IsNumeric(Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 3)) Then
    53.  
    54. ligne_en_cours_dest = ligne_en_cours_dest + 1
    55.  
    56. ' Pour enlever les lignes fusionnées dans les colonnes A et B.
    57. ' (Copié-Coller de l'aide Excel)
    58. With Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 1)
    59. If .MergeCells Then
    60. .MergeArea.UnMerge
    61. End If
    62. End With
    63. With Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 2)
    64. If .MergeCells Then
    65. .MergeArea.UnMerge
    66. End If
    67. End With
    68.  
    69. ' Copie des données
    70. Worksheets(feuille_en_cours).Range("A" & ligne_en_cours_src & ":C" & ligne_en_cours_src).Copy _
    71. Destination:=Worksheets(feuille_export).Range("A" & ligne_en_cours_dest)
    72. ' Enlever les blancs multiples en début de ligne désignation
    73. Worksheets(feuille_export).Range("B" & ligne_en_cours_dest) = Trim(Worksheets(feuille_export).Range("B" & ligne_en_cours_dest))
    74. ' Modif tarif ht en ttc
    75. Worksheets(feuille_export).Cells(ligne_en_cours_dest, 3) = Worksheets(feuille_export).Cells(ligne_en_cours_dest, 3) * 1.196
    76. ' Ajout Désignation longue
    77. Worksheets(feuille_export).Cells(ligne_en_cours_dest, 4) = Worksheets(feuille_export).Cells(ligne_en_cours_dest, 2)
    78. ' Ajout Nom du Fournisseur
    79. Worksheets(feuille_export).Cells(ligne_en_cours_dest, 5) = Fournisseur
    80. ' Ajout type tva "0"
    81. Worksheets(feuille_export).Cells(ligne_en_cours_dest, 6) = "0"
    82. ' Ajout famille de produit
    83. Worksheets(feuille_export).Cells(ligne_en_cours_dest, 7) = Worksheets(feuille_en_cours).Name
    84.  
    85.  
    86. End If
    87. End If
    88.  
    89. Next
    90. Next
    91.  
    92. End If
    93. End Sub
    Expert Programmation

    Je jette un oeil à ton code, et je trouve que tu ne profite pas des conseils ou des exemples que je t'ai donné précédemment. Spa grave, j'attends ta fusion...
    Lassé par la pub ? Créez un compte