Création de X lignes par rapport à une cellule [résolu]

oxychene

XLDnaute Junior
Bonsoir à tous,

je souhaiterais savoir si il est possible, et si oui comment.

J'ai en colonne CT des valeur tels que 5,9,1... mais tous inférieur à 20.
J'ai besoin de créer autant de lignes que la valeur du nombre.

Par exemple ligne 10 valeur 5,00 lignes à créer à la suite
ligne 11 valeur 4,00 lignes à créer à la suite
ligne 12 valeur 3,00 lignes à créer à la suite
ligne 13 valeur 4,00 lignes à créer à la suite
.... et ceux sur environs 5000 lignes
Bien sur vous allez me dire que la ligne 11 avant création de nouvelle lignes deviendra la ligne 16 à la suite de création des ligne de la ligne 10 (10+5=15 CT11=CT16). Mais cela ne n’importe peu.

En fait c'est parce que mon tableau d'origine fonctionne avec des entrées par colonne.

Je doit changer de logiciel et ce dernier fonctionne par ligne/colonne.

Si vous souhaitez avoir un fichier cela peu être possible mais il est très lourd.

D'avance merci et bon appétit à ceux qui passe à table.

CDT, Oxychene
 
Dernière édition:

oxychene

XLDnaute Junior
Re : Création de X lignes par rapport à une cellule

A job 75,

je viens de lancer votre dernière macro du coup je profite de ces 5 minutes 30 pour vous répondre.

pour les formules qui vous gènes elles ne servent que pour la création de ligne je fais un copier coller valeur en supprimant les colonnes inutiles.

Pour les format je saurais me débrouiller la remise en forme après il suffira de sélectionner les colonnes à reformater.

Une fois la macro fini je vous renvois un fichier avec ce que j'attend.

Mais je pense qu'il me faut créer un tableau avec tout les articles et faire une colonne ou est inscrit "fourniture, matériel, sous traitance".
 

job75

XLDnaute Barbatruc
Re : Création de X lignes par rapport à une cellule

Re,

pour les formules qui vous gènes elles ne servent que pour la création de ligne je fais un copier coller valeur en supprimant les colonnes inutiles.

Dans ce cas il fallait le faire avant de lancer la macro du post #8, la revoici avec la StatusBar :

Code:
Sub InsereLignesApres()
Dim duree, derlig&, i&, c As Range
duree = Timer
Application.EnableEvents = False 'désactive les évènements
Application.Calculation = xlCalculationManual
derlig = Cells(Rows.Count, "BL").End(xlUp).Row
For i = derlig To 9 Step -1
  Set c = Cells(i, "BL")
  c(2).Resize(c).EntireRow.Insert
  Application.StatusBar = "Réalisé " & Int(100 * (derlig - i + 1) / (derlig - 8)) & " %" _
    & " - Lignes restantes " & i - 9
Next
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True 'réactive les évènements
MsgBox "Durée " & Format(Timer - duree, "0.00 \s")
End Sub
Elle s'exécute en 5 minutes 18 secondes.

Document Cjoint

A+
 

oxychene

XLDnaute Junior
Re : Création de X lignes par rapport à une cellule

A job 75,

ci joint le nouveau fichier avec un tableau avec les deux premières colonnes pour rechercher les élément.

Free - Envoyez vos documents

Les premiers postes avec les cellules rempli tel que je le souhaite.

Pour info:
-votre avant dernière macro fonctionne bien mais chez moi cela dure jusqu’à 15 minutes (des messages d'erreur de mémoire ou mémoire insuffisante, c'est pourtant pas un pakard belle avec millénium mais bon soit) suivant votre chrono.

Bref cela m'importe peu tant que le résultat est bon.

-j'ai coller les valeur en BH et modifié en conséquence votre macro.

-je me suis aperçu que mes données en BH ne sont pas tout a fait vrai, par exemple sur certains poste j'ai deux ligne vierge à la fin alors qu'il ne doit en rester qu'une.

-J'ai supprimé des feuilles et tout collé dans un tableau, j'ai enregistré votre macro et exécuté... le fichier passe de 10mo à 23mo presque le poids de mon fichier initial?
 

job75

XLDnaute Barbatruc
Re : Création de X lignes par rapport à une cellule

Re,

Ma boule de cristal a ses limites.

Je vois bien que vous avez rempli les plages A10:B13-A16:B19-A22:B23 etc mais d'où viennent ces valeurs :confused:

Par ailleurs au post #13 vous parliez de colonnes D et AJ :confused::confused::confused:

A+
 

oxychene

XLDnaute Junior
Re : Création de X lignes par rapport à une cellule

Les valeur viennent des colonnes de AN à BG.

Elle sont a replacer en D

Pour AJ c'est une erreur de lecture et de frappe il s'agit de BH.

Pour ce soir je ne vais quasiment pas pouvoir vous répondre et surtout pas ouvrir excel.

Je ferais de mon mieux ou je vous dis à demain.

Encore merci
 

oxychene

