Extraction de données avec condition
Bonjour,
suite a plusieurs recherche infructueuse, je vous expose mon problème:
j'ai un excel qui possède deux onglet, le premier est ma base de retour de pièce et le second le formulaire qui doit se remplir selon certaines condition, c'est pas la partie la plus facile
je saisi la plage de retour de pièce qui m’intéresse (reclamation) et lorsque j'appuie sur le bouton, la macro dois rechercher toutes les pièces qui ont pu être enregistrer dans cette plage de valeur (L AK) et leur quantités sans prendre en compte les retour avec la valeur 0.
j'ai essayer de partir sur les formule de boucle et condition mais sans succès jusqu’à présent, si les informations étés sur la même colonne cela aurait été plus simple.
Avez-vous une idée de l'orientation que je dois prendre ?
Bonjour Gibox, bonjour le forum,
En pièce jointe ton fichier modifié avec le code ci-dessous :
Sub Bouton1_Cliquer()
Dim B As Worksheet 'déclare la variable B (onglet "Base_retour")
Dim E As Worksheet 'déclare la variable E (onglet "Envoie")
Dim TV As Variant 'déclare la variable TV (Tableau ds Valeurs)
Dim R1 As Integer 'déclare la variable R1 (Réclamation 1)
Dim R2 As Integer 'déclare la variable R2 (Réclamation 2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des lignes)
Set B = Worksheets("Base_retour") 'définit l'onglet B
Set E = Worksheets("Envoie") 'définit l'onglet E
E.Range("B8:C" & E.Range("C" & Application.Rows.Count).End(xlUp).Row).ClearContents 'efface d'eventuelle anciennes données
R1 = E.Range("D4").Value 'définit la réclamation 1
R2 = E.Range("D5").Value 'définit la réclamation 2
TV = B.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
K = 1 'initialise la variable K
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If TV(I, 10) >= R1 And TV(I, 10) <= R2 Then 'condition 1 : si la donnée ligne I colonne 10 (=> colonne J) de TV est comprise entre R1 et R2
For J = 12 To 36 Step 2 'boucle 2 : des colonne 12 (=> colonne L) à 36 (=> colonne AJ) par pas de deux
If TV(I, J + 1) > 0 Then 'condition 2 : si la donnée ligne I colonne J+1 est supérieure à zéro
ReDim Preserve TL(1 To 2, 1 To K) 'redimensionne le tableau des lignes TL (2 lignes, K colonnes)
TL(1, K) = TV(I, J) 'stocke dans la première ligne de TL la pièce en ligne I colonne J de TV
TL(2, K) = TV(I, J + 1) 'stocke dans la seconde ligne de TL ligne la quantité en ligne I colonne J+1 de TV
K = K + 1 'incrémente K (ajoute une colonne au tableau TL)
End If 'fin de la condition 2
Next J 'prochaine colonne de la boucle 2
End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle1
'si K est supérieure à un (au moins une occurrence trouvée) renvoie dans la cellule B8 redimensionnée le tableau TL transposé
If K > 1 Then E.Range("B8").Resize(UBound(TL, 2), 2).Value = Application.Transpose(TL)
End SubLe fichier :
bonjour,
Hum... quand même il faut dire : Faut être un peu maso :
Rien ne justifie de monter la "base de retour" de cette manière. C'est méconnaître les possibilités et le mode de fonctionnement d'Excel.
Pour une réclamation (même numéro) si vous en avez la possibilité vous devriez créer autant de lignes que de produit en retour :
Tous les produits en colonne L et les quantités en colonne M.
Vous pouvez supprimer toutes les colonnes suivantes.
Personnellement j'organiserai le truc comme en pièce jointe : Pas besoin de macro. Le filtre automatique dans la BD ou un TCD dans la Feuille2 font le boulot...
A+
Je vous remercie pour vos réponses, la solution de ThauThème ce rapproche le plus de ce que je recherche, je vais enfin pouvoir avancer sur une base clair. Ta réponse galopin01 va pouvoir m'aider sur un autre dossier.