Microsoft 365 formule Excel pour dupliquer une ligne selon une valeur dans une cellule

Carlot

XLDnaute Nouveau
Bonjour à tous,

Je souhaite voir avec vous si il est possible de dupliquer une ligne vers le haut selon un une cellule.
en effet Sage propose l'intégration analytique mais celui-ci demande que la ligne soit présent 2 fois exemple :
04/01/2021F2101161112000AGOEG239670
04/01/2021F2101161112000AGOEASIEGE236970
04/01/2021F2101161112000AGOEG00
04/01/2021F2101144566000AGOEG00
04/01/2021F2101144566000AGOEG2037,20

ici SIEGE est dupliquer pour le même montant.
le soucis c'est que mon fichier d'origine n'est pas dupliqué, c'est donc une ligne à créer à chaque fois qu'il y a une analytique...

merci de votre aide
 

soan

XLDnaute Barbatruc
Inactif
@Carlot

j'ai saisi ABC, et maintenant ça m'demande de saisir le CODE JOURNAL ! J'ai mis HH ; c'est là qu'je choisis d'ouvrir ton fichier CSV "FICHIER TEST" ; et VLAN ! PLANTAGE : Erreur d'exécution 9 : L'indice n'appartient pas à la sélection ! ben heureusement qu'tu m'as prévenu dans ton post #14 qu'la macro fonctionne bien et qu'y'a juste un problème de temps d'exécution, lolllllll ! :p 😂 🤣

c'est un bug dans ta sub RB() du Module7 ! c'est à la ligne 76, sur cette ligne de code VBA :

ActiveWorkbook.Worksheets("client").AutoFilter.Sort.SortFields.Clear


soan
 
Dernière édition:

Carlot

XLDnaute Nouveau
@Carlot

j'ai saisi ABC, et maintenant ça m'demande de saisir le CODE JOURNAL ! J'ai mis HH ; c'est là qu'je choisis d'ouvrir ton fichier CSV "FICHIER TEST" ; et VLAN ! PLANTAGE : Erreur d'exécution 9 : L'indice n'appartient pas à la sélection ! ben heureusement qu'tu m'as prévenu dans ton post #14 qu'la macro fonctionne bien et qu'y'a juste un problème de temps d'exécution, lolllllll ! :p 😂 🤣

c'est un bug dans ta sub RB() du Module7 ! c'est à la ligne 76, sur cette ligne de code VBA :

ActiveWorkbook.Worksheets("client").AutoFilter.Sort.SortFields.Clear


