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
19exporttest.zip (4.37 Ko)

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
21exporttest.zip (14.09 Ko)

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 ? (pourtant y'a le switch case)

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

FinSi

En 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

18exporttest.csv (449.00 Octets)
13pdc2013.zip (21.50 Ko)

Up, siouplait siouplait siouplait

Rechercher des sujets similaires à "exportation donnees filtrees txt"