Générer une liste à partir d'une autre

D

Debutant

Guest
Bonjour,

Je préviens tout de suite, je ne connais pas grand-chose à excel !

J'ai une feuille qui contient des données sous la forme

***************
* 1 * A * etc.
***************
* * B * etc.
***************
* * C * etc.
***************
* 2 * D * etc.
***************
* * E * etc.
***************
* * F * etc.
***************
etc.


Je souhaite générer une liste à partir de ces données qui soit de la forme :
***************
* 1 * A * etc.
***************
* 2 * D * etc.
***************
etc.

C'est à dire que si il y a une donnée dans la première colonne, alors je veux la récupérer puis récupérer les autres valeurs de la ligne (en fait juste les 2 premieres colonnes me suffisent).

Puis-je le faire automatiquement ? Dois-je faire une macro ?
Pourriez-vous m'aider pour la macro ?

Merci d'avance !
 
H

Hervé

Guest
bonsoir

une proposition :

Public Sub vev()
Dim c As Range
Dim n As Integer

n = 1
For Each c In Range("a1:a" & Range("a65000").End(xlUp).Row)
If IsNumeric(c) And c <> "" Then
Range("d" & n).Value = c
Range("e" & n).Value = c.Offset(0, 1)
n = n + 1
End If
Next c

End Sub

Salut
Hervé
 
H

Hervé

Guest
re

Je me rend compte en me relisant que je n'ai pas été très pédago, alors je me corrige :

le code suivant va scanner la colonne A si la cellule n'est pas vide et si la valeur est numérique, si les deux conditions sont remplis on place les deux valeurs (colonne A et B ) en colonne D et E :

Public Sub vev()
'ont déclare les variables
Dim c As Range
Dim n As Integer

'on affecte 1 à la variable n
n = 1
'pour chaque cellule de la plage A1: A jusqu'a la derniere cellule non vide
For Each c In Range("a1:a" & Range("a65000").End(xlUp).Row)
'si la cellule est du type numérique et si elle n'est pas vide
If IsNumeric(c) And c <> "" Then
'placer dans la colonne D à la ligne n la valeur de c
Range("d" & n).Value = c
'placer dans la colonne E à la ligne n la valeur qui se trouve une colonne à la droite de c
Range("e" & n).Value = c.Offset(0, 1)
'on incrémente n sinon on sera toujours sur la ligne 1
n = n + 1
'fin de la condition
End If
'prochaine cellule
Next c
'fin de la macro
End Sub

Ce code est à placer dans le module de ta feuille : tu clique droit sur l'onglet puis visualiser le code.

Espérant t'avoir aidé

Salut
Hervé
 
D

Debutant

Guest
Oui merci beaucoup ! Ca l'air de correspondre exactement !
Par contre comme je ne vois pas de référence à une autre feuille, j'ai l'impression que la macro va remplacer ma liste existante (?).
Enfin je suppose que je n'ai qu'à rajouter le nom de la feuille devant la plage de cellule à scanner.

Merci !
 
M

Mac Rault

Guest
Bonjour Débutant et Hervé

En lisant ce post je me pose la question suivante
comment faire la m^me manip mais en recherchant dans la
colonne A une variable ( ex: un nom ) que l'on aurait
choisi dans une cellule
ex: cellule E1 = toto
manip rechercher dans la col A les toto et donner les
valeurs des cellules adjacentes.

Dans la macro que vous avez réaliser cela correspond je pense à
c et ISNumeric mais je ne sais pas remplacer cela pour obtenir
mon "toto"

merci d'avance pour vos conseils
 
H

Hervé

Guest
Bonjour Débutant et Mac Rault

Toujours sur le même principe de la boucle de la boucle for next, pour retrouver une valeur (toto) dans la colonne A, il faut simplement dire à la macro de comparer le C avec la valeur de la cellule E1 :

If c = Range("e1") Then

si tu as passé ta valeur de e1 en variable :

tavaleur = range("e1")
If c = tavaleur Then

Si tu es sur de toujours chercher "toto" : If c = "toto" Then

Lorsque que l'on compare en VBA, il existe des options de comparaison (voir l'aide d'excel à l'index Compare), dont une qui me semble bien pratique : OPTION COMPARE TEXT.

Cette instruction placé en tête de module (c'est à dire tout en haut de la "feuille" VBA et en dehors d'une procédure) permet de s'affranchir des minuscules et majuscules, donc on trouvera les "toto", mais aussi les "TOTO" ou les "Toto" ainsi que les "tOtO" etc...

enfin et pour finir pour retrouver du texte dans une colonne, on peut utiliser cette macro :

Public Sub vev2()
Dim trouvé As Range
Dim firstaddress As String
Dim n As Integer

n = 1
Set trouvé = Range("a1:a" & Range("a65000").End(xlUp).Row).Find(Range("e1"))
If Not trouvé Is Nothing Then
firstaddress = trouvé.Address
Do
Range("f" & n).Value = trouvé
Range("g" & n).Value = trouvé.Offset(0, 1)
n = n + 1
Set trouvé = Range("a1:a" & Range("a65000").End(xlUp).Row).FindNext(trouvé)
Loop While Not trouvé Is Nothing And trouvé.Address <> firstaddress
End If
End Sub

Qui n'est que la traduction VBA du menu Edition\rechercher.

En espérant n'avoir pas été trop long, et avoir satisfait ta curiosité.

Salut
Hervé
 
M

Mac Rault

Guest
Salut Hervé,

merci pour ta réponse , j'ai testé et cela fonctionne très bien.
Tes explications étaient très claires et cela répond à un besoin
que j'essayai de combler avec les filtres.

Merci encore pour ton aide

@micalement
 

Discussions similaires

Réponses
9
Affichages
443

Statistiques des forums

Discussions
312 391
Messages
2 087 954
Membres
103 686
dernier inscrit
maykrem