soan
MDR 😂😁SORRY,cette macro ne fonctionne pas je voulais qu'il tri par ordre croissant la date dans la feuille SAGE mais cela ne s'exécute pas:( ;( je suis vraiment pas doué
 

Carlot

XLDnaute Nouveau
@Carlot

sur la feuille "sage", fais Ctrl f ➯ tri effectué ! 😊 mais problème :
c'est trop rapide et t'as même pas l'temps d'boire un café ! ☕

soan

merci soan, mais cela ne correspond pas à ce que j'ai besoin.

en gros, votre import faut pas y touché c'est sage qui faut dupliquer les données quand y a une analytique qui correspond a la colonne M.

Le VBA que ta fait fonctionne nikel sauf qu'il prend trop de temps
 

soan

XLDnaute Barbatruc
Inactif
@Carlot

essaye cette autre version.

sur la feuille "sage", fais Ctrl e ➯ ça passe de 66 lignes à 84 lignes, soit 18 lignes de plus.

temps d'exécution sur mon PC : moins de 2 secondes. :)



remarque : en colonne M, il n'y a pas de A et G comme au début ; il n'y a que des P01 à P04 ; j'ai considéré que c'est une ligne Analytique si c'est non vide ; à toi de voir si tu préfères que ce soit une ligne Analytique seulement si c'est un code qui commence par P (au cas où dans ton fichier réel, il y aurait d'autres codes qui eux ne commencent pas par P).​



code VBA :

VB:
Sub Essai()
  If ActiveSheet.Name <> "sage" Then Exit Sub
  Dim lig&: Application.ScreenUpdating = 0
  lig = Cells(Rows.Count, 1).End(3).Row
  Do
    With Cells(lig, 1)
      If .Offset(, 12) <> "" Then
        Rows(lig).Insert: .Resize(, 19).Copy .Offset(-1)
        .Offset(-1, 12) = "G": .Offset(-1, 14) = Empty
      End If
    End With
    lig = lig - 1
  Loop Until lig = 1
End Sub

soan
 

Pièces jointes

  • IMPORT ACHATS ANA PAR SAGE S.xlsm
    100.8 KB · Affichages: 7
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour Carlot,

j'ai bien compris que pour toi la macro est OK, et qu'il s'agit seulement d'un problème de vitesse d'exécution, mais par rapport à ton dernier fichier joint "IMPORT ACHATS ANA PAR SAGE S", feuille "sage", je veux d'abord savoir si ce que fait ma nouvelle macro pour dupliquer les lignes analytiques te convient ou non. ;)

lis mon post #21 ci-dessus, et essaye le nouveau fichier : ouvre-le, puis sur la feuille "sage", fais Ctrl e ; est-ce que ce sont bien les bonnes lignes qui sont dupliquées ? celles pour lesquelles c'est non vide en colonne M ; si c'est ça : OK ➯ l'étape suivante sera d'améliorer la vitesse d'exécution.


sinon : quel est le critère pour qu'une ligne soit considérée comme analytique ? au tout début, c'était avec le code "A" ; et maintenant, c'est avec quel code ? tous ceux qui commencent par "P" ? ou autre ? je ne peux pas le deviner à ta place, c'est à toi de me dire ! :rolleyes: (mais c'est peut-être comme indiqué au 2ème paragraphe ?)

2 autres questions : sur la ligne dupliquée, est-ce qu'il faut encore mettre le code "G" ? ou est-ce que ça a changé aussi, et tu n'en veux plus ? est-ce qu'il faut encore effacer la 2ème cellule qui est à droite de ce code "G" ? ou tu préfères pas ? même remarque : j'peux pas l'deviner à ta place ! :rolleyes:

à te lire pour la suite. :)

soan
 
Dernière édition:

Carlot

XLDnaute Nouveau
B
Bonjour Carlot,

j'ai bien compris que pour toi la macro est OK, et qu'il s'agit seulement d'un problème de vitesse d'exécution, mais par rapport à ton dernier fichier joint "IMPORT ACHATS ANA PAR SAGE S", feuille "sage", je veux d'abord savoir si ce que fait ma nouvelle macro pour dupliquer les lignes analytiques te convient ou non. ;)

lis mon post #21 ci-dessus, et essaye le nouveau fichier : ouvre-le, puis sur la feuille "sage", fais Ctrl e ; est-ce que ce sont bien les bonnes lignes qui sont dupliquées ? celles pour lesquelles c'est non vide en colonne M ; si c'est ça : OK ➯ l'étape suivante sera d'améliorer la vitesse d'exécution.


sinon : quel est le critère pour qu'une ligne soit considérée comme analytique ? au tout début, c'était avec le code "A" ; et maintenant, c'est avec quel code ? tous ceux qui commencent par "P" ? ou autre ? je ne peux pas le deviner à ta place, c'est à toi de me dire ! :rolleyes: (mais c'est peut-être comme indiqué au 2ème paragraphe ?)

2 autres questions : sur la ligne dupliquée, est-ce qu'il faut encore mettre le code "G" ? ou est-ce que ça a changé aussi, et tu n'en veux plus ? est-ce qu'il faut encore effacer la 2ème cellule qui est à droite de ce code "G" ? ou tu préfères pas ? même remarque : j'peux pas l'deviner à ta place ! :rolleyes:

à te lire pour la suite. :)

soan
Bonjour Soan!

merci pour ton retour,
alors je te fait une brève explication:

Dans le fichier sage:
- c'est une copie de la feuille "client" dans la feuille "sage"
- quand la copie est arrivé dans "sage" il va copier et dispatcher la colonne D grâce au" -
- ensuite il va aussi copier et dispatcher la colonne F grâce au ESPACE
- Ensuite
grâce à ton VBA il duplique tout les lignes de la colonne M qui ne sont pas vide

Dans mon fichier VOTRE IMPORT ( je sais il y a trop de formule mais je sais pas faire mieux :(
)
- j'ai mis une numérotation qui me permet de faire des RECHERCHEV dans la feuille SAGE et mettre les information dans la bonne colonne dans votre import.
- j'ai donc aussi mi une formule dans la SECTION dans VOTRE IMPORT =SI(P3="";"";SI(RECHERCHEV(P3;sage;13)=0;"";RECHERCHEV(P3;sage;13))) elle permet de laisse la cellule vide si la cellule M est égal à 0

Du coup pour moi ta macro fonctionne mais elle n'a pas besoin de dupliquer et de remplacer les P01 OU P02 par A OU G car dans "votre import la formule le fait"

j'espère avoir bien résumé!

Didier
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Didier,

j'avais bien vu ton post #23, mais c'est pas évident d'le comprendre vu qu'tu n'emploies pas toujours les bons termes ! par exemple, tu as écrit : « Dans mon fichier VOTRE IMPORT » ; mais "VOTRE IMPORT" n'est pas un fichier ! c'est une feuille de calcul !​



j'ai été pris par beaucoup d'choses, et j'viens seulement d'me remettre sur ton dossier ; si j'ai bien compris : j'm'occupe pas du tout des 2 premières feuilles "VOTRE IMPORT" et "client" ; uniquement de la feuille "sage" ; et sur cette feuille, faut seulement dupliquer les lignes où c'est non vide en colonne M, donc si y'a un code comme par exemple "P01" ; enfin, pour la ligne dupliquée, ne rien changer : la laisser telle quelle.

comme dans ton fichier réel tu as plein de données, pour que la vitesse d'exécution ne soit pas pénalisante, faut qu'j'utilise une autre méthode que celle que j'avais déjà utilisée avant pour faire le job ; je vais donc utiliser la méthode des tableaux, qui est vraiment très rapide, même sur plusieurs milliers de lignes. :)

mais à cause de la particularité de devoir ajouter une ligne pour chaque ligne à dupliquer, ça va compliquer la chose et me prendre beaucoup de temps ; je vais essayer, et j'suis pas encore sûr d'y arriver, donc j'peux rien te garantir d'avance.​

soan
 

Carlot

XLDnaute Nouveau
Bonjour Didier,

j'avais bien vu ton post #23, mais c'est pas évident d'le comprendre vu qu'tu n'emploies pas toujours les bons termes ! par exemple, tu as écrit : « Dans mon fichier VOTRE IMPORT » ; mais "VOTRE IMPORT" n'est pas un fichier ! c'est une feuille de calcul !​



j'ai été pris par beaucoup d'choses, et j'viens seulement d'me remettre sur ton dossier ; si j'ai bien compris : j'm'occupe pas du tout des 2 premières feuilles "VOTRE IMPORT" et "client" ; uniquement de la feuille "sage" ; et sur cette feuille, faut seulement dupliquer les lignes où c'est non vide en colonne M, donc si y'a un code comme par exemple "P01" ; enfin, pour la ligne dupliquée, ne rien changer : la laisser telle quelle.

comme dans ton fichier réel tu as plein de données, pour que la vitesse d'exécution ne soit pas pénalisante, faut qu'j'utilise une autre méthode que celle que j'avais déjà utilisée avant pour faire le job ; je vais donc utiliser la méthode des tableaux, qui est vraiment très rapide, même sur plusieurs milliers de lignes. :)

