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.
Par exemple, pour l'année 2003 (colonne AR) j'ai:

"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 !

Rechercher des sujets similaires à "macro condition multiple grosse base donnees"