IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro pour copie de 2 onglets en un seul


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Gérant de pme
    Inscrit en
    Juin 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gérant de pme
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 79
    Par défaut Macro pour copie de 2 onglets en un seul
    Bonjour à tous,

    Merci du temps que vous pourrez me consacrer pour m'accompagner sur cette demande
    Ce sujet ressort très souvent et je me vois désolé mais je tourne en rond sur cette macro

    je dois traiter un fichier de tarifs constructeurs qui comporte a la base 2 onglets (tarif1 & tarif2) chaque onglet compte grosso modo 1 050 000 & 630 000 lignes et pèse dans sa forme initiale 120Mo
    je traite par le biais de différentes macro une épuration des différentes colonnes inutiles, doublons pour ramener celui ci a une taille de 50 Mo et toujours 2 onglets 847 000 & 510 000 lignes.

    Bien entendu que les 2 onglets sont de conception identiques 4 colonnes avec nommage (Familly / Product / Product Description / Price in USD)

    Je dois pour pousser encore plus loin ce régime maintenant fusionner ses 2 onglets en 1 seul.
    l'objectif extraire les familles de produit qui me sont réellement utiles dans mon CRM.

    j'ai parcouru plusieurs Forums et je suis tombé sur cette macro que je n'arrive pas à adapter a mon besoin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub TableauFinal()
     
    Dim sh As Worksheet, F As Worksheet
     
    Set sh = Worksheets.Add
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("DmResultat").Delete
    Application.DisplayAlerts = True
    sh.Name = "DmResultat"
     
    For Each F In Worksheets
    If F.Name <> sh.Name Then
    If WorksheetFunction.CountA(F.UsedRange) <> 0 Then
    With F
    .Range(.Cells(1, 1), .Cells(DerLig(F), DerCol(F))).Copy _
    sh.Cells(DerLig(sh) + 1, 1)
    End With
    End If
    End If
    Next
    Set sh = Nothing: Set F = Nothing
     
     
    End Sub
     
    '--------------------------------------
    Function DerLig(sh As Worksheet)
    On Error Resume Next
    DerLig = sh.Cells.Find(What:="*", _
    LookIn:=xlFormulas, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlPrevious).Row
    On Error GoTo 0
    End Function
    '--------------------------------------
    Function DerCol(sh As Worksheet)
    On Error Resume Next
    DerCol = sh.Cells.Find(What:="*", _
    LookIn:=xlFormulas, _
    SearchOrder:=xlByColumns, _
    SearchDirection:=xlPrevious).Column
    On Error GoTo 0
    End Function
    '--------------------------------------
    Celle ci me copie correctement les 847 000 lignes de tarif1 mais ne prend pas en compte les lignes de tarif2.

    Je vous remercie par avance de l'aide que vous pourriez m'apporter
    Chris

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sauf erreur de ma part et après avoir parcouru rapidement ton code, il est impossible de te répondre car dans cette procédure tu utilises notamment deux variables dimensionnées DerLig et DerCol dont on ne voit pas à quelle moment tu les initialises
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonsoir
    j'ai eu un jour ce code de l'un des grand monsieur de ce site je crois que te convient parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub test()
    Dim c As Range, Plage As Range, j As Long, w As Worksheet
     
    j = Sheets("feuil2").Range("A1048576").End(xlUp).Row
    For Each w In ThisWorkbook.Worksheets
    If w.Name <> "Feuil2" Then ' ici la feuille qui va recevoir le résultat sans doublons
    w.Activate
    Set Plage = w.Range("A1", Range("A65536").End(xlUp))
    'j = 1
    For Each c In Plage
    If Not IsNumeric(Application.Match(c.Value, Sheets("Feuil2").Range("A:A"), 0)) _
    Or j = 1 Then
    Sheets("Feuil2").Range("A" & j).Value = c.Value
    Sheets("Feuil2").Range("B" & j).Value = Cells(c.Row, 2)
    Sheets("Feuil2").Range("C" & j).Value = Cells(c.Row, 3)
    Sheets("Feuil2").Range("D" & j).Value = Cells(c.Row, 4)
     
    j = j + 1
    End If
    Next c
    End If
    Next w
    End Sub

  4. #4
    Membre confirmé
    Homme Profil pro
    Gérant de pme
    Inscrit en
    Juin 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gérant de pme
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 79
    Par défaut
    Citation Envoyé par BENNASR Voir le message
    bonsoir
    j'ai eu un jour ce code de l'un des grand monsieur de ce site je crois que te convient parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub test()
    Dim c As Range, Plage As Range, j As Long, w As Worksheet
    
    j = Sheets("feuil2").Range("A1048576").End(xlUp).Row
    Merci pour ton aide mais j'ai peut etre oublié de préciser que je ne suis pas un expert mais volontaire pour apprendre
    Je ne comprends pas l'instruction ci dessus 
    j = Sheets("feuil2").Range("A1048576").End(xlUp).Row a quoi cela fait il référence
    For Each w In ThisWorkbook.Worksheets
    If w.Name <> "Feuil2" Then ' ici la feuille qui va recevoir le résultat sans doublons
    w.Activate
    Set Plage = w.Range("A1", Range("A65536").End(xlUp))
    'j = 1
    For Each c In Plage
    If Not IsNumeric(Application.Match(c.Value, Sheets("Feuil2").Range("A:A"), 0)) _
    Or j = 1 Then
    Sheets("Feuil2").Range("A" & j).Value = c.Value
    Sheets("Feuil2").Range("B" & j).Value = Cells(c.Row, 2)
    Sheets("Feuil2").Range("C" & j).Value = Cells(c.Row, 3)
    Sheets("Feuil2").Range("D" & j).Value = Cells(c.Row, 4)
    
    j = j + 1
    End If
    Next c
    End If
    Next w
    End Sub

  5. #5
    Membre confirmé
    Homme Profil pro
    Gérant de pme
    Inscrit en
    Juin 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gérant de pme
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 79
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Sauf erreur de ma part et après avoir parcouru rapidement ton code, il est impossible de te répondre car dans cette procédure tu utilises notamment deux variables dimensionnées DerLig et DerCol dont on ne voit pas à quelle moment tu les initialises
    Bonjour et merci du temps consacré Philippe

    Ci dessus mon message initial modifié

    Cdlt

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Citation Envoyé par Muzzik Voir le message
    je dois traiter un fichier de tarifs constructeurs qui comporte a la base 2 onglets (tarif1 & tarif2) chaque onglet compte grosso modo 1 050 000 & 630 000 lignes et pèse dans sa forme initiale 120Mo
    je traite par le biais de différentes macro une épuration des différentes colonnes inutiles, doublons pour ramener celui ci a une taille de 50 Mo et toujours 2 onglets 847 000 & 510 000 lignes
    Ce n'est vraiment pas sérieux de traiter cela dans Excel car c'est juste un tableur !
    C'est pour une association j'espère, pas une entreprise quand même ?
    J'espère que les vrais données se trouvent ailleurs, sinon les sauvegardes du classeur ont intérêt à être bétonnées !
    Dire qu'Access est au moins 50 (voir 100 !) fois plus rapide qu'Excel pour ce genre de traitement …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Muzzik Voir le message
    je traite par le biais de différentes macro une épuration des différentes colonnes inutiles, doublons pour ramener celui ci a une taille de 50 Mo et toujours 2 onglets 847 000 & 510 000 lignes.

    Je dois pour pousser encore plus loin ce régime maintenant fusionner ses 2 onglets en 1 seul.
    Tu vas te retrouver confronté une limite physique : Excel n'accepte pas plus de 1 048 576 lignes par feuille et tes données font 1 357 000 lignes.
    https://support.office.com/fr-fr/art...7-269d656771c3

    Donc, soit tu parviens à éliminer encore 250 000 lignes, soit (ce qui serait plus sage) tu t'orientes vers un gestionnaire de base de données.

  8. #8
    Membre confirmé
    Homme Profil pro
    Gérant de pme
    Inscrit en
    Juin 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gérant de pme
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 79
    Par défaut
    Bonsoir,

    Merci a tous pour vos retours, effectivement au vue de vos remarques je vais m'orienter vers Access.
    pas simple mais on va potasser le sujet

    Bien a vous tous

Discussions similaires

  1. [XL-2003] Macro pour copie onglet et rendre active la copie
    Par Sergio33600 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/01/2017, 07h39
  2. Réponses: 8
    Dernier message: 04/02/2016, 20h21
  3. Réponses: 4
    Dernier message: 05/09/2014, 09h52
  4. [XL-2003] Macro pour copie de valeurs d'une feuille dans une autre
    Par lili189 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/10/2012, 08h25
  5. [XL-2010] macro pour copie et de fichier pdf
    Par Prof_Matches dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/01/2012, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo