Code VBA pour réorganisation d'un fichier

kremelin -  
 kremelin -
Bonjour,

Voila j'ai un fichier excel qui contient des données. Ce fichier est inexploitable en l'état, je voudrais modifier son organisation pour pouvoir bénéficier des données. J'ai commencé à écrire en VBA.

Voici l'architecture du fichier

Société Commerciale Type indicateur représentants Pharmaciens Hôpitaux

127 Expédition 10 50 100
Colis 6 100 93
Poids 30 40 230
130 Expédition 10 50 100
Colis 6 100 93
Poids 30 40 230

le résultat doit être le suivant

Société Commerciale Type de destinataire Expédition Colis Poids
127 Représentant 10 6 30
127 pHARMACIENS 50 100 93
127 HOPITAUX 100 93 230

Voici le code que j'ai commencé à écrire

Sub RécupérerLignesDétail()

Set sht = Sheets("Base Donnée")
Application.Calculation = xlCalculationManual
'étape 1 : effacer le contenu de la base Base Donnée
sht.Range("A4:L65000").ClearContents
'étape 2 : repérer la dernière ligne remplie d'après la collonne K
n = Range("K65000").End(xlUp).Row
'étape 3 : balayage de la liste et écriture dans Base Donnée
Numbd = 4 'N° de la ligne Base Donnée ou écrire l'enregistrement
For I = 1 To n
If Cells(I, 1) <> "" Then

'étape 3-1 : récupération des informations
SOCIETE = Cells(I, 1)
Grossistes = Cells(I, 3)
Représentants = Cells(I, 4)
Pharmaciens = Cells(I, 5)
Hôpitaux = Cells(I, 6)
Prestataires = Cells(I, 7)
Dentistes = Cells(I, 8)
International = Cells(I, 9)
Divers = Cells(I, 10)

'étape 3-2 : écriture des informations dans la Base Donnée
sht.Cells(Numbd, 2) = Grossistes
sht.Cells(Numbd, 3) = Représentants
sht.Cells(Numbd, 4) = Pharmaciens
sht.Cells(Numbd, 1) = SOCIETE
sht.Cells(Numbd, 5) = Hôpitaux
sht.Cells(Numbd, 6) = Prestataires
sht.Cells(Numbd, 7) = Dentistes
sht.Cells(Numbd, 8) = International
sht.Cells(Numbd, 9) = Divers
Numbd = Numbd + 1 'Incrément du n° de ligne de la Base Donnée
End If

Next I

sht.Range("A2") = "Liste récupérée le " & Date & " a " & Time
Application.Calculation = xlCalculationAutomatic

End Sub

4 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour,

    mets en pièce jointe un bout de ton classeur sans données confidentielles (j'ai rien compris à la disposition actuelle et demandée)
    si tu ne connais pas:
    utilises cijoint.fr
    et colles le lien proposé dans ton message
    si tu as XL2007 mettre un classeur au format 97-2003
    0
    1. kremelin
       
      http://www.cijoint.fr/cjlink.php?file=cj201010/cijO5fCLL8.xls

      vOICI LE LIEN

      TIENS MOI COURANT si ça marche

      merci
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Excuses moi, mais je comprends rien à ce que tu veux faire: ta présentation dans ton message, ton classeur avec sheet1 qui ressemble à ce que tu veux transposer,ta base de données sur les expéditions, ta macro qui semble travailler sur "base de données" que je ne retrouve pas dans ce que tu as et ce que tu voudrais...

      Peut être ou plutôt quelqu'un d'autre + éveillé que moi pourra t'aider...
      Désolé
      0
  2. kremelin
     
    Désolé je n'ai pas été très clair, j'avais oublié de te mettre le résultat que je souhaite. je t'ai mis le résultat sur la feuille base de donnée le deuxième Tableau. le 1 er étant le résultat de mon code Vba.

    http://www.cijoint.fr/cjlink.php?file=cj201010/cijilrF8VL.xls

    J'espère être plus clair cette fois ci

    merci
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      OK, pigé ;-)

      Y'a du boulot, sois patient !

      @+
      0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,

    proposition:
    http://www.cijoint.fr/cjlink.php?file=cj201010/cijDePUBOp.xls

    ze macro VBA:
    Option Explicit 
    
    Sub recuperer_detail_lignes() 
    Dim Derlig As Long, Lig As Long, col As Byte 
    Dim tablo 
    Dim cptr As Long, cptr_l As Byte, destinater As Range
    
    ReDim tablo(7, 0) 
    
    With Sheets("sheet1") 
        Derlig = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row 
    
        For Lig = 2 To Derlig Step 6 
        'test = .Cells(Lig, 1) 
                For col = 3 To 10 
                 set destinater = Range(.Cells(Lig, col), .Cells(Lig + 5, col)) 
                    If Application.Sum(destinater) > 0 Then 
                        ReDim Preserve tablo(7, cptr) 
                        tablo(0, cptr) = .Cells(Lig, 1) 
                        tablo(1, cptr) = .Cells(1, col) 
                        For cptr_l = 2 To 7 
                            tablo(cptr_l, cptr) = .Cells(Lig + cptr_l - 2, col) 
                        Next 
                        cptr = cptr + 1 
                     End If 
                Next 
        Next 
    End With 
    
    Application.ScreenUpdating = False 
    With Sheets("base donnée") 
        .Range("A2") = "liste récupérée le " & Format(Date, "dd/mm/yy") & " à " & Format(Time, "hh:mm:ss") 
        .Range("A5:H10000").Clear 
        With .Range("A5").Resize(cptr, 8) 
            .Value = Application.Transpose(tablo) 
            .Borders.Weight = xlThin 
        End With


    Tu dis...
    Michel
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      bonjour,

      version 2 avec restitution peut-être + claire (séparation entre sociétés et police 8)
      http://www.cijoint.fr/cjlink.php?file=cj201010/cijp9Tqzij.xls
      0
    2. kremelin
       
      Merci, bcp.

      Je vais étudié ton programme VBA. Je commence sur VBA donc il me faut du temps pour comprendre ce que tu as fait afin de pouvoir l'adapter dans le cas ou je rencontrerais un fichier de même type.

      Je te remercie...
      0