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

  • Auteur de la discussion remyy31500
  • Date de début

remyy31500

Nouveau membre
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.
Code:
*************************************************************************
******          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.
 

zeb

Modérateur
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 ;)
 

remyy31500

Nouveau membre
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+
 

zeb

Modérateur
Dans un premier temps, essaie de voir ce que tu peux faire avec ça :
Code:
' // 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
 

remyy31500

Nouveau membre
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'
[cpp]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
[/cpp]
 

zeb

Modérateur
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
 

remyy31500

Nouveau membre


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.

[cpp] ' 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
[/cpp]
 

remyy31500

Nouveau membre
Bon,

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

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
 

zeb

Modérateur
Meilleure réponse
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 :
Code:
Option Explicit
Code:
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
 

remyy31500

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

[cpp]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
[/cpp]
 

zeb

Modérateur
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...
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 106
Membres
1 586 287
Dernier membre
lucilleguffey
Partager cette page
Haut