Selection lignes dans un tableau
Bonsoir à tous
J'ai un tableau par année depuis 2002 où sont stockées des informations concernant des individus. Ces individus ont deux identifiants et sont donc uniques Mon but est de faire un tableau réunissant les informations d'un même individu issues des tableaux de toutes les années de 2002 à 2012.
Je précise que je suis débutant en programmation VBA excel. Depuis peu je bute sur un problème dont la réponse doit être relativement simple mais qui m’échappe.
Voici l'objet de la demande d'aide:
Je veux sélectionner des lignes dont la valeur est 1 dans la colonne Y. Simple non ? J'ai fait un tri pour les regrouper. Voici deux "bouts" de macros différentes pour sélectionner les lignes dans le tableau source pour les copier dans le tableau destination
Sub tst()
Dim i As Long
i = 1
While Not IsEmpty(Cells(i, 3))
If Cells(i, 25).Value = 1 Then
Rows(i).Select
Selection.Copy
End If
i = i + 1
Wend
End Sub
Sub test_2()
Dim i As Long
i = 1
For i = Range("Y" & Rows.Count).End(xlUp).Row To 2 Step -1
If Cells(i, 25).Value = 1 Then
Rows(i).Copy
End If
Next i
End Sub
LA 1re ne me sélectionne que la dernière ligne et la seconde que la première de la série de lignes contenant 1 en Y malgré l'utilisation de boucles.
Autre impératif, je dois travailler sur plusieurs gros fichiers, environ 1 000 000 de lignes voire plus. Prière de ne pas rire, je me débrouille avec les moyens du bord. Cela pour dire que la solution doit en plus de fonctionner ,doit être rapide.
Merci pour votre aide
Amicalement
Jean-François
Bonjour,
si tu veux optimiser il faut donner tous les détails de ce que tu veux faire.
Et mettre un fichier exemple avec tous les cas de figure et le résultat à obtenir.
eric
Bonjour,
Tes 2 boucles fonctionnent correctement.
Elles te permettent bien de copier les lignes dont la colonne Y contient un 1.
Le problème, c’est que la copie se fait dans le presse papier et que chaque copie écrase la précédente.
As-tu envisagé d’utiliser un filtre ?
A+
Bonjour Eric
Merci pour ta réponse rapide
J'ai par année un tableau de 24 colonnes avec pour chacun un nombre de lignes variable. Chaque ligne contient des informations sur des individus. Chaque individu possède deux identifiants propres qui le rendent unique. (ah si j'avais access au boulot). Il y a plusieurs lignes par individus, par exemple plusieurs achats...
Je sélectionne avec ces 2 identifiants que j'ai appelé pour l'exemple X et Y les lignes d'un individu pour chaque année de façon à les copier dans un tableau unique dans le but d'obtenir tous ses achats sur toutes les années.
Voici le principe de ma macro : j'ouvre une année, je sélectionne (les bouts de codes fournis dans le 1er post) les info avec mes identifiants X et Y je les copies dans un tableau destination. Je ferme le tableau source, j'ouvre l'année suivante et ainsi de suite .... Je marque les lignes sélectionnées par un 1 dans la première colonne vide la n°25
Voici le début de mon code (dès que mon problème de sélection est résolu, j’écris le, reste )
Sub AppelConsommation()
Call OuvertureTotal2012
Call Selection
End Sub
Sub OuvertureTotal2012()
Application.ScreenUpdating = False
Application.Workbooks.Open ("D:\Total2012.xlsx")
Columns.AutoFit
End Sub
Sub Selection()
Dim X As String
Dim Y As String
Dim i As Long
i = 1
Windows("Total2012").Activate
Sheets("Total2012").Select
X = Application.InputBox("X,")
Y= Application.InputBox("Y?")
While Not IsEmpty(Cells(i, 1))
If Cells(i, 1) = X And Cells(i, 2) = Y Then
Cells(i, 25) = 1
End If
i = i + 1
Wend
End Sub
Je ne sais pas trop si j'ai été clair...
Amicalement
Jean-François
Bonsoir Frangy
Mon but est de tout automatiser pour des "handicapés d'excel"
Perso j'utiliserai un flitre et un copier-coller.
Je ne comprends pas le coup du press-papier. Pourquoi les lignes sélectionnées ne sont-elles pas mises en surbrillance commequand on sélectionne la source de données pour un tableau croisé dynamique?
Merci de ton aide
Amicalement
Jean-François
Tu peux très bien faire cela via macro pour que ce soit transparent pour l’utilisateur.Mon but est de tout automatiser.
Perso j'utiliserai un filtre et un copier-coller.
Parce que les plages copiées ne sont pas réunies avec l’instruction copy.Je ne comprends pas le coup du presse-papier. Pourquoi les lignes sélectionnées ne sont-elles pas mises en surbrillance comme quand on sélectionne la source de données pour un tableau croisé dynamique?
Fais ce test.
Sub tst()
Dim i As Long
Dim MaPlage As Range
i = 1
While Not IsEmpty(Cells(i, 3))
If Cells(i, 25).Value = 1 Then
If n > 0 Then
Set MaPlage = Application.Union(MaPlage, Rows(i))
Else
Set MaPlage = Rows(i)
n = n + 1
End If
MaPlage.Copy
End If
i = i + 1
Wend
End Sub A+
MERCI FRANGY !
C'est génial! Non seulement cela fonctionne parfaitement mais en plus c'est rapide.
Vraiment sympa
Bonne soirée
Jean-François qui va écrire la suite de la macro.