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

Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Maohtsukai

XLDnaute Nouveau
Bonjour à tout le monde sur ce forum, ceux qui pourront m'aider comme ceux que ce post va aider peut être ^_^

Je viens vers vous aujourd'hui pour creer une macro qui me permettrait sur la Sheet(1) d'insérer des lignes si les valeurs que prennent les Cellules du Range (55 : AJ) jusqu'à la cellule (155 : AJ) ne sont pas comprises entre -5 et +5.

Une fois les lignes insérées, je voudrais reprendre les valeurs qu'ont prises les cellules et les coller sur la ligne insérée. Je voudrais aussi, si le Range ne contient aucunes cellules dont les valeurs ne sont pas comprises entre -5 et +5 n'insérer aucune Ligne.

Voici ce que j'ai fais jusque là, mais comme vous l'avez bien compris, mon niveau ne me permet pas d'avoir une macro qui fonctionne à 100% :

Code:
Sub Macro 1
Dim Cell as Range
Sheets(2).Select
Range("AJ55;AJ155").select

For Each Cell In Sheets(2).Range("AJ55;AJ155").End(xlUp).Row)
If -5<Cell.Value<5  Then
Sheet(1).select
EntireRow.insert

Je ne sais juste pas comment insérer ma ligne au bon endroit sur la sheet1, ainsi que coller les valeurs que je veux...

Si quelqu'un pouvait m'aider, j'en serai extremement reconnaissant ^_^

Merci à tous, surtout si vous prenez le temps
 

Maohtsukai

XLDnaute Nouveau
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...



Siou plé Msieur dames... VBA c'est dur >_<

Je plaisante, mais je re up un peu quand même parce que je ne suis vraiment pas doué et que toute aide est plus que bienvenue

Merci à tous...
 

JNP

XLDnaute Barbatruc
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Bonjour Maohtsukai ,
Essaie ce code
Code:
Sub Macro1()
Dim Cellule As Range, J As Integer
J = 1
For Each Cellule In Sheets(2).Range("AJ55:AJ155")
If -5 > Cellule.Value Or Cellule.Value > 5 Then
Sheets(2).Rows(Cellule.Row).Copy Sheets(1).Rows(J)
J = J + 1
End If
Next
End Sub
Ça devrait être un bon début.
Bonne journée
 

Maohtsukai

XLDnaute Nouveau
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Bonjour JNP et tout le forum,

Désolé si je reviens vers vous une semaine après, mais il est l'heure de cravacher un peu sur cette macro qui me donne tant de mal ^_^ Même si d'après ta réponse ça n'a vraiment pas l'air compliqué...

Une question Cependant, si je veux appliquer ça à toutes les colonnes AJ de mes 9 sheets, dois-je utiliser un :

For Each Sheet

ou alors utiliser le code d'une maniere différente?

Aussi, comment pourrais-je faire pour insérer sur la Sheet 1, la ligne que je veux n'importe où, par exemple au niveau de la ligne 58 et de la colonne AI ???

Je suis désolé d'etre un Newbie à ce point là sur VBA, mais tout le monde n'a pas les mêmes aptitudes dans ce monde cruel...

Merci encore une fois à tout le monde ^_^
 

JNP

XLDnaute Barbatruc
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Re ,
Tu as de la chance que je sois toujours abonné après 1 semaine... Je suis obligé de faire régulièrement le tri des messages suivis, et les messages sans réponses depuis un certain temps, poubelle...
Si toutes tes données sont au même endroit, oui, un
Code:
Dim Feuille As Worksheet
For Each Feuille In ThisWorkbook.Worksheets
...
Next
dans le ..., tu as intérêt à vérifier que ta feuille ne soit pas la feuille 1
Code:
If Feuille.Name <> Sheets(1).Name Then
...
End If
Par contre, s'amuser à le mettre n'importe où ne fait pas partie de la rigeur VBA. Tu peux le faire, mais à tes risques et périls .
Bonne semaine, à dans 8 jours...
 

Maohtsukai

XLDnaute Nouveau
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Moins que 8 jours puisque je suis déjà là ^_^

Mais Merci beaucoup JNP de ta patience et de toujours regarder les messages sur lesquels tu interviens

Donc on disait...

