Recherche multiple dans tableau à 2 dimensions

macadamx

XLDnaute Junior
Bonjour à tous !

J'ai besoin de votre aide ! Je n'arrive pas à solutionner mon problème depuis 1 semaine.
J'ai cherché partout sur Internet je ne trouve pas la solution.


Alors, J'ai un tableau à 2 dimensions, et je voudrais en extraire les données.
Normalement, on fait une boucle sur la colonne et on déclare la donnée à récupérer avec un activecell.offset.
Mon problème est que le tableau peut être amené à être modifié.
Donc il faudrait faire plusieurs boucles imbriquées avec je pense un cells.find, mais je n'arrive pas à bien tourner ma formule pour que cela fonctionne.
Je pensais récupérer éventuellement les coordonnées de la cellule active pour la transposer dans la seconde boucle...

Concrètement, j'ai une recherche parmis les étiquettes
AAA, BBB, CCC, DDD, EEE
Disons que je recherche 111 dans la colonne AAA (111 serait les lignes), je veux ensuite que ma formule aille récupérer la donnée contenue dans la même ligne de la colonne DDD.

Comment puis je faire ceci ?

Par avance, merci de votre aide, même un début de code m'aiderais à débloquer cette situation.
 

pierrejean

XLDnaute Barbatruc
Re : Recherche multiple dans tableau à 2 dimensions

Bonjour macadamx

Pour débloquer il serait utile de poster un fichier exemple concrétisant ton problème (sans données confidentielles et comportant toutes indications relatives aux diverses possibilités)
 

macadamx

XLDnaute Junior
Re : Recherche multiple dans tableau à 2 dimensions

Bonjour PierreJean,

Merci de votre réponse, je vous joint donc mon TCD.
Comme vous pouvez le voir, il y a une colonne "budget" qui est soubdivisée en deux type "DIR" et "DT".
Faire une boucle pour rechercher si c'est DT ou DIR je sais faire, par contre, aller chercher la somme correspondant à la colonne Total en ne passant pas par un activecell.offset mais un cell.find ou autre solution, je ne sais pas faire.

Comment feriez vous ?

J'ai commencé à écrire ceci :
Sub analyse_tcd_chorus()

Dir_chorus = 0
DT_chorus = 0

Range("A1").Select

