Extraction de données dans Excel

Bonjour,

J'aurais voulu savoir si cela est possible d'extraire des données d'un tableau pour en faire un autre qui soit automatisée. J'ai un fichier Excel par rapport à un jeu, où est regroupé tout les membres de la guilde par ordre alphabétique avec tous les grands monuments. Dans ma guilde, nous mettons chacun des points pour les monuments qui sortent.

Certain membre récalcitrant, on pris du retard, pour cela j'ai mi une croix en rouge.

J'aurais voulu extraire tout ceux qui ont une croix rouge dans un tableau à part qui me permettra de savoir chez qui, je dois réclamer. Je n'ai pas encore trouver comment faire?

Je vous remercie pour votre aide.

12gm-le-refuge.xlsx (236.55 Ko)

Bonjour,

Tiens, c'est un peu sale, mais ça te donne les membres récalcitrants!

A copier coller dans un module, et a utiliser tel quel!

Yann

Sub Qui_est_recalcitrant()

Dim tabentree() As Variant
Dim tabsortie(75, 0) As String
Dim i As Long, j As Long
Dim ligneSortie As Long

tabentree = ThisWorkbook.Sheets("Investissements").Range("I4:CE574").Value

For j = 1 To 75
    For i = 2 To 571

    If tabentree(i, j) = "X" Then

    tabsortie(ligneSortie, 0) = tabentree(1, j)

    ligneSortie = ligneSortie + 1
    Exit For
    End If

    Next i
Next j

ThisWorkbook.Sheets("RETARD ").Range("A1:A200").Value = tabsortie

End Sub

Merci L-Yann, c'est déjà pas mal, mais j'aurais voulu avoir en même temps les noms et la liste des grands monuments d'où ils n'ont pas participé.

Comment puis-je faire la suite pour afficher les noms des récalcitrants ainsi chez qui ils doivent mettre et sur quel bâtiment?

Merci d'avance.

Par contre mon tableau évolue constamment en nombre de colonne et ligne.

Bonjour,

J'ai été un peu busy ces derniers jours j'aipas pu m'occuper de ton cas.

Tu as essayé / réussit a adapter mon bout de code?

Quand tu dit que ton tableau évolu constamment, que représentent les nouvelles lignes / colonnes?

En faite, je rajoute souvent des nouveaux membres, et de nouveau grands monuments. J'ai mi ton code, il marche bien. J'ai juste la liste des noms. Ce que j'aurais voulu avoir enfaite donc la liste des noms des récalcitrant, et en même temp les noms des personnes et grand monuments pour voir faire les rappels. J'ai du mal à adapter le code.

Bonjour, je vais essayer de t'adapter ça.

Mais je t'avoue que ton tableau est assez dur à traiter de manière automatique.. :/ Le premier noms sera toujours Asus? Sera t-il toujours positionné en I4? Les noms ajoutés seront toujours sur la ligne 4 ?

La colonne es batiments, j'ai l'impression que c'est la colonne F. Ce sera toujours le cas? Le premier batiment sera toujours ligne 6 ? Les autres batiments seront toujours entrés sur la colonne 6 ?

Je crois qu'on a fait le tour des questions dont j'ai besoin d'avoir les réponses avant de te faire une macro!

A te lire,

Yann

Bonjour,

Les noms commenceront toujours à partir de I4 et dans D6. On adapte notre tableau par rapport au entrée et sortie dans Notre Guilde, donc je ne peux assurer si Asus compte rester ou pas chez nous pour le moment. Nous avons adapté le tableau exprès. Ensuite les bâtiments resteront toujours dans la colonne F,et commenceront toujours à partir de F6. C'est mon tableau final en faite.

Je te remercie d'avance.

Lamangaka

Bonjour,

Encore une fois désolé du retard!

Voilà, la macro devrait faire ce que tu veux! peut être même plus! Elle s'adaptera au nombre de lignes / colonnes a conditions que la structure générale de ton tableau reste le même (noms sur la même ligne / colonne, idem pour les bâtiments).

Sub Qui_est_recalcitrant()

Dim tabentree() As Variant
Dim tabsortie() As String
Dim i As Long, j As Long
Dim ligneSortie As Long, derlig As Long, dercol As Long

derlig = ThisWorkbook.Sheets("Investissements").Range("A" & Rows.Count).End(xlUp).Row
dercol = ThisWorkbook.Sheets("Investissements").Cells(1, Cells.Columns.Count).End(xlToLeft).Column

ReDim tabsortie(derlig + 1, 3) As String

If ActiveSheet.Name <> "Investissements" Then ThisWorkbook.Sheets("Investissements").Select

tabentree = ThisWorkbook.Sheets("Investissements").Range(Cells(1, 1), Cells(derlig, dercol)).Value

ligneSortie = 1

tabsortie(0, 0) = "Nom du récalcitrant"
tabsortie(0, 1) = "Nom du batiment"
tabsortie(0, 2) = "Date de pose"
tabsortie(0, 3) = "Nom du poseur"

