Un fichier --> 2 macros

Bonjour

Mes compétences maigres en Macro me poussent à faire appel à vos compétences.

Le projet c'est avoir sur le fichier , deux macros.

Macro 1 : Macro pouvant créer une ligne à chaque fois que je l’exécute. En cliquant sur le bouton, une ligne est alors créée et elle reprend le n° le plus grand +1 et ainsi de suite (colonne L).

J'ai eu une 1ère idée en utilisant l'enregistrement de macro (car je ne sais pas coder).

En 1er lieu mettre une mise en forme conditionnelle en prenant la valeur la plus haute avec une couleur bleu . Filtrer par couleur sur le bleu. Ainsi le max s'affiche. et Manuellement je fais insérer une ligne, la cellule = cellule filtrer sur le bleu +1. Dans notre exemple = L12+1.

La macro marche super sauf quand je supprime une ligne car cela peut arriver --> la macro ne marche plus. Je suis bloquée.

J'ai laissé la macro, si vous voulez

Macro 2 : pouvoir dupliquer cette ligne en fonction du nombre que je choisis. Dupliquer en fonction du nombre de mois.

Par exemple avec la macro j'aimerais dupliquer la ligne en 6. ou alors le top du top : quand j'inscrit un chiffre dans la colonne AA, elle multiplie en fonction des mois.

Par exemple j'ai inscrit 11 (correspond au mois de novembre), la macro dupliquerai en 1 (car il me manque que décembre). ou alors j'ai inscrit 03, la macro duplique le nombre de ligne par 9 car il me manque 9 mois.

3test.xlsm (622.50 Ko)

Bonjour,

Je suppose que dans ce joyeux bazar, tu travailles sur l'onglet "BASE" ?

Bonjour,

Ohh oui pardon, j'ai oublié de préciser.

J'ai remis le fichier en pièce jointe

10test.xlsm (622.50 Ko)

Trouver le n° de la dernière ligne complète et ajouter le code :

Dim Ligne As Integer
With Sheets("BASE")
   Ligne = .UsedRange.Rows.Count 'N° de la dernière ligne
   .Cells(Ligne + 1, 12) = Application.Max(.Range("L2:L" & Ligne)) + 1 'Ajouter le n° correspondant
End With

Pour la seconde macro, je n'ai pas compris où tu inscrivais le nombre de mois pour savoir combien de ligne ajouter. D'ailleurs, est-ce utile d'insérer des lignes ou le simple fait d'écrire sur la première ligne vide suffit ?

Bonjour,

La macro 1 ne semble pas marcher avec votre code. La macro ne semble pas trouver la valeur maximale de la colonne L. Pour ensuite insérer automatiquement une ligne en reprenant le chiffre de la cellule max pour y rajouter +1.

Macro 2 : dans la colonne AA, j'inscris une fois manuellement à chaque nouvelle ligne que je crée (après la macro 1) le n° du mois . L'idée de la macro 2 : est de pouvoir dupliquer cette ligne en fonction du n° de la colonne AA.

Ex: dans la colonne AA12 j'ai inscrit le n° 10 quand j'ai crée cette ligne.

En cliquant sur le bouton de la macro 2 : les lignes se duplique en fonction de ce chiffre ici 2 lignes car j'ai inscris 10. Si j'inscris 8 elle copie colle cette ligne en 4 fois.

C'est comme une box/ boîte ou de dans mes chiffres de la colonne AA vont de 1 à 12

Bonjour, Salut à tous !

Je ne comprends pas bien pourquoi tu veux insérer des lignes ! Tu opères sur un tableau Excel qui a la faculté d'incorporer toute ligne dès que tu ajoutes une inscription au-dessous du tableau, et d'étendre automatiquement les formules...

Cordialement.

Bonjour,

Macro 1 : automatiser l'insertion de ligne permet de gagner du temps. Comme ça je n'ai pas à filtrer chercher le max, insérer, prendre le nb max et rajouter manuellement. Automatiser cette démarche pour éviter des pertes. J'ai pour le moment 4 000 lignes à créer, si cela pouvait me faire gagner un peu de temps en automatisant

Pour la macro 2 C'est plus un copier coller des lignes. C'est un fichier qui va comporter plus 10 000 lignes, l'idée est d'automatiser dans un souci de temps mais aussi et surtout par sécurité. Eviter de faire des erreurs manuellement.

La macro 2 copie collerai la ligne que je viens de créer en fonction du chiffre indiqué dans la colonne AA

Cordialement,