Une question !!! Si sur une de mes feuilles (la feuille 3 en l'occurence), la colonne sur laquelle je veux analyser les données n'est pas la même que sur toutes les autres, dois-je introduire un :

Code:
If Feuille.Name <> Sheets(3).Name Then
For Each Cellule In Sheets(3).Range("AY55:AY155")
If -5 > Cellule.Value Or Cellule.Value > 5 Then
End If

???

Et pour coller, je ne souhaite pas coller "n'importe où", mais dans un cadre crée à l'avance, qui commencerait à la colonne D et la ligne 55, puis rajouter des lignes si besoin est, il y a-t-il une formule pour ça?

Merci Merci Merci ^_^
 

Maohtsukai

XLDnaute Nouveau
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Si quelqu'un souhaite Intervenir, je rajoute une autre question parce que cette macro me rend fou >_<

En fait, une fois les valeurs trouvées en colonne AJ, je souhaite copier les cellules de la même ligne mais en colonne AE et AF seulement, et coller les 3 valeurs sur la même ligne sur la Sheet 1 dans un ordre différent...

Je pense qu'il faut utiliser un code du type :

Code:
Range(ActiveCell, Range(Cellule).Offset(2, -4)).Select

Mais cela ne fonctionne pas >_<

Merci à ceux qui liront ce poste et auront peut être une solution ^_^
 

JNP

XLDnaute Barbatruc
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Re ,
Si ta macro te rends fou, c'est certainement parce que tu essaies d'adapter ton code au fur et à mesure, au lieu de poser ton problème avant de coder .
Maintenant, j'apprécie que tu te décarcasses pour comprendre, et je vais essayer de t'aider pour t'en sortir .
En ce qui me concerne, j'aurais plutôt essayé d'aligner les feuilles de données, pour appliquer le même traitement à toutes, mais chacun voit midi à sa porte .
Si tu commences à faire des cas particuliers, en imbriqué, tu peux soit utiliser une méthode ElseIf, que je ne pratique pas moi-même, mais que tu peux consulter dans l'aide, soit utiliser une méthode Select Case type
Code:
Dim Feuille As Worksheet
For Each Feuille In ThisWorkbook.Worksheets
Select Case Feuille.Index
Case 1
...
Case 2
...
Case Else
...
End Select
Next
où suivant l'index de ta feuille, l'action se fera juste après le Case.
Maintenant, il faut savoir que Case accepte pas mal d'instructions, type
Code:
Case 1, 2 ' index 1 et 2
Case 1 To 5 'index 1 à 5
Case Is < 5 ' index inférieur à 5
Case 1, 4 To 6, 8 'index 1, 4, 5, 6, 8
' Etc.
et enfin Feuille.Name te donnera son nom d'index, alors que Feuille.CodeName te donnera son nom VBA.
Maintenant, pour les alignements, tu peux très bien utiliser la Copy en Row que je t'ai fourni, puis supprimer les cellules devant, ce sera à mon avis plus simple.
Bonne soirée
 

Maohtsukai

XLDnaute Nouveau
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Merci JNP de ta patience à toutes épreuves ^^

Par rapport à la macro en soi, je pense que ça va, elle tourne bien ^_^ Je pense qu'elle va bien rechercher les valeurs qu'il faut dans toutes les sheets, et même si je connaissais la fonction Select.Case, je n'avais pas pensé à l'utiliser de cette maniere donc Merci ^_^

Au delà de ça, je n'arrive toujours pas à coller les valeurs sur la Sheet(1). La formule que j'ai utilisée ne fonctionne pas >_<

Voilà mon code pour le moment :

Code:
Sub Macro1()
Dim Cellule As Range, J As Integer, Feuille As Worksheet
J = 55
For Each Feuille In ThisWorkbook.Worksheets

Select Case Feuille.Index

Case 2, 4, 5, 7, 8
For Each Cellule In Sheets(2).Range("AJ55:AJ155")
If -5 > Cellule.Value Or Cellule.Value > 5 Then
Range(Range("D3"), Range("D3").Offset(0, 3)).Select
Sheets(2).Rows(Cellule.Row).Copy Sheets(1).Rows(J)
J = 55 + 1
End If
Next

Case 3
For Each Cellule In Sheets(2).Range("AY55:AY155")
If -5 > Cellule.Value Or Cellule.Value > 5 Then
Range(Range("D3"), Range("D3").Offset(0, 3)).Select
Sheets(2).Rows(Cellule.Row).Copy Sheets(1).Rows(J)
J = 55 + 1
End If
Next


End Select

Next

End Sub '

Le problème, c'est que même si les valeurs sont trouvées dans les ranges, dans chaque sheet, je n'arrive pas à les selectionner pour coller les trois cellules qu'il me faut sur la premiere Sheet >_<

Une idée??? Merci beaucoup !!!!!!! ^_^
 

JNP

XLDnaute Barbatruc
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Re ,
Comme précisé précédement, c'est la ligne complète qui est copiée... Ta ligne
Code:
Range(Range("D3"), Range("D3").Offset(0, 3)).Select
ne sert strictement à rien, étant donné que tu ne fait rien avec la sélection !
De plus, c'est une sélection fixe qui n'a rien à voir avec le scannage des lignes ...
Est-ce que ça veut dire que tu ne veux que les valeurs dans D, E et F de ta ligne pour les copier en A de ta nouvelle ligne ? Désolé, mais je n'ai pas le décodeur ...
Un petit fichier exemple, sans données confidentielles, serait certainement le bienvenu pour éclairer ma lanterne...
Bonne soirée
 

Maohtsukai

XLDnaute Nouveau
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

LOL JNP, merci de ton honneteté... je suis un Noob et je le sais donc merci de ne pas m'épargner ^_^

Le truc en fait, c'est que c'est un fichier qui se renouvelle sur toutes les sheets, et y'a des lignes qui peuvent apparaitre sur le Range où je veux retrouver les valeurs (d'où l'extension de la ligne 55 à la ligne 155...). En gros je peux avoir 4 lignes de valeurs sans rien à reprendre, comme une cinquantaine, avec 10 valeurs à reprendre et à coller. D'où l'insertion de ligne, If -5>Cell.value or 5<Cell.value

C'est pour ça que si les valeurs sont supérieures à 5 ou inférieures à -5, je cherche à prendre cette valeur, ainsi que les informations se situant sur les deux cellules situées trois cellules à la gauche de la colonne AJ sur la même ligne...

Dans le fichier joint, j'ai un exemple de tableau, sur lequel je voudrais reprendre les valeurs de la ligne 7 et de la ligne 2 (respectivement 44 et 6) et donc les coller dans l'encadré sur la sheet 1, en insérant deux lignes au niveau de Spec 1. Des fois je pourrai avoir 10 valeurs qui doivent rentrer au niveau de la Spec 1, 4 au niveau de la Spec 2 et 8 au niveau de la Spec 3 par exemple, je dois donc pouvoir insérer des lignes et coller les bonnes valeurs au bon endroit...


j'espere que c'est clair... parce que j'ai un peu de mal à m'exprimer ^_^

Voilaaaaaaaa Merci pour tout encore une fois... je ne sais pas combien de fois je t'ai dis Merci, mais c'est équivalent à mon niveau de reconnaissance ^^ donc Merci Merci merci ^^
 

Pièces jointes

  • Exemple.xls
    19.5 KB · Affichages: 63
  • Exemple.xls
    19.5 KB · Affichages: 70
  • Exemple.xls
    19.5 KB · Affichages: 70

JNP

XLDnaute Barbatruc
Re : Insertion de plusieurs lignes si la valeur est comprise entre ... et ...

Re ,
Bon, je vais être honnête avec toi, c'est clair comme du jus de boudin !
Sous ce nouvelle éclairage (nocturne ), j'ai complètement changé mon fusil d'épaule...
Mon décodage :
1) Spec 1, Spec 2, etc. sont les noms de tes onglets
2) Tes colonnes ne sont pas sur chaque feuille au même endroit
Je suis donc parti sur des compteurs pour trouver les colonnes dans les entêtes (à charge pour toi de les insérer dans chaque feuille, mais ça, ça va vite), puis je copie les valeurs qui nous intéressent dans la première feuille.
Voici le code
Code:
Sub Test()
Dim Feuille As Worksheet, I As Integer, J As Integer, PremièreLigne As Boolean, Résultat As Worksheet
Dim IEntityColonne As Integer, EntityNameColonne As Integer, DiscrepancyValueColonne  As Integer
Set Résultat = Sheets("Là où je dois coller")
For Each Feuille In ThisWorkbook.Worksheets
    If Feuille.Index <> 1 Then
        PremièreLigne = True
        IEntityColonne = 1
        EntityNameColonne = 1
        DiscrepancyValueColonne = 1
        With Feuille
            While .Cells(1, IEntityColonne) <> "I_Entity"
                IEntityColonne = IEntityColonne + 1
            Wend
            While .Cells(1, EntityNameColonne) <> "Entity Name"
                EntityNameColonne = EntityNameColonne + 1
            Wend
            While .Cells(1, DiscrepancyValueColonne) <> "Discrepancy Value"
                DiscrepancyValueColonne = DiscrepancyValueColonne + 1
            Wend
            I = 2
            J = 2
            While .Cells(I, DiscrepancyValueColonne) <> ""
                If -5 > .Cells(I, DiscrepancyValueColonne).Value Or .Cells(I, DiscrepancyValueColonne).Value > 5 Then
                    If PremièreLigne = True Then
                        Résultat.Cells(J, 1) = Feuille.Name
                        PremièreLigne = False
                    End If
                    Résultat.Cells(J, 2) = .Cells(I, IEntityColonne)
                    Résultat.Cells(J, 4) = .Cells(I, EntityNameColonne)
                    Résultat.Cells(J, 6) = .Cells(I, DiscrepancyValueColonne)
                    J = J + 1
                End If
                I = I + 1
            Wend
        End With
    End If
Next
End Sub
Attention, si le libellé d'une entête n'est pas valable, ou introuvable, plantage de la macro sur les boucles While...
Si tu veux commencer à la ligne 55 de chaque feuille, J = 55, de même que si ta feuille de résultat commence à la ligne 10, I = 10.
Voilà. Il te reste juste à rajouter les entêtes supplémentaires dont tu aurais besoin et faire une boucle pour chaque, ainsi que la copie. Si tu veux faire une copie de cellule pour garder la mise en forme, mais c'est plus lourd et moins rapide, il faut intervertir
Code:
Résultat.Cells(J, 2) = .Cells(I, IEntityColonne)
en
Code:
.Cells(I, IEntityColonne).Copy Résultat.Cells(J, 2)
Je te mets mon fichier de test.
Bon courage
 

Pièces jointes

  • Exemple(1).xls
    39 KB · Affichages: 76
  • Exemple(1).xls
    39 KB · Affichages: 83
  • Exemple(1).xls
    39 KB · Affichages: 92

Discussions similaires

Réponses
12
Affichages
460
Réponses
12
Affichages
666
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…