mais à cause de la particularité de devoir ajouter une ligne pour chaque ligne à dupliquer, ça va compliquer la chose et me prendre beaucoup de temps ; je vais essayer, et j'suis pas encore sûr d'y arriver, donc j'peux rien te garantir d'avance.​

soan
Bonjour Soan,

merci pour ta reponse je sais j'ai beaucoup de problème avec le Français, vraiment navré!

tu as tous compris, c'est cela..
je te remerciant pour ton dévouant pour moi.
je te souhaite de réussir.
didier
 

soan

XLDnaute Barbatruc
Inactif
@Didier

voici la nouvelle version du fichier ! :)

sur la feuille "sage", fais Ctrl e ➯ travail effectué ! vérifie bien soigneusement tous les résultats ; essaye ensuite la même macro avec ton fichier réel, et dis-moi le temps que ça met ; j'espère que ça marchera, car j'ai pas d'autre solution d'rechange à proposer : j'ai rien d'plus rapide ! 🍀

VB:
Sub Essai()
  If ActiveSheet.Name <> "sage" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 6).End(3).Row: If n = 1 Then Exit Sub
  Dim T, k&, i%, j&, p&
  n = n - 1: T = Application.Transpose([B2].Resize(n, 18))
  k = 2 * n: ReDim Preserve T(1 To 18, 1 To k): k = n: i = 1
  Do
    If T(12, i) <> "" Then
      For j = 1 To 18
        For p = k To i Step -1: T(j, p + 1) = T(j, p): Next p
      Next j
      k = k + 1: i = i + 1
    End If
    i = i + 1
  Loop Until i = k
  [B2].Resize(k, 18) = Application.Transpose(T)
End Sub

soan
 

Pièces jointes

  • IMPORT ACHATS ANA PAR SAGE S.xlsm
    101.2 KB · Affichages: 3
Dernière édition:

Carlot

XLDnaute Nouveau
@Didier

voici la nouvelle version du fichier ! :)

sur la feuille "sage", fais Ctrl e ➯ travail effectué ! vérifie bien soigneusement tous les résultats ; essaye ensuite la même macro avec ton fichier réel, et dis-moi le temps que ça met ; j'espère que ça marchera, car j'ai pas d'autre solution d'rechange à proposer : j'ai rien d'plus rapide ! 🍀