Sub etape1et2()
    Dim Ligne As Integer, i As Byte, Mois As Byte
    With Sheets("BASE")
        Ligne = Range("A" & Rows.Count).End(xlUp).Row 'N° de la dernière ligne
        .Cells(Ligne + 1, 12) = Application.Max(.Range("L2:L" & Ligne)) + 1 'Ajouter le n° correspondant
        Mois = Application.InputBox("N° du mois", Type:=1)
        If Mois < 12 Then
            For i = 1 To 12 - Mois
                .Rows(Ligne + 1).Copy
                .Rows(Ligne + 1 + i).Select
                ActiveSheet.Paste
                Application.CutCopyMode = False
            Next i
        End If
    End With
End Sub

WAHOU la macro est top !!!! Merci, c'est vraiment l'idée finale.

J'ai compris que les 2 macros sont combinées en une seule. J'ai tenté de les séparer car dans un 1er temps je lance la macro 1 pour créer une ligne. Une fois que j'ai remplis les info, je lance la macro 2 pour copier coller cette ligne avec toutes les informations qu'elle comprend pour dupliquer en fonction du n° du mois.

J'ai réussit à lancer la 1ère sans pb. La 2ème olala elle m'insère simplement les lignes elle ne copie colle pas toutes les info

Cordialement,

Sub etape1()
    Dim Ligne As Integer
    With Sheets("BASE")
        Ligne = .Range("A" & Rows.Count).End(xlUp).Row 'N° de la dernière ligne
        .Cells(Ligne + 1, 12) = Application.Max(.Range("L2:L" & Ligne)) + 1 'Ajouter le n° correspondant
    End With
End Sub
Sub etape2()
    Dim Ligne As Integer, i As Byte, Mois As Byte
    With Sheets("BASE")
        Ligne = .Range("A" & Rows.Count).End(xlUp).Row 'N° de la dernière ligne
        Mois = .Cells(Ligne, 27)
        If Mois < 12 Then
            For i = 1 To 12 - Mois
                .Rows(Ligne).Copy
                .Rows(Ligne + i).Select
                ActiveSheet.Paste
                Application.CutCopyMode = False
            Next i
        End If
    End With
End Sub

Hello

Merci pour les codes !

J'ai testé, la boucle me duplique automatiquement en 12, il n y ' a plus la possibilité de choisir le nombre de mois

Je lance la macro avec 12 lignes sur le dernier chiffre. Puis plus tard, j'ai des nouveaux numéros à rajouter. Alors je lance la macro 1. et là pb, la macro se lance mais pas au bon endroit. Elle récupère un chifre parmis les douze lignes dupliquées et elle le remplace par le nouveau chiffre.

Du coup quand je veux lancer la macro 2, elle remet toutes les 12 lignes en fonction du premier chiffre.

Exemple : le dernier numéro c'est 10. je clique sur macro 2 --> duplique en 12 lignes.

Après j'ai un nouveau chiffre car j'ai des nouvelles informations donc je passe à 11. Sauf qu'au moment de lancer la macro 1 --> elle cherche dans les 12 lignes du 10 et me remplace un 10 par 11. --> et plus possible de continuer la suite.

et au lancement de la macro 2 --> elle remet tout en 10.

Bonjour,

Effectivement j'ai oublié de replacer cette ligne quelque part dans mon code :

Mois = Application.InputBox("N° du mois", Type:=1)

Ce serait peut-être plus adapté que de lui demander de prendre l'info d'une cellule, que tu n'as pas forcément complétée au préalable.

Pour le reste de ton explication, je n'ai pas très bien compris, mais c'est vrai que je n'ai plus ton fichier en tête (ni dans mon PC, par ailleurs...).

Merci je viens de la rajouter au fichier. Je te renvoie le fichiers avec les macro si tu veux

2base.xlsm (631.11 Ko)

Ok, je n'avais pas ça de mon côté. En fait tu as un tableau dans ta feuille, et ma macro "etape2()" copie bien à la suite du tableau, mais ces lignes ne sont pas considérées comme appartenant au tableau.

Je vois pour te proposer autre chose.

La macro "etape1()" est inchangée, j'ai juste rajouté une ligne dans la seconde pour redimensionner ton tableau.

Sub etape1()
    Dim Ligne As Integer
    With Sheets("BASE")
        Ligne = .Range("A" & Rows.Count).End(xlUp).Row 'N° de la dernière ligne
        .Cells(Ligne + 1, 12) = Application.Max(.Range("L2:L" & Ligne)) + 1 'Ajouter le n° correspondant
    End With