Cells.Find(What:="Budget", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
ActiveCell.EntireColumn.Select

Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select

addresse = ActiveCell.Address

If ActiveCell.Value = "DIR" Then
Cells.Find(What:="Total", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
ActiveCell.EntireColumn.Select

End Sub

Merci de votre réponse.

Johan
 

Pièces jointes

  • TCD (2).zip
    42.4 KB · Affichages: 40

macadamx

XLDnaute Junior
Re : Recherche multiple dans tableau à 2 dimensions

J'ai tenté de modifier un peu mon code mais ça ne fonctionne pas :

Sub analyse_tcd_chorus()

Dir_chorus = 0
DT_chorus = 0
adresse = ActiveCell.Address

Range("A1").Select

Cells.Find(What:="Budget", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate


Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select

If ActiveCell.Value = "DIR" Then
Cells.Find(What:="Total", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate


adresse = Rows.Select
MsgBox ActiveCell.Value
ActiveCell.Offset(1, 0).Select
MsgBox ActiveCell.Value
End If

Loop

End Sub
 

macadamx

XLDnaute Junior
Re : Recherche multiple dans tableau à 2 dimensions

Bon j'y suis presque je pense ! ça va bien à la colonne désirée mais ça ne fais qu'un activecell.offset(1,0).select et pas en fonction du DIR :

Sub analyse_tcd_chorus()

Dir_chorus = 0
DT_chorus = 0
adresse = ActiveCell.Address

Range("A1").Select

Cells.Find(What:="Budget", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate


Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select

If ActiveCell.Value = "DIR" Then
Cells.Find(What:="Total", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate


adresse = ActiveCell.Rows.Select
MsgBox ActiveCell.Value

End If
MsgBox ActiveCell.Value


Loop

End Sub


Des idées ?
 

pierrejean

XLDnaute Barbatruc
Re : Recherche multiple dans tableau à 2 dimensions

Re

Vu le TCD
Pas compris quelle recherche tu souhaites
Peux-tu fournir un exemple concret genre
Disons que je recherche 111 dans la colonne AAA (111 serait les lignes), je veux ensuite que ma formule aille récupérer la donnée contenue dans la même ligne de la colonne DDD.
Appliqué au fichier
 

macadamx

XLDnaute Junior
Re : Recherche multiple dans tableau à 2 dimensions

Re
Comme vous pouvez le voir, il y a une colonne "budget" qui est subdivisée en deux type "DIR" et "DT".
Faire une boucle pour rechercher si c'est DT ou DIR je sais faire, par contre, aller chercher la somme correspondant à la colonne Total en ne passant pas par un activecell.offset mais un cell.find ou autre solution, je ne sais pas faire.
 

macadamx

XLDnaute Junior
Re : Recherche multiple dans tableau à 2 dimensions

Bonjour à tous,

sur le site : Les tableaux

J'ai trouvé cela, mais je ne vois pas comment l'adapter à mon cas de figure...

Sub SousTotal()
tabEntree = Range("A2:G" & [a65000].End(xlUp).Row)
Dim TabResult()
ReDim TabResult(1 To UBound(tabEntree), 1 To UBound(tabEntree, 2))
LigTabEntree = 1
LigTabResult = 1
Do While LigTabEntree < UBound(tabEntree)
tmp = tabEntree(LigTabEntree, 1)
TabResult(LigTabResult, 1) = tmp
Do While tabEntree(LigTabEntree, 1) = tmp
For k = 2 To UBound(tabEntree, 2)
TabResult(LigTabResult, k) = TabResult(LigTabResult, k) + tabEntree(LigTabEntree, k)
Next k
LigTabEntree = LigTabEntree + 1: If LigTabEntree > UBound(tabEntree) Then Exit Do
Loop
LigTabResult = LigTabResult + 1
Loop
[K2].Resize(UBound(TabResult), UBound(TabResult, 2)) = TabResult
End Sub

Qui pourrait me donner un petit coup de pouce s'il vous plaît ? Il ne me manque plus que ça pour finaliser mon fichier...
 

macadamx

XLDnaute Junior
Re : Recherche multiple dans tableau à 2 dimensions

Dans mon tableau, je cherche chaque occurence de DIR.
Si c'est DIR, sans passer par un activecell.offset, je vais chercher la case correspondant à la colonne Total.
Pareil pour DT
Puis ma recherche descend le long des DIR et des DT et enregistre les valeurs pour chacunes d'entre elles.

Est ce plus précis pour ma requête ?
 

macadamx

XLDnaute Junior
Re : Recherche multiple dans tableau à 2 dimensions

Pour ceux que ça intéresse voici le code qu'un ami m'a aidé à développer :

Sub analyse_tcd_chorus()


'Préparation : on crée une sheet qui s'appelle Sauvegarde, dans laquelle on va aller copier la colonne Total qui nous interesse
'Tu peux facilement la mettre en forme comme tu veux au début de ta macro en enregistrant tes actions.


Sheets("donnees").Select
'Je met en memoire la Sheet créée, comme ca je peux l'appeler facilement ensuite :
Set SheetSauvegarde = ThisWorkbook.ActiveSheet
'Ensuite je choisi ou je vais écrire la colonne total. Ici ce sera la cell A1 :
SauvegardeRow = 2
SauvegardeColumn = 20


'on retourne sur la sheet qui nous interesse
Sheets("Montant").Select




Dir= 0
DT= 0
valeurtotaleDT = 0
valeurtotaleDIR = 0

Range("A1").Select


Cells.Find(What:="Budget", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
RowCellBudget = ActiveCell.Row
ColumnCellBudget = ActiveCell.Column


'Maintenant qu'on a la ligne de 'budget', on cherche dans cette ligne la colonne 'total'
ActiveCell.EntireRow.Select
Set MyRg = Selection
'On balaye toutes les cells de la ligne et on regarde si elles contiennent "Total"
For Each c In MyRg:

'Ce qui suit sert pour plus loin, lorsqu'on cherchera DIR. J'ai mis des commentaires plus bas
If c.Value = "CC" Then
ColumnCellCC = c.Column
End If

'la on cherche 'Total'
If c.Value = "Total" Then
'Si on la trouve, on note son numero dans la variable ColumnCellTotal et on quit la boucle
ColumnCellTotal = c.Column
Exit For
End If





Next c


Columns(ColumnCellBudget).Select


ActiveCell.EntireColumn.Select
Set MyRg = Selection
'On balaye toutes les cells de la colonne et on regarde ce qu'elle contiennent
For Each c In MyRg:
If c.Value = "DT" Then
'MsgBox Cells(c.Row, ColumnCellTotal).Value

'Si on trouve "DT" on vient copier directement la valeur dans la case définie par "SauvegardeRow,SauvegardeColumn" de la sheet "SheetSauvegarde".
Cells(c.Row, ColumnCellTotal).Copy (SheetSauvegarde.Cells(SauvegardeRow, SauvegardeColumn))
'Puis on ajoute 1 à SauvegardeRow afin de descendre d'une ligne pour la prochaine copie
SauvegardeRow = SauvegardeRow + 1
valeurtotaleDT = valeurtotaleDT + Cells(c.Row, ColumnCellTotal).Value

ElseIf c.Value = "DIR" Then
'MsgBox Cells(c.Row, ColumnCellTotal).Value

'Si on trouve "DIR" on vient copier directement la valeur dans la case définie par "SauvegardeRow,SauvegardeColumn" de la sheet "SheetSauvegarde".
Cells(c.Row, ColumnCellTotal).Copy (SheetSauvegarde.Cells(SauvegardeRow, SauvegardeColumn))
'Puis on ajoute 1 à SauvegardeRow afin de descendre d'une ligne pour la prochaine copie
SauvegardeRow = SauvegardeRow + 1
valeurtotaleDIR = valeurtotaleDIR + Cells(c.Row, ColumnCellTotal).Value


End If

'La ligne suivante permet de sortir de la boucle For. Car sinon il va faire TOUTES les cells de la colonne B et ca va etre long
'Pour en sortir, il regarde a chaque ligne si la valeur de la cellule dans la colonne ColumnCellCC (ici la colonne 1) est = à "Total" si c'est le cas il sort de la boucle


If Cells(c.Row, ColumnCellCC).Value = "Total" Then Exit For


Next c

Sheets("Suivi budgets").Select
Range("E16").Select
ActiveCell.Value = valeurtotale
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 273
Messages
2 086 701
Membres
103 373
dernier inscrit
Edouard007