XLDnaute Junior
Re : Création de X lignes par rapport à une cellule

re,

oui il n'y à plus rien car j'ai coupé collé les valeurs en AN9 AO9 et AP9 pour les coller dans l'ordre suivant:

les fournitures en premières (ex de B10 à B12), les opérations (main d'oeuvre)(ex B13) en second, puis la sous traitance.

Tout ceci en colonne B(sauf que j'ai peut être fait une erreur dans le fichier joint précédemment, mais colonne B "Article/Opération" c'est sûr) et dans le même temps il faut créer autant de lignes opérations que de matériel s'y il en a et copier le matériel dans la colonne AJ à la ligne opération correspondante.

Pour finir avec une ligne vierge entre deux sous ensemble ex B14

Pour la colonne C elles peuvent aussi être importer aux passage depuis le tableu de la feuille matériel, ces cellules indique si c'est un Sous-ensemble (S), une Fourniture (F), une Sous-traitance (ST), ou une Opération (O)

Je m'exuse de m'être mal exprimé et avoir fait perdre un peu de temps pour ceci, mais si vous avez d'autres questions n'hésitez pas que je puisse éclairer votre lenterne.

Car en macro je ne peux être qu'admiratif de votre travail.

Encore merci
 

job75

XLDnaute Barbatruc
Re : Création de X lignes par rapport à une cellule

Bonjour oxychene,

Ecoutez faites un effort car on n'y comprend rien.

Au lieu de faire un couper-coller laissez les valeurs en AN9:BG9.

Et mettez les définitivement au bon emplacement dans les lignes vides créées.

Vous parlez maintenant des colonnes B et C alors que vous parliez avant de la ligne D, il faudrait savoir ce que vous voulez.

J'attends votre fichier exemple renseigné clairement.

Bonne journée.
 

oxychene

XLDnaute Junior
Re : Création de X lignes par rapport à une cellule

Bonjour à tous, bonjour à job75,

Tout d’abord je m’excuse de ne pas avoir donné de nouvelles pour cette longue absence il me semblait avoir rédigé un message que j’allais avancer le fichier pour faciliter la suite. Encore mille excuses.
J’ai donc ainsi réorganisé les données pour faciliter la suite de votre macro

Free - Envoyez vos documents

Toujours en feuille MO
-Ainsi dans le nouveau fichier je souhaite toujours créer les lignes par rapport aux valeurs en BM
-Coller les articles dans ces lignes nouvellement créées.
-AN :BL en colonne B pour les matériaux, sous traitance et opération
-Puis le matériel et la location associée en AJ
Il doit rester une ligne vide c’est normal

Vous pouvez regarder l’exemple en ligne 9 :13 ou les cellules ont étaient collées comme demandé auparavant. Je n’ai pas fait de flèche pour toutes les cellules collées pour plus de lisibilité

Merci de votre patience, espérant être explicite et restant à votre disposition pour de plus amples renseignement si besoin.

Cordialement

Oxychene
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Création de X lignes par rapport à une cellule

Bonjour oxychene,

C'est plus que cavalier de nous laisser sans nouvelles pendant 3 mois :rolleyes:

Mais dans 3 jours c'est Noël alors ce sera mon cadeau.

La macro :

Code:
Sub InsereLignes()
Dim duree, deb As Range, ncol%, derlig&, P As Range, rc&, t, tref, rest(), i&, n&, j%, n1, n2
duree = Timer
Set deb = [A9:BM9] '1ère ligne du tableau
ncol = deb.Columns.Count 'nombre de colonnes du tableau
derlig = Cells(Rows.Count, deb.Column).End(xlUp).Row
Set P = deb.Resize(derlig - deb.Row + 1)
rc = P.Rows.Count
t = P.FormulaR1C1
tref = P.Columns(ncol).Value 'colonne de référence
'---tableau des résultats---
ReDim rest(1 To rc + Application.Sum(tref), 1 To ncol)
For i = 1 To rc
  n = n + 1
  For j = 1 To ncol
    rest(n, j) = t(i, j)
  Next
  n1 = 0: n2 = 0
  For j = 40 To 64 'transfert des colonnes AN à BL...
    If t(i, j) = "" Then Exit For
    If LCase(t(i, j)) Like "mo?taux*" Then
      n1 = n1 + 1
      rest(n + n1, 2) = t(i, j) '...en colonne B
    Else
      n2 = n2 + 1
      rest(n + n2, 36) = t(i, j) '...en colonne AJ
    End If
  Next
  n = n + tref(i, 1)
Next
Application.EnableEvents = False ' si macros évènementielles
Application.Calculation = xlCalculationManual 'si formules volatiles dans le classeur
'---suppression des formules---
P = P.Value
'---insertion réelle de lignes---
For i = rc To 1 Step -1
  P(i + 1, 1).Resize(tref(i, 1)).EntireRow.Insert
  Application.StatusBar = "Réalisé " & Int(100 * (rc - i + 1) / rc) & " %" _
    & " - Lignes restantes " & i - 1
Next
'---restitution des formules et valeurs---
deb.Resize(n, ncol) = rest
[AN:BL].Clear 'facultatif, effacement de la zone transférée
Cells.WrapText = False 'évite les renvois à la ligne
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
MsgBox "Durée " & Format(Timer - duree, "0.00 \s")
End Sub
Chez moi elle s'exécute en 7 minutes 30 secondes.

Edit 1 : c'est variable, un autre essai en 12 minutes 23 secondes, un autre en 6 minutes 25 secondes...

Edit 2 : en fait on devrait gagner du temps en remplaçant :

Code:
'---suppression des formules---
P = P.Value
par :

Code:
'---effacement du tableau---
P = ""
Fichier joint :

Document Cjoint

J'espère que vous ne mettrez pas 6 mois pour nous dire si ça vous convient...

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Création de X lignes par rapport à une cellule

Re,

J'ai ajouté Application.Screenupdating = False => 4 minutes 33 secondes :

Document Cjoint

Code:
Sub InsereLignes()
Dim duree, deb As Range, ncol%, derlig&, P As Range, rc&, t, tref, rest(), i&, n&, j%, n1, n2
duree = Timer
Set deb = [A9:BM9] '1ère ligne du tableau
ncol = deb.Columns.Count 'nombre de colonnes du tableau
derlig = Cells(Rows.Count, deb.Column).End(xlUp).Row
Set P = deb.Resize(derlig - deb.Row + 1)
rc = P.Rows.Count
t = P.FormulaR1C1
tref = P.Columns(ncol).Value 'colonne de référence
'---tableau des résultats---
ReDim rest(1 To rc + Application.Sum(tref), 1 To ncol)
For i = 1 To rc
  n = n + 1
  For j = 1 To ncol
    rest(n, j) = t(i, j)
  Next
  n1 = 0: n2 = 0
  For j = 40 To 64 'transfert des colonnes AN à BL...
    If t(i, j) = "" Then Exit For
    If LCase(t(i, j)) Like "mo?taux*" Then
      n1 = n1 + 1
      rest(n + n1, 2) = t(i, j) '...en colonne B
    Else
      n2 = n2 + 1
      rest(n + n2, 36) = t(i, j) '...en colonne AJ
    End If
  Next
  n = n + tref(i, 1)
Next
Application.ScreenUpdating = False
Application.EnableEvents = False ' si macros évènementielles
Application.Calculation = xlCalculationManual 'si formules volatiles dans le classeur
'---effacement du tableau---
P = ""
'---insertion réelle de lignes---
For i = rc To 1 Step -1
  P(i + 1, 1).Resize(tref(i, 1)).EntireRow.Insert
  Application.StatusBar = "Réalisé " & Int(100 * (rc - i + 1) / rc) & " %" _
    & " - Lignes restantes " & i - 1
Next
'---restitution des formules et valeurs---
deb.Resize(n, ncol) = rest
[AN:BL].Clear 'facultatif, effacement de la zone transférée
Cells.WrapText = False 'évite les renvois à la ligne
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
MsgBox "Durée " & Format(Timer - duree, "0.00 \s")
End Sub
Bonne fin de soirée.
 

oxychene

XLDnaute Junior
Re : Création de X lignes par rapport à une cellule

Bonsoir à tous, bonsoir job75,

non je ne mettrais pas six mois pour vous répondre maintenant. Je vais prendre le temps de donner suite à cette discussion pour je l’espère la faire afficher en résolu.

Le résultat y est presque mais je n'aurais pas du prendre l'exemple sur la ligne 9 qui n'est pas complète en terme d'article.

En colonne B doit apparaître dans l'ordre (ils y sont déjà mais en colonne) les matériaux, puis la sous traitance puis les opérations.

En parallèle lorsqu'un matériel où une location suis une opération il doit être collé en colone AJ sur la même ligne que l'opération précédente.

Puis il reste une ligne blanche.

Sauf que,

Pour que votre macro puise différencier une cellule contenant où bien des matériaux, de la sous traitance, de la location, du matériel.
J'ai beau me gratter la tête même avec les formules index/equiv à l'aide de la feuille "matériaux" et des colonne A pour déterminer la famille d'article et colonne C qui reprend tout les articles qui composent les données des colonnes AN :BL de la feuille MO
je ne vois comment je peux vous aider.

Peut être qu'une fonction recherche est plus approprié aux macro

Pour dire à la macro que c'est une opération rien de plus simple, il n'y à que "MO_taux_3" et "MO_taux_1"

Je vous rejoint votre fichier avec en exemple la ligne 18 où se retrouve les différents articles.

Free - Envoyez vos documents

PS votre fichier joint à mis un peux moins de cinq minutes, j'en reste sidéré à savoir qu'en cinq minutes je fait manuellement un peu moins de 100 lignes si l'ordi ne plante pas.

Encore merci, cordialement

Oxychene
 

Discussions similaires

Statistiques des forums

Discussions
312 225
Messages
2 086 411
Membres
103 201
dernier inscrit
centrale vet