Exportation de données filtrées sur un .txt
Bonjour et tout d’abord merci de prendre le temps de vous arrêter sur mon problème.
Dans le cadre de mon boulot, sachant que je suis un des seuls de la boite à avoir quelques connaissances en vba (sauf justement sur ce que je vais vous demander…)
Il s’agit de remonter les données de petits plans de charge dans le plan de charge global de l’entreprise, ne souhaitant pas utiliser ADO, par soucis de conserver des traces pour faire des versionning, j’aimerai exporter les données du petit PDC pour pouvoir plus tard les importer sur le grand PDC. Néanmoins j’ai réfléchis déjà à l’exportation… Et la mon problème se pose, je ne sais pas comment faire ça en VBA !
En fait je souhaite pour chaque personne, avoir sa charge sur chaque projet en mois sur l’année sur un fichier texte selon certaines conditions dans ce genre :
NomProjet ; NomPersonneX ; ChargeJ ; ChargeF … ChargeD (retour chariot)
NomProjet ; NomPersonneY ; ChargeJ ; ChargeF … ChargeD
J’ai posé sur papier ce que je veux de manière Algorithmique :
Merci par avance de votre aide !
Charge(11) As Integer
Début
Pour chaque projet P de la liste // Par filtre ? Selection.AutoFilter Field := 4 Criteria1 = P ?
Pour chaque personne R de la liste // Par filtre ?
Charge.erase //vide le contenu du tableau
Pour chaque ligne non vide L du tableau
Si NL = « EN ATTENTE » OU NL= « EN COURS »
Si Annee(IL) = 2013 OU Annee(JL) = 2013
Charge(0) = Charge(0) + QL … Charge(11) =Charge(11)+ABL
FinSi
FinPour
Si ! EstVide(Charge) // Si au moins une ligne remplie les conditions
Ajouter ligne dans le txt (Projet ; Personne ; les 12Charge())
FinSi
FinPour
FinPour
Fin
Up ! S'il vous plait j'ai vraiment besoin d'aide
Bonjour Naoy93,
J'ai eu un peu de mal avec tes explications, car plutôt de commencer à écrire le programme, même si sur le fond, c'est très bien, il fallait deviner exactement ce que tu souhaitais, par exemple il faut deviner ce que veut dire IL et JL, il vallait mieux mettre les entêtes de colonnes (DEBUT et FIN) ou sa lettre (I et J), pareil avec QL et ABL, il faut deviner.
J'ai fait une double boucle car je pense que ton fichier est un extrait et qu'il faut sommer plusieurs lignes par "projet-personne", le fallait-il vraiment ?
J'espère que le bout de code qui suit répondra à tes attentes, il ne te reste plus qu'a convertir Sheet2 en fichier texte :
Option Explicit
Type Colonne
Projet As Long
Personne As Long
DateDeb As Long
DateFin As Long
Etat As Long
Janvier As Long
TopOk As Long
End Type
Sub ExportCharge()
Dim Lig1 As Long, Sh As Worksheet, LigFin As Long, ShTexte As Worksheet, cMois As Long, Lig2 As Long, aCharge(1 To 12)
Dim Col As Colonne, LigT As Long
' Chargement des colonnes
Col.Projet = 4
Col.Personne = 8
Col.DateDeb = 9
Col.DateFin = 10
Col.Etat = 14
Col.Janvier = 17
Col.TopOk = 16
Set Sh = ActiveWorkbook.Worksheets("Sheet1")
Sh.Columns(Col.TopOk).ClearContents
Set ShTexte = ActiveWorkbook.Worksheets("Sheet2")
ShTexte.Cells.Clear
LigFin = Sh.UsedRange.Rows.Count
For Lig1 = 2 To LigFin
If Sh.Cells(Lig1, Col.Projet) <> Empty And Sh.Cells(Lig1, Col.TopOk) = Empty Then
Erase aCharge
Select Case Sh.Cells(Lig1, Col.Etat).Text
Case "EN ATTENTE", "EN COURS"
For Lig2 = Lig1 To LigFin
If Sh.Cells(Lig1, Col.Projet) = Sh.Cells(Lig2, Col.Projet) And _
Sh.Cells(Lig1, Col.Personne) = Sh.Cells(Lig2, Col.Personne) Then
If Year(Sh.Cells(Lig2, Col.DateDeb)) <= 2013 _
And Year(Sh.Cells(Lig2, Col.DateFin)) >= 2013 Then
For cMois = 1 To 12
aCharge(cMois) = aCharge(cMois) + Sh.Cells(Lig2, Col.Janvier + cMois - 1)
Next cMois
Sh.Cells(Lig2, "P").Value = "Ok"
End If
End If
Next Lig2
LigT = LigT + 1
ShTexte.Cells(LigT, 1) = Sh.Cells(Lig1, Col.Projet)
ShTexte.Cells(LigT, 2) = Sh.Cells(Lig1, Col.Personne)
For cMois = 1 To 12
ShTexte.Cells(LigT, 2 + cMois) = aCharge(cMois)
Next cMois
End Select
End If
Next Lig1
End Sub
A part, mes petites critiques, ton algorithme m'a tout de même bien aidé ! Regarde comment est écrit le programme et modifie le en fonction de tes besoins
Bonjour Benead, tout d'abord un immense merci d'avoir regardé mon cas de près !
Il est vrai que mes explications étaient quelques peu vaseuses et j'en suis désolé.
Oui c'est bien ça il faut sommer les couples personne/projet !
Je testerai ce soir mais encore merci, c'est vraiment géant !
Rooh ça marche du feu de Dieu, merci encore !
Par contre pourquoi le dernier OK rentre dans la boucle ?
problème réglé par un autre case dans le 2nd for 8D
Bonsoir,
Je ne comprends pas, il y a problème ou pas ? Si oui c'est avec les mêmes données ?
Non c'est juste que l'on a oublié dans le 1er for de regarder pour la date, dans le fichier échantillon on s'en rendait pas compte, mais c'est bon c'est corrigé, excuse pour le dérangement
Re, il s'agit cette fois du problème inverse, qui est l'importation du fichier csv généré par le code précédant (C'est pourquoi je n'ai pas jugé bon de refaire un nouveau sujet... A tort peut-être).
Je voudrais pouvoir importer le csv en le choisissant, et le traiter sauf si son nom commence par "exp37", puis importer le csv de manière élaborée.
J'ai posé la façon dont je vois le déroulement de la macro de manière algorithmique (oui, j'adore les algos !)
Si le nom du csv ne commence pas par exp37…
Pour chaque ligne du csv
Pour chaque ligne i du pdc de la ligne 15 à la dernière
Si PersonneCSV <> PersonneLigne
Range (« A »&i+1).select //pour pouvoir utiliser la macro d’insertion au besoin
SinonSi ActCSV <> ActLigne
Si ActLigne = « CONGES »
Macro InserLigne +
Insérer a la ligne de la cellule actuelle la ligne du CSV
Sinon Range (« A »&i+1).select
FinSi
Si ActLigne = « »
Insérer a la ligne de la cellule actuelle la ligne du CSV
Sinon Range (« A »&i+1).select
FinSi
Sinon RemplacerLigne PDC par ligne CSV
FinSi
FinSi
FinPour
FinPour
FinSiEn gros j'avais pensé à une sorte de curseur afin de réutiliser le composant déjà existant en descendant au fur et à mesure tant que je n'ai pas croisé dans un premier temps,la personne, puis ensuite, sois l'activité, sois rien, sois "CONGES" puis traiter de manière différente en fonction...
Merci par avance pour toute aide apportée
Up, siouplait siouplait siouplait