Réorganisation de base de données de colonne

caba_44 Messages postés 107 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Je suis venu sur le site il y a quelques temps et j'ai été surpris par la qualité des réponses qui était, et de très loin à la hauteur de mes attentes. C'est pourquoi, je vous sollicite à nouveau pour une problématique à laquelle je me bute.

Attention, je ne suis pas du tout un expert, programmer est pour moi aussi diificile de respirer sous l'eau :)

J'ai un fichier excel qui se configure comme suit :

COLONNE A / COLONNE B / COLONNE C / COLONNE D
ENTREPRISE 1 / TEL1 / CONTACT 1 / EMAIL 1
ENTREPRISE 1 / TEL1 / CONTACT 2 / EMAIL 2
ENTREPRISE 1 / TEL1 / CONTACT 3 / EMAIL 3
ENTREPRISE 2 / TEL1 / CONTACT 1 / EMAIL 1
ENTREPRISE 2 / TEL1 / CONTACT 2 / EMAIL 2

En gros ma base de données est gérée au contact (donc email) par ligne
Moi je souhaite avoir la possibilité de gérer ma base de données à l'entreprise en ajoutant les contacts de chaque entreprise sur la même ligne (mais à des colonne différentes.
Tout cela pour arriver à format comme suit :

ENTREPRISE1 / TEL1 / CONTACT1 / EMAIL1 / CONTACT2 / EMAIL2 / CONTACT3 / EMAIL3
ENTREPRISE2 / TEL1 / CONTACT1 / EMAIL1 / CONTACT2 / EMAIL2 / CONTACT3 / EMAIL3

Pourquoi ne puis-je pas le faire manuellement un par un ? parce que j'ai près de 50.000 sociétés. Je peux avoir jusqu'à 15 contacts maxi par fiches exactement.

J'espère avoir été précis dans ma problématique et que vous saurez trouver une solution à cela.

En attendant de vous lire,

Je vous souhaite une excellente soirée,

Mathieu Cabardis

