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 :

Compter, inserer, et copier [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut Compter, inserer, et copier
    Bonjour à tous
    J'ai ,dans le cadre d un stage, developpé une macro sur excel 2007, mais étant un débutant en VBA, je sollicite votre aide, ca fait 3 mois que je galère
    J'ai réussi à faire un bout de programme qui marche! mais tres lentement et j'ai une fonction que je n'arrive pas à faire en VBA.
    Je mets mon fichier test en piece jointe car c'est assez complexe:

    sur la feuil1 j'ai de J2 à J11 des numeros de plan à la suite (ici appelé 1,2,3 etc...)
    sur la feuil2 j'ai ces memes numeros de plan dans la colonne D, mais plusieurs fois et dans n'importe quelle ordre. Ils sont rattachés à un indice sur la colonne A.
    J essaye de compter combien ce meme numero de la feuil1 colonne J ce retrouve sur la feuil2 colonne D, une fois trouvé combien il y en a
    j'insere sur la feuil1 à l'endroit ou j'ai le numero compté autant de ligne que de numero trouve sur le feuil2 et je copie le numero compté. Jusque là ca marche mais d'une lenteur....

    Puis je doit y inserer les indices correspondant(present sur la feuil2 en A) en E dans la feuil1, naturellement en face du bon numero!! mais par contre les indices sont toujours du plus petit au plus grand!!! et ca j'ai pas réussi!!!
    Le programme que j'ai pondu est tres moche mais je connais pas les subtilités du VBA je sais juste calculer.
    Il y a des copies auto en plus qui marche tres bien mais qui ne font pas partie de l'aide que je demande
    Je sollicite votre aide, si vous avez le courage de lire mon post et de regarder mon fichier
    Merci à vous!!!!
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Trois mois pour ça ? Tu dois leur couter cher mon ami.

    Alors ce que tu demandes a l'air assez simple, mais trop compliqué à comprendre avec de mauvaises explications met un fichier de départ avec tes données brutes et un fichier d'arrivée avec ce que tu veux.

    Alors pour faire simple:

    D'abord tu tries la feuille 2 par colonne A Puis par D

    Maintenant tu boucles et tu comptes et tu as trouvé ton chiffre... ou alors un nb.si ferait aussi bien l'affaire.
    Puis après il suffit d'insérer ce que tu veux en bouclant.

  3. #3
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir,

    Si tu veux vraiment du Vba, ci-dessous de quoi executer ton debut de code

    sur la feuil1 j'ai de J2 à J11 des numeros de plan à la suite (ici appelé 1,2,3 etc...)
    sur la feuil2 j'ai ces memes numeros de plan dans la colonne D, mais plusieurs fois et dans n'importe quelle ordre. Ils sont rattachés à un indice sur la colonne A.
    J essaye de compter combien ce meme numero de la feuil1 colonne J ce retrouve sur la feuil2 colonne D, une fois trouvé combien il y en a
    j'insere sur la feuil1 à l'endroit ou j'ai le numero compté autant de ligne que de numero trouve sur le feuil2 et je copie le numero compté. Jusque là ca marche mais d'une lenteur....
    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
    Sub debutcode()
     
    Dim Plage1 As Range, Cel As Range, tbl()
    Dim x As Long
    Dim i As Long
    Dim DernLigne As Long
    i = 0
    With Sheets("feuil1")
      DernLigne = .Range("J" & .Rows.Count).End(xlUp).Row
      For x = DernLigne To 2 Step -1
        If IsEmpty(Range("J" & x)) Then
          .Range("J" & x).EntireRow.Delete
        End If
      Next x
      DernLigne = .Range("J" & .Rows.Count).End(xlUp).Row
      ReDim Preserve tbl(1 To DernLigne - 1)
      Set Plage1 = .Range("J2:J" & DernLigne)
    End With
    With Sheets("Feuil2")
      DernLigne = .Range("D" & .Rows.Count).End(xlUp).Row
      For Each Cel In Plage1
        'calcul du nombre de cellules J$ de la plage2 identique à D$ dans la plage1
        i = i + 1
        tbl(i) = WorksheetFunction.CountIf(.Range("D1:D" & DernLigne), Cel.Value)
      Next Cel
    End With
    With Sheets("Feuil1")
      DernLigne = .Range("J" & .Rows.Count).End(xlUp).Row
      For i = DernLigne To 2 Step -1
       .Rows(i).Resize(tbl(i - 1)).Insert
      Next i
    End With
    End Sub
    si ça t'aide et si ça te va, essaies d'analyser afin de pouvoir poursuivre
    Bien sur, ma proposition n'est pas parfaite, loin de là, mais je pense que c'est un début de piste

    Ajout (à 3h10 du matin) :
    Je ne suis pas sur d'avoir compris la 2ème partie
    Puis je doit y inserer les indices correspondant(present sur la feuil2 en A) en E dans la feuil1, naturellement en face du bon numero!! mais par contre les indices sont toujours du plus petit au plus grand!
    mais tu peux tester ce code complet :
    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 debutcode()
     
    Dim Plage1 As Range, Cel As Range, tbl()
    Dim x As Long, i As Long, DernLigne As Long
    Dim tbF2, TBindice()
    i = 0
    With Sheets("feuil1")
      DernLigne = .Range("J" & .Rows.Count).End(xlUp).Row
      For x = DernLigne To 2 Step -1
        If IsEmpty(Range("J" & x)) Then
          .Range("J" & x).EntireRow.Delete
        End If
      Next x
      DernLigne = .Range("J" & .Rows.Count).End(xlUp).Row
      ReDim Preserve tbl(1 To DernLigne - 1)
      Set Plage1 = .Range("J2:J" & DernLigne)
    End With
    With Sheets("Feuil2")
      DernLigne = .Range("D" & .Rows.Count).End(xlUp).Row
      For Each Cel In Plage1
        'calcul du nombre de cellules J$ de la plage2 identique à D$ dans la plage1
        i = i + 1
        tbl(i) = WorksheetFunction.CountIf(.Range("D1:D" & DernLigne), Cel.Value)
      Next Cel
      tbF2 = .Range("A1:D" & DernLigne)
    End With
    With Sheets("Feuil1")
      DernLigne = .Range("J" & .Rows.Count).End(xlUp).Row
      For i = DernLigne To 2 Step -1
       .Rows(i).Resize(tbl(i - 1)).Insert
      Next i
      x = 0
      For Each Cel In Plage1
        For i = 1 To UBound(tbF2, 1)
          If Cel = tbF2(i, 4) Then
            x = x + 1
            ReDim Preserve TBindice(1 To x)
            TBindice(x) = tbF2(i, 1)
          End If
        Next i
      Next Cel
      .Range("A2:A" & UBound(TBindice)) = WorksheetFunction.Transpose(TBindice)
    End With
     
    End Sub
    Bon courage
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Merci à vous, d'avoir repondu aussi vite!!!

    Sinon en trois mois heureusement que je n'ai pas fais que ca!! en faite je suis en stage en dessin industriel en bureau d'étude/méthode et l'info c'est juste pour m'aider dans mon organisation de travail, alors avant de commencer le stage je savais même pas que les macros d'excel c'était du vba!! Et en gros à par exception les programmes info je le fais chez moi pas le temps au taf!!, donc tkt je ne dois pas couter trop cher à 430E/ mois
    Allez un bon vendredi à regarder tout ca sous 30° à l'hombre
    à plus

    Merci

    Bonjour à toi
    Merci de repondre aussi vite!!!
    Bon c'est vrais que mes explications sont pas tres clair, voici en pièce jointe les fichiers debut et arrivé
    Vois si tu comprends mon probleme : je veux que ca aille plus vite car en réalité le fichier n'est qu'un test ca doit marcher sur un fichier avec plus de 50000 lignes de N° de plans. Ici je fais le test avec 10 plans (feuil1 colonne J) qui ont plusieurs indices (feuil2 colonne D et A(indice))et ca met deja 15 secondes!!!!!
    Merci d'avance
    Ludo
    Fichiers attachés Fichiers attachés

  5. #5
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    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
    Sub trietcopie()
    Dim i as long
      Application.screenupdating=false
        Columns("A:E").Select
        ActiveWorkbook.Worksheets("Feuil2").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil2").Sort.SortFields.Add Key:=Range("A1:A34") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil2").Sort
            .SetRange Range("A1:E34")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        ActiveWorkbook.Worksheets("Feuil2").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil2").Sort.SortFields.Add Key:=Range("D1:D34") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil2").Sort
            .SetRange Range("A1:E34")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
     
     
        For i = 1 To Feuil2.Range("A" & Rows.Count).End(xlUp).Row
        Feuil1.Range("J" & i + 1) = Feuil2.Range("D" & i)
        Feuil1.Range("E" & i + 1) = Feuil2.Range("A" & i)
        Feuil1.Range("G" & i + 1) = Feuil2.Range("E" & i)
        Feuil1.Range("S" & i + 1) = Feuil2.Range("B" & i)
        Feuil1.Range("T" & i + 1) = Feuil2.Range("C" & i)
        Next i
     
      Application.screenupdating=true
    End Sub
    0,004 secondes avec ton fichier

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut CA MARCHE PRESQUE
    Salut Dom
    merci pour ton aide
    J'ai essayé et c'est presque ca!! ca doit etre mon explication qui est de mauvaise qualité loin de la de penser que ce que tu m as fais ne marche pas.
    J'ai mis en piece jointe le fichier (fichier debut) avec ton code et son resultat et le deuxieme fichier (fichier resultat) avec mon code et le resultat que je cherche à avoir, et le fichier source avant macro (fichier source)
    Je vais essayer de modifier ton code pour l'adapter si j'arrive!!(je comprend pas tout), mais si tu as le temps de comprendre mon probleme et de m'aider ca serait treeeeees cool
    Merci d'avance
    Ludo
    Fichiers attachés Fichiers attachés

  7. #7
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Ecoute tu selectionnes ton tableau en feuille 2 tu le tries par colonne A, puis par colonne D.

    Puis tu executes ce code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub classement()
    Dim i as long
    Application.screenupdating=false
       For i = 1 To Feuil2.Range("A" & Rows.Count).End(xlUp).Row
        Feuil1.Range("J" & i + 1) = Feuil2.Range("D" & i)
        Feuil1.Range("E" & i + 1) = Feuil2.Range("A" & i)
        Feuil1.Range("G" & i + 1) = Feuil2.Range("E" & i)
        Feuil1.Range("S" & i + 1) = Feuil2.Range("B" & i)
        Feuil1.Range("T" & i + 1) = Feuil2.Range("C" & i)
        Next i
     
      Application.screenupdating=true
    End Sub
    Citation Envoyé par ludovicchapo Voir le message
    temps de comprendre mon probleme
    Ludo
    Ton problème est faisable en dix secondes sans macro... donc bon.. Ne cherche pas à compliquer les choses mais simplifie les

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Bon ba j'ai rien à dire vous étes trop fort et surtout super réactif
    MERCI CA MARCHE
    il reste des petites choses à ameliorer mais c'était pas dans mes explication
    je vais quand même essayer de le finir par moi même mais si j'arrive pas je pourrais vous resoliciter?
    Cordialement
    Ludo

    je pense que je suis obligé de faire avec une macro, car il ne suffit pas que de trier et copier mais si le plan ne figure pas en feuil1 colonne J il ne doit pas le copier et n'y inserer les données qui vont avec de plus il peut y avoir des modif en cours de vie du fichier source feuil2, et il fait parti d'un autre fichier avec d'autre macro.
    De plus ce fichier doit etre consultable sans y toucher la moindre fonction d'excel tout en auto, voila en tout cas merci,
    et je pense à tres bientot quand je rebuggerais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Copier/Inserer une feuille dans un classeur Excel depuis ACCESS
    Par moilou2 dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/08/2009, 14h45
  2. Inserer une image dans un textbox via Copier -> Coller ?
    Par XpFive dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/06/2008, 23h24
  3. copier et inserer une image
    Par driver dans le forum IHM
    Réponses: 6
    Dernier message: 28/04/2008, 17h21
  4. Réponses: 9
    Dernier message: 03/08/2007, 00h32
  5. Réponses: 1
    Dernier message: 01/08/2007, 21h10

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