Demande de macro excel
Julien
-
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
J'aurai besoin de votre aide pour la programmation d'un macro pour Excel:
J'ai une feuille de donnée en plusieurs lignes et colonnes (5colonnes et en moyennes 800 000 lignes) correspondant à des enregistrements médicaux.
A: temps / B: Réponse électrodermal / C : interval R-R du rythme cardiaque / D : stimulation / E : marqueur d'évènement
.
La feuille contenant ces données s'appelle "AED-RAW"
.
Je dois reprendre les données à partir des 150 marqueurs d'évènement, et les filtrer selon différente condition:
.
J'ai 3marqueurs différents dans ma colonne E : "#* trigger" ; "#1 Lat" ; "#1 Pic"
.
Je dois reprendre, dans un premier temps, pour chaque trigger la différence de temps entre la ligne comprenant #1 Lat" et la ligne comprennant "#* Trigger" :
Par exemple: si #* trigger = E33 et #1 Lat = E158; je dois effectué le calcul suivant =A158-A33 (le temps étant en colonne A)
.
Dans un deuxième temps, je dois prendre la différence de réponse électrodermale entre #1 Pic et #1 Lat ; Par exemple si #1 Lat = E158 et #1 Pic = E202; je dois effectué le calcul suivant =B202-B158.
.
Dans un troisième temps, je dois "filtrer" mes données : Si la valeur du premier calcul est supérieur à 4, ou inférieur à 1, la réponse électrodermal associé doit être = 0 et la case de temps doit rester vide dans le tableau correspondant au résultat.
.
Par ailleurs, les marqueur "#1 Lat" et "#1 Pic" ne sont pas toujours présents (contrairement à #* trigger); dans ce cas de figure le temps doit être une case vide, et la réponse électrodermal = 0
.
Ces données doivent être insérer dans une autre feuille de calcul appeler "AED-DATA" avec la première valeur de latence en P1 et la première valeur de réponse en Q1
(La seconde en P2 et Q2, etc...)
.
Je tente depuis le début d'année à apprendre le coding d'une macro, mais je n'arrive toujours pas à créer celle-ci...
.
De grâce, j'implore votre aide. (J'ai environ 200 tableur excel de ce genre, et ce préprocessing me prend environ une demi journée par feuille...)
.
Merci d'avance !
.
(Ci-joint, un exemple de classeur, en format .txt mais ouvrable avec excel: http://d01.megashares.com/dl/CJzw2hM/H01-AED-OK.txt )
J'aurai besoin de votre aide pour la programmation d'un macro pour Excel:
J'ai une feuille de donnée en plusieurs lignes et colonnes (5colonnes et en moyennes 800 000 lignes) correspondant à des enregistrements médicaux.
A: temps / B: Réponse électrodermal / C : interval R-R du rythme cardiaque / D : stimulation / E : marqueur d'évènement
.
La feuille contenant ces données s'appelle "AED-RAW"
.
Je dois reprendre les données à partir des 150 marqueurs d'évènement, et les filtrer selon différente condition:
.
J'ai 3marqueurs différents dans ma colonne E : "#* trigger" ; "#1 Lat" ; "#1 Pic"
.
Je dois reprendre, dans un premier temps, pour chaque trigger la différence de temps entre la ligne comprenant #1 Lat" et la ligne comprennant "#* Trigger" :
Par exemple: si #* trigger = E33 et #1 Lat = E158; je dois effectué le calcul suivant =A158-A33 (le temps étant en colonne A)
.
Dans un deuxième temps, je dois prendre la différence de réponse électrodermale entre #1 Pic et #1 Lat ; Par exemple si #1 Lat = E158 et #1 Pic = E202; je dois effectué le calcul suivant =B202-B158.
.
Dans un troisième temps, je dois "filtrer" mes données : Si la valeur du premier calcul est supérieur à 4, ou inférieur à 1, la réponse électrodermal associé doit être = 0 et la case de temps doit rester vide dans le tableau correspondant au résultat.
.
Par ailleurs, les marqueur "#1 Lat" et "#1 Pic" ne sont pas toujours présents (contrairement à #* trigger); dans ce cas de figure le temps doit être une case vide, et la réponse électrodermal = 0
.
Ces données doivent être insérer dans une autre feuille de calcul appeler "AED-DATA" avec la première valeur de latence en P1 et la première valeur de réponse en Q1
(La seconde en P2 et Q2, etc...)
.
Je tente depuis le début d'année à apprendre le coding d'une macro, mais je n'arrive toujours pas à créer celle-ci...
.
De grâce, j'implore votre aide. (J'ai environ 200 tableur excel de ce genre, et ce préprocessing me prend environ une demi journée par feuille...)
.
Merci d'avance !
.
(Ci-joint, un exemple de classeur, en format .txt mais ouvrable avec excel: http://d01.megashares.com/dl/CJzw2hM/H01-AED-OK.txt )
4 réponses
-
Salut,
Je n'arrive pas à accéder à ton fichier sur Megashare :Link Information: All download slots for this link are currently filled. Please try again momentarily.
Peux tu passer par https://www.cjoint.com/ par exemple?
Attention toutefois, ne présente pas un fichier de 800 000 lignes... Je penses qu'avec 25 - 30 000 nous en aurons assez... -
Salut,
Désolé, je ne peux pas ouvrir les fichiers .xlsx...
Merci d'enregistrer sous / type de fichier : Classeur Excel 97-2003...
-
Salut,
Juste pour info, je suis toujours là...
J'ai regard&é d'un peu plus près ce que tu nous as transmis.
Je relève une incohérence; est elle récurrente?
En fait, colonne E tu as deux "orthographes" différentes pour #1 Pic :
"#1 Pic "
ou
"#1 Pic"
La différence réside dans l'espace en fin de chaine de caractères.
Si c'est récurrent, la macro sera sensiblement différente, donc merci d'éclaicir ce point...
Pour que cela soit plu aisé à vérifier, utilise cette procédure :
Regroupe toutes les données de la colonne E, les unes après les autres, dans la colonne F :Sub test() Dim T_In, T_Out(), Lig As Long, Cpt As Long With Sheets("AED-RAW") T_In = .Range("A6", .Range("E" & Rows.Count).End(xlUp)) For Lig = LBound(T_In, 1) To UBound(T_In, 1) If T_In(Lig, 5) <> "" Then ReDim Preserve T_Out(Cpt) T_Out(Cpt) = T_In(Lig, 5) Cpt = Cpt + 1 End If Next .[F2].Resize(UBound(T_Out, 1), 1) = Application.Transpose(T_Out) End With End Sub -
Mais j'y pense, ce genre de macro ne te simplifierait-il pas la tâche?
Regroupe toutes les données de la colonne E, les unes après les autres, dans la colonne F et en colonne G les cellules correspondantes de la colonne A :
Dim T_In, T_Out(), Lig As Long, Cpt As Long With Sheets("AED-RAW") T_In = .Range("A6", .Range("E" & Rows.Count).End(xlUp)) For Lig = LBound(T_In, 1) To UBound(T_In, 1) If T_In(Lig, 5) <> "" Then ReDim Preserve T_Out(1, Cpt) T_Out(0, Cpt) = T_In(Lig, 5) T_Out(1, Cpt) = T_In(Lig, 1) Cpt = Cpt + 1 End If Next .[F2].Resize(UBound(T_Out, 2), 2) = Application.Transpose(T_Out) End With