For j = 1 To dercol
    For i = 1 To derlig

    If tabentree(i, j) = "X" And tabentree(4, j) <> "" Then

    tabsortie(ligneSortie, 0) = tabentree(4, j)
    tabsortie(ligneSortie, 1) = tabentree(i, 6)
    tabsortie(ligneSortie, 2) = tabentree(i, 5)
    tabsortie(ligneSortie, 3) = tabentree(i, 4)

    ligneSortie = ligneSortie + 1
    Exit For
    End If

    Next i
Next j

ThisWorkbook.Sheets("RETARD ").Range("A1:D" & derlig).Value = tabsortie

End Sub

Dit moi si ça tourne comme tu le veux!

Yann

C'est super, mais tu va me trouver chiante à la fin, mais par exemple Carmeliane dans mon tableau à plus de 25 retard, et j aurais voulu qu'il soit tous dans le tableau, car parfois Thomas, Carmeliane et d'autres ont pas mal de retard et d'autre en ont deux ou trois, la en appliquant la macro, ils apparaissent une seul fois.

Je te remercie.

Enlèves le

Exit for

dans la boucle, il devrais tous te les marquer!

Super, ça marche. Tu m'a été d'un très grande aide, une toute dernière chose, quand je met à jour ma liste au lieu de resté sur ma page des retards, il me met dans la feuille Investissements, comment ça se fait?

C'est parce qu'au moment du lancement de la macro, ça bug si tu n'est pas sur la feuille investissement. J'ai forcé la selection de la feuille pour éviter ce problème!

Tiens, je t'ai remis le code, je l'ai entièrement commenté pour que tu comprennes ce qu'il se passe. ça t'aidera à modifier le code à la marge au cas ou! (et en prime, je te remet sur la feuille retard si jamais tu y es au moment de lancer la macro )

Sub Qui_est_recalcitrant()

'Déclaration des variables utilisées dans le code
Dim tabentree() As Variant
Dim tabsortie() As String
Dim i As Long, j As Long
Dim ligneSortie As Long, derlig As Long, dercol As Long
Dim Ws as boolean

Ws  = false

'On gèle la mise a jour de l'écran
Application.screenUpdating = false

'On cherche la derniere ligne utilisée sur la feuille investissement
derlig = ThisWorkbook.Sheets("Investissements").Range("A" & Rows.Count).End(xlUp).Row
'On cherche la derniere colonne utilisée sur la feuille investissement
dercol = ThisWorkbook.Sheets("Investissements").Cells(1, Cells.Columns.Count).End(xlToLeft).Column

'On dimensionne le tableau de sortie en fonction du nombre de ligne de la feuille investissement
ReDim tabsortie(derlig + 1, 3) As String

'Si la feuille active n'est pas la feuille investissement, on la sélectionne (et on met le capteur Ws à true)
If ActiveSheet.Name <> "Investissements" Then ThisWorkbook.Sheets("Investissements").Select : Ws = true

'On récupère la totalité de ton tableau d'investissement
tabentree = ThisWorkbook.Sheets("Investissements").Range(Cells(1, 1), Cells(derlig, dercol)).Value

'on écrit les titres sur la premiere ligne du tableau de sortie
tabsortie(0, 0) = "Nom du récalcitrant"
tabsortie(0, 1) = "Nom du batiment"
tabsortie(0, 2) = "Date de pose"
tabsortie(0, 3) = "Nom du poseur"

'on se place sur la deuxieme ligne du tableau de sortie (la premiere ligne d'un tableau est 0, idem la premiere colonne d'un tableau est 0) => (sauf lorsqu'on recupère les données en une fois sur une feuille, comme je l'ai fait pour tabEntree) => (Les joies du VBA...)
ligneSortie = 1 'deuxieme ligne du tableau de sortie donc..!

'on boucle sur la totalité des valeurs de ton tableau d'investissements
For j = 1 To dercol 'Pour toutes les colonnes
    For i = 1 To derlig 'On par court toutes les lignes

    If tabentree(i, j) = "X" And tabentree(4, j) <> "" Then 'Si la valeur est égale à X et le nom du joueur existe alors

    tabsortie(ligneSortie, 0) = tabentree(4, j) 'On écrit le nom dans tabSortie
    tabsortie(ligneSortie, 1) = tabentree(i, 6) 'On écrit le batiment
    tabsortie(ligneSortie, 2) = tabentree(i, 5) 'On écrit la date de pose
    tabsortie(ligneSortie, 3) = tabentree(i, 4) 'On écrit le nom du poseur

    'On incremente la ligne de sortie
    ligneSortie = ligneSortie + 1

    End If   

    Next i
Next j

'On colle le tableau de sortie sur la feuille Retard, sur la plage de cellule A1:D et nombre de ligne
ThisWorkbook.Sheets("RETARD ").Range("A1:D" & derlig).Value = tabsortie

'Si jamais le capteur est a true, on reselectionne la feuille retard
If Ws = true then ThisWorkbook.Sheets("RETARD ").Select

'On reactive le rafraichissement de l'écran
Application.screenUpdating = true

End Sub

ça devrait être tout bon maintenant!

Yann

Merci, pour tout. Tu m'a énormément aidé, je m'y connais bien en Excel, mis niveau Macro j'ai beaucoup à apprendre. Mais tu m' as résolu mon problème.

Merci beaucoup.

Lamangaka.

Rechercher des sujets similaires à "extraction donnees"