Sélection d'une colonne en fonction de 2 critères
Bonjour à toutes et à tous.
J'ai besoin de connaitre l'adresse d'une colonne en fonction de 2 critères. Un dans la ligne 3 (valeur = invoice) et l'autre dans la ligne 12 (valeur 0)
Il faut que j'ai le no la première colonne qui a ces 2 critères.
Dans le fichier joint, ca donnerait normalement la colonne N.
Je ne sais pas trop par ou commencer.
J'ai besoin de ce no de colonne pour appliquer une formule sur l'ensemble de la colonne.
targetRange.Formula = "=IFERROR(INDEX(BS!$A$1:$ZZ$999,MATCH($A5,BS!$A$1:$A$999,0),14),"""")".
La fonction est déjà fonctionelle. Il ne me manque que l'adresse de la colonne.
Merci de votre support
Bonjour,
Voici une proposition utilisant une nouvelle procédure que j'ai codé pour l'occasion:
La macro s'appelle "copierValeur"
A noter que cette méthode n'utilise pas de formule et va inscrire des infos uniquement si une correspondance est trouvée pour le numéro.
Pour trouver la colonne j'ai plusieurs infos:
- ligne pour le premier critère (invoice)
- ligne pour le second critère (total = 0)
- dernière colonne contenant une info (colFin)
Ensuite plus qu'à faire une boucle pour chercher la première colonne où le critère est respecté.
Sinon voici une formule qui fait également le travail:
=MIN(SI((A3:O3="invoice")*(A12:O12=0);COLONNE(A3:O3);""))
Bonjour Ausecour.
MErci beaucoup.
Ouf. tu es vraiment un pro.
J'ai quelques questions pour vous si vous avez le temps :)
Dim ligFin As Integer, ligCrit1 As Integer, ligCrit2 As Integer, colDep As Integer, colFin As Integer, nbLig As Integer, _
ligDepBS As Integer, ligFinBS As Integer, colInfoBS As Integer, ligBS As Integer
Dim FeuilleWBS As Worksheet, FeuilleBS As Worksheet
'initialisations
Set FeuilleWBS = Sheets("WBS")
Set FeuilleBS = Sheets("Billing_Summary")
ligCrit1 = 3 'Donc la ligne ou il y a inscrit invoice ** est-ce que je peux choisir un début de valeur. Comme un like Invoiced%
ligDepBS = 4 ' Ligne ou il y aurait la valeur 0
colInfoBS = 14 'Définition de la colonne 18 pour les données de invoice
'calcul valeurs depuis feuille WBS
FeuilleWBS.Select
ligFin = Range("A" & Rows.Count).End(xlUp).Row
ligCrit2 = ligFin + 1
colFin = Cells(ligCrit1, Columns.Count).End(xlToLeft).Column
'recherche colonne répondant aux 2 critères
For col = 1 To colFin
'invoice et total = 0
If Cells(ligCrit1, col) = "Invoiced" And Cells(ligCrit2, col) = 0 Then
'boucle sur les lignes où il faut copier les valeurs
For lig = ligCrit1 + 2 To ligFin
'enregistrement du numéro pour correspondance
num = Range("A" & lig)
'recherche numéro dans feuille BS
With FeuilleBS
'calcul valeurs depuis feuille BS
ligFinBS = .Range("A" & Rows.Count).End(xlUp).Row
'recherche numéro sur la première colonne
For ligBS = ligDepBS To ligFinBS
If .Cells(ligBS, 1) = num Then
Cells(lig, col) = .Cells(ligBS, colInfoBS) 'écriture de l'info en colonne 14 si correspondance
Exit For 'fin de recherche
End If
Next ligBS
End With
Next lig
Exit For 'fin de recherche
End If
Next col
End Subsinon je crois que j'ai pigé :)
Je retire beaucoup d'apprentissage de ce forum
Merci encore
Bonjour,
Je vais tenter de répondre aux questions:
ligCrit1 est bien la ligne qui va contenir les "invoiced", il n'y a pas vraiment besoin de mettre de "début de valeur", le programme va faire le tour de toutes les colonnes du tableau et regarder si la ligne 3 a invoice, et si la ligne de total a bien 0.
ligDepBS fait référence à la ligne de départ dans le tableau de la feuille BS, celle où on va chercher les résultats nets pour les copier dans la feuille WBS, j'ai préféré mettre une variable pour changer ça facilement si pour une raison quelconque la première ligne à contenir des numéros devient la 5.
colInfosBS fait référence à la colonne dans la feuille BS dans laquelle on veut aller chercher les infos pour un numéro donné. Dans la feuille BS il s'agit de la colonne 14
La ligne des totaux est ligCrit2, je lui donne une valeur qui dépend de la dernière ligne où il y a un numéro en colonne A, feuille WBS, je pars du principe que la ligne des totaux est pile après, donc ligFin + 1
Il n'y a pas de colonne de départ à proprement parler pour chercher le "invoice" en ligne 3, je fais une boucle de la première colonne du tableau à la dernière en utilisant colFin. Pour colFin, je récupère le numéro de la dernière colonne avec une info en ligne 3.
J'espère que c'est déjà plus clair, j'avoue que je me suis lancé sur la nouvelle macro sans tout lire au départ... J'ai vu le passage comme quoi le code actuel fonctionnait déjà bien et qu'il manquait juste une info pour tout faire au moment de poster ma réponse, oups.
Wow.
Merci beaucoup.
J'ai une question pour toi.
Est-ce qu'il est possible dans la ligne de code où j'indique que la cellule doit avoir la valeur "Invoiced" que la valeur commence par invoiced mais qu'elle puisse avoir une fin différente.
Exemple:
Invoiced_september2023
Invoiced_October2023
Invoiced_jusqu'à la fin des temps !
Merci beaucoup de votre support
If Cells(ligCrit1, col) = "Invoiced" And Cells(ligCrit2, col) = 0 Then 'Valeur avec comme début invoiced mais avec une fin qui peut être différenteBonjour,
Oui bien sûr, il suffit d'utiliser le mot clé Like:
If Cells(ligCrit1, col) Like "Invoiced*" And Cells(ligCrit2, col) = 0 Then 'Valeur avec comme début invoiced mais avec une fin qui peut être différentePour également se débarrasser du problème des majuscules, on peut écrire:
If LCase(Cells(ligCrit1, col)) Like "invoiced*" And Cells(ligCrit2, col) = 0 Then 'Valeur avec comme début invoiced mais avec une fin qui peut être différenteLCase convertit tout le texte en minuscule, comme ça majuscules et minuscules sont traitées de la même façon, on peut dire que la comparaison n'est pas sensible à la case.
Like permet de dire "commence par invoiced" en combinant Like et le joker * qui correspond à "n'importe quelle chaîne de caractère". En gros, tant que ton texte ressemble à invoiced avec n'importe quoi après, ça passe.
Le site a un cours sur l'opérateur Like: