Macro de condition multiple grosse base de données
Bonjour,
j'ai essayé de chercher ma réponse sur d'autres topics mais je n'ai pas trouvé (ou assez cherché).
Alors je suis tout nouveau en terme de macro. Je traite de gros fichiers excels et avant je pouvais le faire "manuellement" mais là, j'aurais bien besoin d'automatiser...
En fait, j'utilise des fonctions "SI", au moins 6 par cellules et je me disais que faire ca sous forme de macro pourrait rendre cela plus simple.
Dans mon fichier (données de baguage d'oiseaux),mes données sont classées en ligne (1 ligne par individu).
J'ai une colonne pour l'année de baguage (colonne D), une colonne pour l'année de recapture (T), une colonne pour la date de retour (AP) et différentes cellules qui me permettent d'avoir des dates de références (pour AP)
J'ai ensuite une colonne par année (2002 = AQ; 2003 = AR; .... AX = 2009) pour des occasions de recapture (la ligne 1 contient les années en question).
Je souhaite entrer un code dans la cellule de chaque année de recapture correspondant à l'individu.
le code est:
- 0 si l'année de baguage est différente de l'année de recapture
- 1 si l'année de baguage est celle de l'année de recapture
- 6 si la date de retour (AP) est comprise entre les bornes supérieures et inférieures de dates acceptés pour l'année.
"AR2" =SI(D2=2003;1;SI(AP2>$BA$2;SI(T2=2003;1;0);SI(AP2>$BA$10;6;SI(T2=2003;1;0))))
où D2= année de baguage de mon oiseau
AP2 = date de retour de l'oiseau
$BA$2 = borne supérieure pour l'année 2003
$BA$10 = borne inférieure pour l'année 2003
T2 = année de capture
J'incrémente tout ca pour mes 12501 lignes et ensuite, je passe à l'année 2004 avec changement des 2003 en 2004 et des bornes correspondantes.
J'aimerais arriver à coder déjà une telle situation car ensuite, j'aimerais rajouter des conditions pour complexifier le code (non plus 0/1/6 mais 0/1/2/3/4/5/6).
J'aimerais pouvoir utiliser un code du type:
For each <cellule> de (AQ2 à AQ 12501) (déjà avoir un code pour une seule année m'aiderait à continuer seul)
If <année_baguage>=<cellule année occasion> Then
<cellule>= 1
Else
If ...
et ainsi de suite
Merci beaucoup, surtout si vous avez compris ! ^^
ps: je ne sais pas si un fichier vous aiderait à comprendre la logique du codage mais n'hésitez pas à demander
Salut le forum
Bienvenue Guillaume_QC_Mtplier comme nouveau membres.
Un fichier exemple avec une dizaine de lignes suffit pour voir la disposition des données.
Tu peux utiliser Joindre un fichier
Et de nous donner tes conditions pour le traitement.
A te relire
Mytå (Aussi du Québec)
Bonjour,
tu peux essayer ça :
Sub test()
For i = 2 To 12501
If Range("D" & i) = 2003 Then
Range("AR" & i) = 1
Else
If Range("AP" & i) > Range("BA2") Then
Range("AR" & i) = IIf(Range("T" & i) = 2003, 1, 0)
Else
If Range("AP" & i) > Range("BA10") Then
Range("AR" & i) = 6
Else
Range("AR" & i) = IIf(Range("T" & i) = 2003, 1, 0)
End If
End If
Next
End Sub
A+
Bonjour et merci
voici un fichier exemple:
https://www.excel-pratique.com/~files/doc2/classeur_exple.xls
des commentaires expliques chaque colonne et moi j'ai juste créé les colonnes 2002 à 2009 et date de retour. Pour ceux qui connaissent, c'est pour créer des histoires de vie et utiliser ces données dans des analyses de Capture-marquage-recapture.
Quand un individu est bagué, on le code "1" et ensuite, on a des "occasions" de recapture par année (d'où les colonnes "200x") et soit il est capturé code 1, soit il est retrouvé mort code 6, soit on ne sait pas et alors code 0 pour l'occasion en question.
Merci à Galopin, j'ai essayé ton code, il a juste fallu rajouter un "End If" manquant mais ca marche maintenant.
La technique du "i" pour désigner la ligne est vraiment pratique, c'est surtout ce problème que je ne voyais pas comment régler.
Maintenant que j'ai compris la technique je vais pouvoir "m'amuser" à aller un peu plus loin dans le code.
Merci pour votre rapidité !!
@ Myta: où dans le Québec? ^_^
Re Bonjour/Bonsoir tout le monde
Suite à différents essais voici mon code final (il marche):
Sub macro2005()
For i = 2 To 12501
If Range("D" & i) = 2005 Then 'regarder si l'occasion correspond à l'année de baguage
If Range("H" & i) = 0 Then 'sexe déterminé ou non
Range("AT" & i) = 3 'code "marqué et sexe inconnu" = 3
Else
If Range("H" & i) = 4 Then ' sexe détérminé male ou non
Range("AT" & i) = 1 'code "marqué comme male" = 1
Else
If Range("H" & i) = 5 Then 'sexe déterminé femelle ou non
Range("AT" & i) = 2 'code "marqué comme femelle = 2
End If
End If
End If
End If
If Range("D" & i) <> 2005 Then 'si l'occasion ne correspond pas au baguage de 2005
If Range("T" & i) = 2005 Then 'si l'ind a été capture en 2005
Range("AT" & i) = IIf(Range("AA" & i) = 4, 4, 5) 'code "recapturé, sexé male" = 4 ou code "recapturé, sexé femelle" = 5
Else
If Range("AP" & i) > Range("BA4") Then 'si date retour de bague > limite supérieur retour bague
Range("AT" & i) = 0 'date retour supérieur date limite sup => retour de bague postérieur à l'occasion
Else
If Range("AP" & i) > Range("AZ4") Then 'si date de retour > limite inf de retour de bague
Range("AT" & i) = 6 '=> limite inf < date retour bague <= limite sup, retour de bague avant l'occasion donc code "retrouvé mort" = 6
Else
Range("AT" & i) = 0 'date de retour avant limite inf, donc déjà codifié 6 avant
End If
End If
End If
End If
Next
End Sub
Et vu que j'ai plusieurs années, j'ai juste à modifier les éléments qui changent pour tout ajuster mais ca prend peu de temps !