Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Insertion de lignes sous condition

TomAg

XLDnaute Nouveau
Bonjour,

Tout d'abord, un grand bravo à toutes les personnes bienveillantes qui prennent de leur temps pour aider les autres sur ce forum !

Après de nombreuses recherches et tentatives, je m'adresse à vous aujourd'hui dans l'espoir de résoudre mon problème :
Je souhaite, dans une feuille nommée "BUDGET", insérer un groupe de ligne (ligne 3 à ligne 77) présent sur sur une autre feuille "base", sous chaque sous détail de prix (ex. 101, 102, 103, 104, mais pas 100 et 200 sur la photo ci-joint)
Pour cela, je souhaite incorporer une condition : Le groupe de ligne à insérer devra être inséré seulement sous chacune des lignes où la valeur "VRAI" est indiquée en colonne L.

Feuille "BUDGET"


Feuille "base"

Pouvez-vous m'aider ?

En vous remerciant par avance !
 
Solution
Voici :


VB:
Sub test()
  Dim Plage As Range, Ligne As Long
  Dim i As Integer                               'ligne que j'ai rajouté
 
  Application.EnableEvents = False
  Application.ScreenUpdating = False
  With Sheets("base")
    Ligne = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
    Set Plage = .Range("C3", .Cells(Ligne, 3)).EntireRow
  End With
  With Sheets("BUDGET")
    .Unprotect
    Ligne = .Cells(.Rows.Count, 12).End(xlUp).Row
    For i = Ligne To 5 Step -1
      If .Cells(i, 12) = True Then
        .Rows(i + 1).Resize(Plage.Rows.Count).Insert
        Plage.Copy .Cells(i + 1, 1)
      End If
    Next i
  End With
  Application.EnableEvents = True
  Application.EnableEvents = True
End Sub

Daniel

TomAg

XLDnaute Nouveau
Bonjour et merci pour votre réponse,

Désolé pour l'explication un peu foireuse...

Je vais tenter d'être un peu plus explicite !

Voici ci-dessous l'illustration du résultat que je souhaite obtenir de façon automatisé, sans avoir à insérer 100 fois à la main le "paquet" de lignes en vert pâle.

--> En cliquant sur un bouton de la feuille "BUDGET" (ci-dessus), je souhaite insérer sous chaque ligne où la case à cocher indique VRAI, l'ensemble des lignes présentes sur une feuille nommée "base", à savoir les lignes 3 à 74 (cf. ci-dessous). Je précise que les deux feuilles se situent sur le même classeur.


Si besoin, je pourrais vous transmettre une partie de mon fichier excel en supprimant les données confidentielles...

En vous remerciant par avance pour votre grande aide !!!
 

danielco

XLDnaute Accro
Attache cette macro au bouton :

VB:
Sub test()
  Dim Plage As Range, Ligne As Long
  Application.EnableEvents = False
  With Sheets("base")
    Set Plage = .Range("C2", .Cells(.Rows.Count, 3).End(xlUp)).Offset(, -2).Resize(, 8)
  End With
  With Sheets("BUDGET")
    Ligne = .Cells(.Rows.Count, 12).End(xlUp).Row
    For i = Ligne To 5 Step -1
      If .Cells(Ligne, 12) = True Then
        .Rows(i + 1).Resize(Plage.Rows.Count).Insert
        Plage.Copy .Cells(i + 1, 1)
      End If
    Next i
  End With
  Application.EnableEvents = True
End Sub

Daniel
 

TomAg

XLDnaute Nouveau
Bonjour,

Tout d'abord, merci pour votre réponse !

Malheureusement, après avoir testé votre code, cela ne donne pas encore le résultat escompté.

Je me suis permis de rajouter une ligne "Dim i As Integer", suite à un message d'erreur au lancement de votre macro.

Malgré cela, deux problèmes majeurs sont encore présents :
- Je souhaite copier les lignes entières de la feuille base (afin de conserver le format), et non pas juste les cellules de B3 à H74 semble le faire ce code.
- Le code ne "fonctionne" seulement que pour les deux dernières lignes cochées de la feuille "BUDGET", or, il faudrait qu'elle fonctionne pour chaque ligne où la case est cochée...

Je vous joint le fichier avec le morceau de code inséré !

Merci d'avance !
 

Pièces jointes

  • V12 nue test.xlsm
    623 KB · Affichages: 7

danielco

XLDnaute Accro
Voici :


VB:
Sub test()
  Dim Plage As Range, Ligne As Long
  Dim i As Integer                               'ligne que j'ai rajouté
 
  Application.EnableEvents = False
  Application.ScreenUpdating = False
  With Sheets("base")
    Ligne = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
    Set Plage = .Range("C3", .Cells(Ligne, 3)).EntireRow
  End With
  With Sheets("BUDGET")
    .Unprotect
    Ligne = .Cells(.Rows.Count, 12).End(xlUp).Row
    For i = Ligne To 5 Step -1
      If .Cells(i, 12) = True Then
        .Rows(i + 1).Resize(Plage.Rows.Count).Insert
        Plage.Copy .Cells(i + 1, 1)
      End If
    Next i
  End With
  Application.EnableEvents = True
  Application.EnableEvents = True
End Sub

Daniel
 

Discussions similaires

Réponses
18
Affichages
1 K
Réponses
8
Affichages
485
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…