VB:
Sub Essai()
  If ActiveSheet.Name <> "sage" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 6).End(3).Row: If n = 1 Then Exit Sub
  Dim T, k&, i%, j&, p&
  n = n - 1: T = Application.Transpose([B2].Resize(n, 18))
  k = 2 * n: ReDim Preserve T(1 To 18, 1 To k): k = n: i = 1
  Do
    If T(12, i) <> "" Then
      For j = 1 To 18
        For p = k To i Step -1: T(j, p + 1) = T(j, p): Next p
      Next j
      k = k + 1: i = i + 1
    End If
    i = i + 1
  Loop Until i = k
  [B2].Resize(k, 18) = Application.Transpose(T)
End Sub

soan
Merci soan! c'est vachement plus rapide!! grand merci! je vais me pencher sur le module formations.

j'ai juste une dernier demande pour que cela fonctionne Nikel c'est de supprimer la cellule M dans sage qui est dupliqué le VBA ci-dessous le faisait :)

If ActiveSheet.Name <> "sage" Then Exit Sub
Dim lig&: Application.ScreenUpdating = 0
lig = Cells(Rows.Count, 1).End(3).Row
Do
With Cells(lig, 1)
If .Offset(, 12) <> "" Then
Rows(lig).Insert: .Resize(, 18).Copy .Offset(-1)
.Offset(-1, 12) = "": .Offset(-1, 7) = Empty
End If
End With
lig = lig - 1
Loop Until lig = 0

et aussi dans le même temps si tu peux faire le TRI par ordre de la date de la colonne B de la feuille SAGE S'il te plait.
on a un proverbe en creole Réunionnais qu dit "Attend' socisse frite dan vante kosson" SA SIGNIFIE Attendre que les choses se fassent sans le moindre effort...
tout cela pour te dire un grand merci!!
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@Carlot

pour la « socisse frite », merci pour le hot-dog ! 🌭 😋

« c'est vachement plus rapide!! » : ok, c'est super ! impeccable ! 😊
j'suis bien content d'savoir que ça ne prend plus trop de temps !

pour tes 2 autres demandes, c'est fait dans le fichier joint.

nouveau code VBA :​

VB:
Sub Essai()
  If ActiveSheet.Name <> "sage" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 6).End(3).Row: If n = 1 Then Exit Sub
  Dim T, k&, i%, j&, p&
  n = n - 1: T = Application.Transpose([B2].Resize(n, 18))
  k = 2 * n: ReDim Preserve T(1 To 18, 1 To k): k = n: i = 1
  Do
    If T(12, i) <> "" Then
      For j = 1 To 18
        For p = k To i Step -1: T(j, p + 1) = T(j, p): Next p
      Next j
      T(12, i) = Empty: k = k + 1: i = i + 1
    End If
    i = i + 1
  Loop Until i = k
  Application.ScreenUpdating = 0
  With [B2].Resize(k, 18)
    .Value = Application.Transpose(T): .Sort [B2], 1
  End With
End Sub

soan
 

Pièces jointes

  • IMPORT ACHATS ANA PAR SAGE S.xlsm
    101.6 KB · Affichages: 3

Carlot

XLDnaute Nouveau
@Carlot

pour la « socisse frite », merci pour le hot-dog ! 🌭 😋

« c'est vachement plus rapide!! » : ok, c'est super ! impeccable ! 😊
j'suis bien content d'savoir que ça ne prend plus trop de temps !

pour tes 2 autres demandes, c'est fait dans le fichier joint.

nouveau code VBA :​

VB:
Sub Essai()
  If ActiveSheet.Name <> "sage" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 6).End(3).Row: If n = 1 Then Exit Sub
  Dim T, k&, i%, j&, p&
  n = n - 1: T = Application.Transpose([B2].Resize(n, 18))
  k = 2 * n: ReDim Preserve T(1 To 18, 1 To k): k = n: i = 1
  Do
    If T(12, i) <> "" Then
      For j = 1 To 18
        For p = k To i Step -1: T(j, p + 1) = T(j, p): Next p
      Next j
      T(12, i) = Empty: k = k + 1: i = i + 1
    End If
    i = i + 1
  Loop Until i = k
  Application.ScreenUpdating = 0
  With [B2].Resize(k, 18)
    .Value = Application.Transpose(T): .Sort [B2], 1
  End With
End Sub

soan
Géniale!!!!!!!!!!!!!

c'est impressionnant ton efficacité!

et je crois que je t'en dois une... de bon action...

on en reparlera ulterieurement!

Grand merci
nou ar trouv!!!
 

Discussions similaires

Statistiques des forums

Discussions
315 104
Messages
2 116 251
Membres
112 697
dernier inscrit
administratif@ets-delestr