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.
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.
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.
*************************************************************************
****** Attention pseudo code sans relation avec excel ou vb *******
*************************************************************************
// Variables
char nom_du_fichier_à_traiter // car il change toute les semaines ex: 2011_S09.xls
char fichier_traité = export_+"nom_du_fichier_à_traiter" // fichier export_2011_S09.xlsx que l'on garde mais exportera en csv
char code_tva = "0" // code tva nécessaire au logiciel de gestion commerciale
char nom_four = dim[30] // nom du fournisseur traité
int ligne_à_traiter = 1 // ligne en cours
int tva = 1.196 // c'est la tva que l'on manipulera
int coef = 0 // coef à appliquer.
const feuille_3 = worksheet(3) // c'est la troisième feuille du classeur par laquelle on commence.
// Programme
Demander nom_du_fichier_à_traiter
Demander nom du fournisseur en cours de traitement
Demander coef à appliquer
Si erreur_ouverture(nom_du_fichier_à_traiter)
exit
Sinon
Si erreur_creation(fichier_traité)
exit
sinon
Utilisation nom_du_fichier_à_traiter
Lecture feuille_3 // on commence toujours à la troisième feuille du classeur.
Tant que pas fin des feuilles
aller ligne_à_traiter
Tant que pas fin des lignes
Si colonne_3_ligne_à_traiter <> "" //on élimine les lignes blanche.
Si colonne_3_ligne_à_traiter estnum //on élimine les lignes non numériques.
On selectionne les colonne[1 à 3]de la ligne_à_traiter
recopie dans fichier_traité[ligne_à_traiter]
finsi
finsi
ligne_à_traiter + 1
feuille suivante
finsi
finsi
fermeture nom_du_fichier_à_traiter
// Traitements sur le fichier créé.
Utilisation fichier_traité
Insère une colonne entre colonne(2) et colonne(3).
ligne_à_traiter = 1
Tant que pas fin des lignes
On recopie colonne(2) dans colonne(3) // désignation courte et longue des produits
colonne(5) = colonne(4) * tva // creation prix achat ttc
effacer la formule et garder le résultat en colonne(5) // opération sur la cellule ou la colonne ? dedans ou hors boucle ?
effacer colonne(4) // on garde que le prix d'achat ttc
colonne(5) = coef // sera pris en compte par gestion commerciale.
colonne(6) = colonne(4) * coef // prix vente ttc.
colonne(7) = code_tva // code tva à 0
colonne(8) = nom_four // contient le nom du fournisseur
ligne_à_traiter + 1
enregistre le fichier_traité au format csv, séparateur point-virgule, sans guillemet délimitant les champs texte.
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.
Autres pages sur : petit probleme autoentrepreneur soumettre
Lassé par la pub ? Créez un compte
Meilleure solution
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
Proposition à étudier :
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
Proposition à étudier :
Option Explicit
Dim four As String Dim coef As String Dim msgerr As String Dim first_wsn As Variant Dim last_wsn As Variant Dim fname As String Dim wb As Workbook Dim ws_interet As Worksheet Dim cellule_cible As Range Dim num_feuille As Integer Dim ws_source As Worksheet Dim ligne_source As Range four = InputBox("Nom du fournisseur à traiter", "Fournisseur", "FOUR1") If four = "" Then Exit Sub msgerr = "" Do While True coef = InputBox("Coefficent à appliquer" & msgerr, "Coefficent", "1,1") If coef = "" Then Exit Sub If IsNumeric(coef) Then Exit Do msgerr = vbCrLf & "(un nombre, s'il vous plaît !)" Loop msgerr = "" Do While True first_wsn = InputBox("N° de la première feuille à traiter" & msgerr, "Première feuille à traiter", "1,1") If first_wsn = "" Then Exit Sub If IsNumeric(first_wsn) And Int(first_wsn) = first_wsn Then Exit Do msgerr = vbCrLf & "(un nombre entier, s'il vous plaît !)" Loop fname = Application.GetOpenFilename("Tous les fichiers (*.*),*.*") If fname = False Then Exit Sub Set wb = Workbooks.Open(fname) last_wsn = wb.Worksheets.Count Set ws_interet = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count)) Set cellule_cible = ws_interet.Range("A1") ' // <-- cible mouvante :) For num_feuille = first_wsn To last_wsn Set ws_source = wb.Worksheets(num_feuille) For Each ligne_source In ws_source.Rows If Not IsNull(ligne_source.Cells(3)) And IsNumeric(ligne_source.Cells(3)) Then ws_source.Range(ligne_source.Cells(1), ligne_source.Cells(3)).Copy Destination:=cellule_cible Set cellule_cible = cellule_cible.Offset(1) End If Next Next
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
---------------
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
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 :
---------------
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
Dans un premier temps, essaie de voir ce que tu peux faire avec ça :
C'est promis, je ne t'abandonne pas.
A te lire
' // Attention pseudo code en relation avec VBA/Excel
' // Variables
char nom_du_fichier_à_traiter ' // char[] --> String
char fichier_traité ' // trop simple pour justifier une variable
char code_tva = "0" ' // Utilisons un entier (Integer)
char nom_four = dim[30] ' // char[] --> String
int ligne_à_traiter = 1 ' // Impossible de définir et d'initialise en même temps. Il faut deux lignes
int tva = 1.196
int coef = 0
const feuille_3 = worksheet(3) ' // trop simple pour justifier une variable
// Programme
Demander nom_du_fichier_à_traiter ' // Utilise Application.GetOpenFilename
Demander nom du fournisseur en cours de traitement ' // Utilise InputBox ou crée un formulaire
Demander coef à appliquer ' // Utilise InputBox ou crée un formulaire
Si erreur_ouverture(nom_du_fichier_à_traiter)
exit
' // Ouverture d'une classeur :
Set mon_classeur = Workbooks.Open(chemin)
' // Quitter la procédure :
Exit Sub
' // Créer quoi ?
Si erreur_creation(fichier_traité)
exit
Utilisation nom_du_fichier_à_traiter
Lecture feuille_3 // on commence toujours à la troisième feuille du classeur.
Tant que pas fin des feuilles
aller ligne_à_traiter
' // La liste des feuilles, c'est Worksheets
' // La 3ème feuille, c'est Worksheets(3) Facile !
' // Eh, la quantité de feuilles est connue : Worksheets.Count
' // Il faut donc utiliser un For
For feuille_en_cours = 3 To Worksheets.Count
' // C'est ici qu'il faut initialiser ligne_à_traiter
Tant que pas fin des lignes
' // Comment détermines-tu la fin ?
Si colonne_3_ligne_à_traiter <> ""
' // On peut traiter la 3 cellule de la ligne en cours.
' // On peut aussi traiter la cellule (ligne_en_cours x 3)
' // Au choix :
Worksheets(feuille_en_cours).Rows(ligne_en_cours).Cells(3)
Worksheets(feuille_en_cours).Cells(ligne_en_cours, 3)
Si colonne_3_ligne_à_traiter estnum
' // Trop facile
IsNum()
On selectionne les colonne[1 à 3]de la ligne_à_traiter
recopie dans fichier_traité[ligne_à_traiter]
' // Non, non et non. On ne sélectionne pas, on désigne simplement et on agit dessus :
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:=....
' // C'est un peu lourd. On verra plus tard.
ligne_à_traiter + 1
fermeture nom_du_fichier_à_traiter
' // Facile :
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'
Sub ouvrir() Dim Message, Title, Default, Fournisseur, FichierAOuvrir, FichierAEcrire, FichierCsv Dim ligne_en_cours, Coef, feuille_en_cours, Nbr_Feuille ' Demander nom du fournisseur en cours de traitement ' Définit le message. Message = "Nom du fournisseur à traiter" Title = "Fournisseur à traiter" ' Définit le titre. Default = "FOUR1" ' Définition la valeur par défaut. ' Affiche le message, le titre et la valeur par défaut. Fournisseur = InputBox(Message, Title, Default) ' Demander coef a appliquer ' Définit le message. Message = "Coefficent à appliquer" Title = "Coef" ' Définit le titre. Default = "1.1" ' Définition la valeur par défaut. ' Affiche le message, le titre et la valeur par défaut. Coef = InputBox(Message, Title, Default) ' Ouverture du fichier à traiter FichierAOuvrir = Application.GetOpenFilename("Tous les fichiers (*.*),*.*") If FichierAOuvrir <> False Then Set mon_classeur1 = Workbooks.Open(FichierAOuvrir) ' Ajout d'une feuille ou seront recopiées les data interessantes Nbr_Feuille = Worksheets.Count Sheets.Add After:=Sheets(Sheets.Count) ' Traitement feuille en cours ' A partir de quelle feuille ? Message = "Traiter à partir de la feuille N° ?" Title = "Feuille" ' Définit le titre. Default = "3" ' Définition la valeur par défaut. ' Boucle de traitement des feuilles du classeur For feuille_en_cours = InputBox(Message, Title, Default) To Nbr_Feuille ' Traitement ligne par ligne For ligne_en_cours = 1 To Rows.Count ' Traitement ligne_en_cours, colonne 3 ' Si est numériques (donc non null) If IsNumeric(ActiveSheet.Cells(ligne_en_cours, 3)) Then ' Copie des colonnes 1 à 3 dans une nouvelle feuille 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)) End If Next Next End If End Sub
Bon ap'. C'est Mardi Gras, mets-t'en plein la lampe !!!!!
(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
J'attends tes autres questions
(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
J'attends tes autres questions
zeb a dit :
Bon ap'. C'est Mardi Gras, mets-t'en plein la lampe !!!!!
(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
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.
' Boucle de traitement des feuilles du classeur For feuille_en_cours = InputBox(Message, Title, Default) To Nbr_Feuille ' Traitement ligne par ligne For ligne_en_cours = 1 To Rows.Count ' Traitement ligne_en_cours, colonne 3 ' Si ce n'est pas null If Not IsNull(ActiveSheet.Cells(ligne_en_cours, 3)) Then ' Si c'est numérique If IsNumeric(ActiveSheet.Cells(ligne_en_cours, 3)) Then ' Copie des colonnes 1 à 3 dans une nouvelle feuille 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)) End If End If Next Next
Bon,
J'ai corrigé la boucle de copie des cellules par :
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 ....
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'ai corrigé la boucle de copie des cellules par :
Worksheets(feuille_en_cours).Range("A" & ligne_en_cours & ":C" & ligne_en_cours).Copy _
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 ....
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.
Je vais voir comment fusionner les deux codes.
Sub ouvrir()
Dim Message, Title, Default, Fournisseur, FichierAOuvrir, FichierAEcrire, FichierCsv, MonTrim 'Strings
Dim ligne_en_cours, feuille_en_cours, nbre_ligne, Nbr_Feuille, feuille_export 'Ints
Dim ligne_en_cours_src As Long
Dim ligne_en_cours_dest As Long
' Demander nom du fournisseur en cours de traitement
' Définit le message.
Message = "Nom du fournisseur à traiter"
Title = "Fournisseur à traiter" ' Définit le titre.
Default = "FOUR1" ' Définition la valeur par défaut.
' Affiche le message, le titre et la valeur par défaut.
Fournisseur = InputBox(Message, Title, Default)
' Ouverture du fichier à traiter
FichierAOuvrir = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
If FichierAOuvrir <> False Then
Set mon_classeur1 = Workbooks.Open(FichierAOuvrir)
' Traitement feuille en cours
Nbr_Feuille = Worksheets.Count
' Ajout d'une feuille qui sera exportée
Sheets.Add After:=Sheets(Sheets.Count)
feuille_export = Worksheets.Count
'MsgBox Nbr_Feuille & " " & feuille_export
Set FichierCsv = Worksheets(feuille_export)
' A partir de quelle feuille ?
Message = "Traiter à partir de la feuille N° ?"
Title = "Feuille" ' Définit le titre.
Default = "3" ' Définition la valeur par défaut.
ligne_en_cours_dest = 0
' Boucle de traitement des feuilles du classeur
For feuille_en_cours = InputBox(Message, Title, Default) To Nbr_Feuille
' Traitement ligne par ligne
For ligne_en_cours_src = 1 To Worksheets(feuille_en_cours).UsedRange.Rows.Count
' Traitement ligne_en_cours, colonne 3
' Si ce n'est pas une ligne blanche intercalaire
If Not IsEmpty(Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 3).Value) Then
' Si la colonne C est numérique
If IsNumeric(Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 3)) Then
ligne_en_cours_dest = ligne_en_cours_dest + 1
' Pour enlever les lignes fusionnées dans les colonnes A et B.
' (Copié-Coller de l'aide Excel)
With Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 1)
If .MergeCells Then
.MergeArea.UnMerge
End If
End With
With Worksheets(feuille_en_cours).Cells(ligne_en_cours_src, 2)
If .MergeCells Then
.MergeArea.UnMerge
End If
End With
' Copie des données
Worksheets(feuille_en_cours).Range("A" & ligne_en_cours_src & ":C" & ligne_en_cours_src).Copy _
Destination:=Worksheets(feuille_export).Range("A" & ligne_en_cours_dest)
' Enlever les blancs multiples en début de ligne désignation
Worksheets(feuille_export).Range("B" & ligne_en_cours_dest) = Trim(Worksheets(feuille_export).Range("B" & ligne_en_cours_dest))
' Modif tarif ht en ttc
Worksheets(feuille_export).Cells(ligne_en_cours_dest, 3) = Worksheets(feuille_export).Cells(ligne_en_cours_dest, 3) * 1.196
' Ajout Désignation longue
Worksheets(feuille_export).Cells(ligne_en_cours_dest, 4) = Worksheets(feuille_export).Cells(ligne_en_cours_dest, 2)
' Ajout Nom du Fournisseur
Worksheets(feuille_export).Cells(ligne_en_cours_dest, 5) = Fournisseur
' Ajout type tva "0"
Worksheets(feuille_export).Cells(ligne_en_cours_dest, 6) = "0"
' Ajout famille de produit
Worksheets(feuille_export).Cells(ligne_en_cours_dest, 7) = Worksheets(feuille_en_cours).Name
End If
End If
Next
Next
End If
End Sub
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumUn petit probleme de clavier
- ForumImage pour soumettre un formulaire
- ForumFormulaire html soumettre
- ForumAvascript soumettre formulaire
- ForumSoumettre formulaire
- ForumSoumettre form
- ForumEncore un petit probleme de ventilateur
- ForumRampage extreme 3 petit probleme
- ForumProbleme ecran trop petit
- ForumServeur web petit probleme
- Voir plus