11 réponses

  1. pépé35530 Messages postés 2951 Date d'inscription   Statut Membre Dernière intervention   1 390
     
    Bonjour,

    je ne trouve pas très judicieux de multiplier les colonnes.
    Je créerai plutôt un TDC avec en étiquettes de colonne le nom des entreprises et en zone des valeurs, les contacts et autres informations.
    En cliquant ensuite sur le nombre de contacts pour une entreprise, on obtient l'ensemble des contacts pour cette entreprise.
    En cliquant sur le total général on obtient l'ensemble des entreprises et leurs contacts respectifs.

    A+

    pépé
    0
    1. Bl4do Messages postés 40 Statut Membre 1
       
      Tout à fait d'accord. Rajoutes des lignes, celà va générer des doublons concernant les noms d'entreprise. Mais ensuite, tu fais un tableau croisé dynamique pour les regrouper par entreprise (row label = Nom entreprise).
      Et voilà, le tour est joué...
      0
  2. caba_44 Messages postés 107 Statut Membre 5
     
    Rebonjour

    Disons que je dois implémenter ça dans un nouvel erp ensuite dou la solution des tdc non efficaces pour moi,

    Je voulaisnsavoir sil existait une formule qui permet de caler a des nouvelles colónes les contacts comme précisé dans mon premier email

    Merci davance
    0
  3. pépé35530 Messages postés 2951 Date d'inscription   Statut Membre Dernière intervention   1 390
     
    Bonsoir,

    Je pense que c'est possible avec une Macro. Il faut se tourner vers les spécialistes en la matière.

    Bon courage pour la suite

    pépé
    0
  4. g Messages postés 1285 Statut Membre 578
     
    erreur
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,

    50000 lignes!
    lire avis de la maison mère la dessus
    http://office.microsoft.com/fr-ch/excel-help/utilisation-d-access-ou-d-excel-pour-gerer-vos-donnees-HA001042918.aspx

    La solution ne peut pas passer par des TCD, bien sûr

    mets un extrait de ton fichier une 100 taine de lignes
    pour joindre une pièce
    mettre le classeur sans données confidentielles en pièce jointe (format XL97-2003) sur
    https://www.cjoint.com/
    et faire un clic droit sur le lien proposé puis "copier l'adresse du lien" et coller dans le message de réponse
    0
  7. caba_44 Messages postés 107 Statut Membre 5
     
    Comme convenu,

    ci-dessous le lien : https://www.cjoint.com/?AJmkXdrbVOS

    Merci
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Ce n'est pas le m^me nombre de colonnes que dans tes messages!
      19-2 colonnes par 5 -disons 6 avec les sacrosaints 20% d'extension- cela fait 102 colonnes... et donc un tableau difficile à lire.
      si tu n'as que 3 renseignements par entreprise cela fait 20 colonnes, peu pratique mais acceptable comme l'ont signalé mes petits camarades

      Et si tu nous disais le pourquoi du comment de ton tableau?
      par exemple recherche d'une société et de ses contacts pour en choisir un de disponible ou ?...
      ou?....
      il y a peut-être d'autres solutions que celle que tu envisageais
      0
    2. caba_44 Messages postés 107 Statut Membre 5
       
      oui en gros j'ai une ligne par contact. Alors qu'il me faut une ligne par société (même si cela fait plusieurs contacts par ligne qui se suivent.

      Mon exemple était une version simplifiée mais il s'agit exactement de la même démarche.
      C'est important pour mon intégration en erp et pour d'autres raisons (même si c'est plus difficile en lecture.
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      OK, bien que je ne sache pas ce qu'est un "erp" , je pars sur la retranscription avec les 9 premières colonnes communes et les 8 autres variables
      Merci de confirmer ou de préciser car on va vers une usine à gaz et je n'ai pas envie de recommencer par suite de malentendu
      0
    4. caba_44 Messages postés 107 Statut Membre 5
       
      erp = logiciel qui va entre autre gérer notre base de données.
      Il s'agit surtout de retranscrire les variables "contact / fonction / email" ce qui fait 3 colonne supplémentaire par contact par fiche entreprise.

      Je comprends bien que ca soit quelque peu délicat en terme de lecture mais au final lorsque je vais réintégrer cela dans mon logiciel, la lecture en sera considérablement simplifiée

      En tout cas merci pour votre implication

      Mathieu
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      OK, donc je pars sur les 9 fixes et 3 contacts par ligne

      sois patient...
      0
  8. pépé35530 Messages postés 2951 Date d'inscription   Statut Membre Dernière intervention   1 390
     
    Bonjour,

    Ta dernière intervention n'apporte pas d'éléments nouveaux. Michel souhaiterait savoir ce que tu comptes faire avec cette base. Quels sont les renseignements que tu veux en tirer (consultation, tirage papier, graphique ???).
    Le chiffre de 50 000 entreprises me semble énorme et, à priori, je ne vois pas l'intérêt d'un tel recensement (travailles-tu pour un parti politique ?).

    A+

    pépé
    0
  9. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 772
     
    Bonjour tout le monde,
    50 000 lignes ça me semble ingérable, surtout avec de multiples colonnes.
    Soucieux d'aider, j'ai composé cette procédure qui, semble t'il devrait répondre à vos attentes, si cela ne fait pas planter votre système...
    !!!!!! A tester sur une copie intégrale de votre fichier sous peine de perte totale des données !!!!

    Je n'interviendrait plus sur ce sujet, faute de temps.

    Je vous recommande donc, avant de partir, de suivre les conseils avisés de michel_m (salut)

    A bientôt.

    Le code :
    Sub RegrouperParEntreprises()
    Dim liste As Object
    Dim fin As Long, Cptr As Long, Lign As Long
    Dim Col As Byte
    Dim entree As String, texteRecherche As String, memAdresse As String
    Dim tablo
    Dim tabloSh2
    Dim num As Variant
    Dim zoneRecherche As Range, celluleRecherche As Range
    
    Set liste = CreateObject("scripting.dictionary")
    'Remplit le dictionnaire avec les valeurs déjà présentes en Feuil2
    With Sheets(2)
        fin = .Columns("A").Cells(.Cells.Rows.Count, "A").End(xlUp).Row
        If fin > 2 Then
            tabloSh2 = .Range("A2:A" & fin).Value
            For Cptr = 1 To UBound(tabloSh2)
                entree = tabloSh2(Cptr, 1)
                If Not liste.exists(entree) Then liste.Add entree, entree
            Next
        End If
    End With
    
    Lign = 2 'ligne de début de restitution Feuil2
    With Sheets(1)
        fin = .Range("B" & Rows.Count).End(xlUp).Row
        tablo = .Range("B2:B" & fin).Value
        For Cptr = 1 To UBound(tablo)
            entree = tablo(Cptr, 1)
            If Not liste.exists(entree) Then
                liste.Add entree, entree
                Sheets(2).Cells(Lign, 1) = entree
                Lign = Lign + 1
                Set celluleRecherche = .Range("B2:B" & fin).Find(entree, , xlValues, xlWhole)
                If celluleRecherche Is Nothing Then
                    'inutile car l'entree va forcément être trouvée
                    MsgBox "L'entreprise : " & entree & " n'a pas pu être trouvée."
                Else
                    memAdresse = celluleRecherche.Address
                    Do
                        Col = Sheets(2).Range("IV" & Lign - 1).End(xlToLeft).Offset(0, 1).Column
                        If Col = 2 Then
                            Sheets(2).Cells(Lign - 1, Col) = CStr(.Range(celluleRecherche.Address).Offset(0, 13).Value)
                            Sheets(2).Cells(Lign - 1, Col + 1) = .Range(celluleRecherche.Address).Offset(0, 15).Value
                            Sheets(2).Cells(Lign - 1, Col + 2) = .Range(celluleRecherche.Address).Offset(0, 16).Value
                            Sheets(2).Cells(Lign - 1, Col + 3) = .Range(celluleRecherche.Address).Offset(0, 17).Value
                        Else
                            Sheets(2).Cells(Lign - 1, Col) = .Range(celluleRecherche.Address).Offset(0, 15).Value
                            Sheets(2).Cells(Lign - 1, Col + 1) = .Range(celluleRecherche.Address).Offset(0, 16).Value
                            Sheets(2).Cells(Lign - 1, Col + 2) = .Range(celluleRecherche.Address).Offset(0, 17).Value
                        End If
                        Set celluleRecherche = .Range("B2:B" & fin).FindNext(celluleRecherche)
                    Loop Until memAdresse = celluleRecherche.Address
                End If
            End If
        Next
    End With
    MsgBox "Regroupement terminé. Cf Feuil2"
    End Sub


    Votre fichier avec la macro intégrée
    Pour lancer la procédure :
    - vous placez sur la feuille Feuil1
    - ALT+F8, choisir RegrouperParEntreprises
    - Exécuter

    Bonne chance!!!!!!!

    ps : cette procédure, notamment le dictionnaire a été largement inspirée des contributions de michel_m...
    0
  10. caba_44 Messages postés 107 Statut Membre 5
     
    non c'est juste mon fichier prospect qui est sur excel que je dois impémenter dans un autre logiciel type sage erp x3.
    0
  11. caba_44 Messages postés 107 Statut Membre 5
     
    Re,

    Ca bugue, je vais le faire petits bouts par petis bouts et ca devrait passer :)

    En tout cas merci beaucoup :)

    Bonne soirée à tous(tes)

    Mathieu
    0
  12. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    ci joint maquette testée sur ta pièce jointe (env 0,4 sec.)

    merci de me dire le temps pour 50000 sociétés (j'ai l'impression qu'on peut aller + vite mais...

    en espèrant qu'il n'y ait pas saturation avec ces 50000 stés

    https://www.cjoint.com/?3JmqAmdjLhP

    le code
    Option Explicit
    
    Sub reorganiser()
    Dim Derlig As Long, Cptr As Long
    Dim T_pivot, Pivot As Object, Ref As String, Nbre_contact As Byte
    Dim Nbre_soc As Long, Liste_ste, liste_contact
    Dim T_erp
    Dim Lig As Long, Nbre As Byte, Cptr2 As Byte, Col As Byte, Fin As Long
    Dim Start As Single
    
    Start = Timer 'par curiosité
    
    With Sheets(1)
         'initialisations
         Derlig = .Columns(1).Find("*", , , , , xlPrevious).Row
         T_pivot = .Range("B2").Resize(Derlig, 1).Value
         Set Pivot = CreateObject("scripting.dictionary")
         ' création de la liste des sociétés avec le nombre de contact
         For Cptr = 1 To UBound(T_pivot) - 1
              Ref = T_pivot(Cptr, 1)
               If Not Pivot.exists(Ref) Then
                   Nbre_contact = Application.CountIf(.Columns(2), Ref)
                   Pivot.Add Ref, Nbre_contact
              End If
         Next
         Nbre_soc = Pivot.Count
         Liste_ste = Pivot.keys
         liste_contact = Pivot.items
         
         'préparation  du tableau réorganisé en 1 société=1 ligne
         ReDim T_erp(1 To Nbre_soc, 1 To 34)
         For Cptr = 0 To Nbre_soc - 1
              Lig = 1
              Nbre = liste_contact(Cptr)
              For Cptr2 = 1 To Nbre
                   Lig = .Columns(2).Find(Liste_ste(Cptr), .Cells(Lig, 2), xlValues).Row
                   If Cptr2 = 1 Then
                        For Col = 1 To 19
                             T_erp(Cptr + 1, Col) = Cells(Lig, Col)
                        Next Col
                        Fin = Col
                   Else
                        For Col = 17 To 19
                             T_erp(Cptr + 1, Fin) = Cells(Lig, Col)
                             Fin = Fin + 1
                        Next Col
                        
                   End If
              Next Cptr2
          Next Cptr
    End With
    
    'restitution du tableau final en feuille 2
    Application.ScreenUpdating = False
    With Sheets(2)
         .Range("A2:AG65000").Clear
         .Range("A2").Resize(Nbre_soc, 34) = T_erp
         .Activate
    End With
    
    Application.ScreenUpdating = True
    'curiosité personnelle sur 50000 sociétés? merci de le dire
    MsgBox "réorganisation effectuée en : " & Timer - Start & "sec."
    
    End Sub
    0