End Sub
Sub etape2()
    Dim Ligne As Integer, i As Byte, Mois As Byte
    With Sheets("BASE")
        Ligne = .Range("A" & Rows.Count).End(xlUp).Row 'N° de la dernière ligne
        Mois = Application.InputBox("N° du mois", Type:=1)
        If Mois < 12 Then
            For i = 1 To 12 - Mois
                .Rows(Ligne).Copy
                .Rows(Ligne + i).Select
                ActiveSheet.Paste
                Application.CutCopyMode = False
                .ListObjects("Tableau1").Resize .Range("A5:O" & Ligne + 12 - Mois) 'Redéfinir la plage du tableau en intégrant les nouvelles lignes
            Next i
        End If
    End With
End Sub

OHHHHH c'est du feu de dieu !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MERCI MERCI

Je me posais la question : est ce qu'il est possible de dupliquer en fonction de la ligne que je choisis c'est à dire pas forcément la dernière inscrite ?

Par exemple dupliquer la ligne avec le n°9 en X lignes sachant qu'après le 9, il y a 10,11 ...

A ajouter dans le code :

NumCherché = Application.InputBox("N° recherché", Type:=1)
For i = 2 To Ligne
     If  .Cells(i, 12) = NumCherché Then Exit For
Next
'Remplacer 
.Rows(Ligne).Copy
'Par
.Rows(i).Copy

^Voilà l'ajout du code, j'espère ne pas avoir fais de bêtise

En lançant la macro, elle ne peut pas se terminer car au niveau de cette ligne :

.ListObjects("Tableau1").Resize .Range("A6:AZ" & Ligne + 12 - Mois) 'Redéfinir la plage du tableau en intégrant les nouvelles lignes

j'ai ce message qui s'affiche :

Erreur d'exécution '1004' :

La place spéficifée n'est pas valide. Les en-têtes doivent rester sur la même ligne et le tableau résultant doit chevaucher celui d'origine. Le tableau doit cotenir une ligne d'en-tête et au moins une ligne de données. Indiquez un tableau valide

Sub etape3()

Dim Ligne As Integer, i As Byte, Mois As Byte

With Sheets("BASE")

NumCherché = Application.InputBox("N° recherché", Type:=1)

For i = 2 To Ligne

If .Cells(i, 12) = NumCherché Then Exit For

Next

Mois = Application.InputBox("N° du mois", Type:=1)

If Mois < 12 Then

For i = 1 To 12 - Mois

.Rows(i).Copy

.Rows(Ligne + i).Select

ActiveSheet.Paste

Application.CutCopyMode = False

.ListObjects("Tableau1").Resize .Range("A6:AZ" & Ligne + 12 - Mois) 'Redéfinir la plage du tableau en intégrant les nouvelles lignes

Next i

End If

End With

End Sub

Bonjour,

De mon côté j'avais modifié la macro étape2 et cela fonctionnait correctement.

Relis ton code, tu n'indiques nulle part à quoi correspond "Ligne". Aussi, tu utilises 2 fois la variable "i" pour 2 usages différents. La seconde boucle écrase donc la valeur stockée par la première boucle, à savoir le n° de ligne que tu souhaites copier...

PS: pour faciliter notre relecture, pense à mettre ton code en forme en utilisant le bouton </> avant de poster un message.

J'ai remodifié sur tes conseils. La combinaison des deux ne marchent pas. Je suis vraiment désolé de t'embêter à nouveau avec.

</> Sub etape3()

Dim Ligne As Integer, i As Byte, Mois As Byte

With Sheets("BASE")

Ligne = .Range("A" & Rows.Count).End(xlUp).Row 'N° de la dernière ligne

NumCherché = Application.InputBox("N° recherché", Type:=1)

For i = 2 To Ligne

If .Cells(i, 12) = NumCherché Then Exit For

Next

Mois = Application.InputBox("N° du mois", Type:=1)

If Mois < 12 Then

For l = 1 To 12 - Mois

.Rows(l).Copy

.Rows(Ligne + l).Select

ActiveSheet.Paste

Application.CutCopyMode = False

.ListObjects("Tableau1").Resize .Range("A7:L" & Ligne + 12 - Mois) 'Redéfinir la plage du tableau en intégrant les nouvelles lignes

Next l

End If

End With

End Sub

</>

1base.xlsm (634.28 Ko)
Rechercher des sujets similaires à "fichier macros"