Récuperation de donnée, probleme selon le nombre d'occurence
Bonjour le forum,
Je suis sur un import de données pour éviter à mes équipe de nombreuses saisies manuelle.
Je récupère un fichier tsv?( sorte csv) qui s'importe très bien dans Excel ( cf onglet extraction)
La copie des données me semblaient simple (exemple en vert) qui est de récupéré 3 valeurs de l'extraction à copier dans 4 colonnes de l'onglet " résultat". C'est le cas le plus simple le sample id n'apparait qu'une fois dans l'extraction.
Par contre je bloque dans le second cas ( le plus récurrent) cas orange, le sample id à plusieurs occurrence, 3 dans l'exemple données (exemple en orange) mais pouvant varier de 2 à 6 semble t il d'après les équipes techniques.
La difficulté, pour moi est de récupérer dans ce cas le champs Nucleic Acid de la première occurrence correspondant à la colonne "Concentration Nanodrop", puis à la dernière occurrence récupérer le champs Nucleic Acid correspondant à la concentration( onglet résultat) final et les ratios de cette même occurrence. voilà si vous avez un idée pour faire çà je nage dans le flou.
J'espère que mes explications seront plus claires avec le fichier joint.
Si vous avez une idée pour récupérer et coller l'ensemble des données en une fois je suis preneur.
Merci à vous pour vos idées ou solutions.
Bonjour Edlede, bonjour le forum,
Je n'ai plus le temps de finaliser mais je pense avoir trouver une solution. Si personne ne t'a proposé de réponse, je t'enverrai ça ce soir...
Bonjour à tous,
Bonjour ThauThème,
En transformant votre fichier en .xlsm, et en transformant votre tableau dans l'onglet Extraction en tableau structuré, la fonction ci-dessous correspond à ce que vous demandez.
Attention : Les champs avec retour chariot dans votre tableau structuré ne sont pas adaptés. J'ai éliminé le retour chariot dans le titre du champ de la colonne H.
Function VExtraction(ByVal AireExtraction As Range, ByVal SampleId As String, ByVal TypeExtraction As String) As Variant
Dim NucleidTrouve As Boolean
Dim ValeurNucleid As Double, Valeur260280 As Double, Valeur260230 As Double
Dim I As Integer
Dim AireSample As Range, AireNucleid As Range, Aire260280 As Range, Aire260230 As Range
ValeurNucleid = 0: Valeur260280 = 0: Valeur260230 = 0
With AireExtraction
Set AireSample = .Columns(2).Cells
Set AireNucleid = .Columns(5).Cells
Set Aire260280 = .Columns(9).Cells
Set Aire260230 = .Columns(10).Cells
End With
NucleidTrouve = False
For I = 1 To AireSample.Count
With AireSample(I)
If CStr(.Value) = SampleId Then
Debug.Print AireSample(I)
If NucleidTrouve = False Then
ValeurNucleid = AireNucleid(I)
NucleidTrouve = True
End If
Valeur260280 = Aire260280(I)
Valeur260230 = Aire260230(I)
End If
End With
Next I
Select Case TypeExtraction
Case "Nucleid"
VExtraction = ValeurNucleid
Case "260/280"
VExtraction = Valeur260280
Case "260/230"
VExtraction = Valeur260230
End Select
Set AireSample = Nothing: Set Aire260280 = Nothing: Set Aire260230 = Nothing
End Function
![capture](https://forum.excel-pratique.com/file/img/1/95860_61ffc6a747812026776901.jpg)
Les formules en place en ligne 24 ne sont là que pour essai. En revanche, si vous mettez en place les formules sur toutes les lignes existantes du Tableau441, vous allez perdre des données car cela ne matche pas forcément avec votre onglet Extraction.
Les formules sont en place sur les lignes 31 et 44 de vos exemples.
Bonjour Eric Kergresse,
Bonjour Thau Thème,
Merci pour avoir pris le temps de me lire, et d'avoir proposé une solution,
en transformant votre tableau dans l'onglet Extraction en tableau structuré,
Je vais voir ce que je peux faire, mais vu que je fais l'import depuis un type fichier genre csv, qui n'as pas vocation à être stocker dans le fichier,
si je comprends bien tu appelles la fonction depuis une formule, donc si je supprime l'onglet extraction en fin de code de manipulation je vais perdre toutes les données récupérer ??
L'import du "csv" va se faire pour chaque techniques, on génère plusieurs onglets type "résultat" par semaine
Merci pour vos retours
Ce n'est pas nécessaire de transformer le tableau, il suffit de définir l'aire du tableau dans la fonction.
En ce qui concerne la suite, il ne faut pas utiliser directement la fonction directement sur les lignes du tableau, sinon vous allez perdre les données. Il faut créer une boucle sur la colonne H et utiliser la fonction pour mettre à jour les 3 cellules si la référence est trouvée dans le tableau csv.
Donc une boucle en VBA, ce que tu appelles l air du tableau correspond au range des.valeue de la feuille d extraction ?
et donc je lance un boucle en VBA qui passe sur la colonne h et qui lance la fonction sur chaque ligne ?
je sens que je vais revenir souvent 😆
Le code pourrait être celui-là :
Sub MajValeursAPartirDuCsv()
Dim I As Integer, J As Integer
Dim AireIdentifiant As Range, AireNonatrop As Range, AireRapport260280 As Range, AireRapport260230 As Range
Dim AireCsv As Range, AireSample As Range
Set AireIdentifiant = Range("Tableau441[Identifiant / N° Glims]")
Set AireNonatrop = Range("Tableau441[Concentration Nanodrop]")
Set AireRapport260280 = Range("Tableau441[Rapport A260/A280]")
Set AireRapport260230 = Range("Tableau441[Rapport A260/A230]")
AireIdentifiant.Interior.ColorIndex = xlNone
AireNonatrop.Interior.ColorIndex = xlNone
AireRapport260280.Interior.ColorIndex = xlNone
AireRapport260230.Interior.ColorIndex = xlNone
With Sheets("Extraction")
Set AireCsv = .Range("A1").CurrentRegion
Set AireSample = AireCsv.Columns(2).Cells
End With
For I = 1 To AireIdentifiant.Count
For J = 1 To AireSample.Count
If CStr(AireIdentifiant(I)) = CStr(AireSample(J)) Then
AireIdentifiant(I).Interior.Color = RGB(255, 255, 0)
With AireNonatrop(I)
.Value = VExtraction(AireCsv, AireIdentifiant(I), "Nucleid")
.Interior.Color = RGB(255, 255, 0)
End With
With AireRapport260280(I)
.Value = VExtraction(AireCsv, AireIdentifiant(I), "260/280")
.Interior.Color = RGB(255, 255, 0)
End With
With AireRapport260230(I)
.Value = VExtraction(AireCsv, AireIdentifiant(I), "260/230")
.Interior.Color = RGB(255, 255, 0)
End With
End If
Next J
Next I
MsgBox "Fin de traitement !", vbInformation
Set AireIdentifiant = Nothing: Set AireNonatrop = Nothing: Set AireRapport260280 = Nothing: Set AireRapport260230 = Nothing
Set AireCsv = Nothing: Set AireSample = Nothing
End Sub
Dans le fichier, le code se lance avec le dernier bouton de la barre d'accès rapide.
Bonjour edlede, bonjour le fil,
Ci-joint une proposition de formule avec la fonction SOMMEPROD (sans vba).
La formule test a été saisie sur la ligne 46 de la feuille résultat (en noir).
A noter : dans la feuille résultat, l'identifiant / N° Glims est au format texte, et dans la feuille extraction, la même référence est en valeur numérique. D'où l'utilisation de la fonction CNUM dans la formule pour convertir le texte en valeur numérique.
La fin de la formule MIN... et MAX... détermine l'heure minimale et maximale correspondant à un sample ID.
Bonsoir le fil, bonsoir le forum,
Certainement inutile mais j'envoie quand même le code ci-dessous :
Option Explicit
Sub Macro1()
Dim E As Worksheet 'déclare la variable E (onglet Extraction)
Dim R As Worksheet 'déclare la variable R (onglet Resultat)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim J As Integer 'déclare la variable I (Incrément)
Dim I As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim L As Integer 'déclare la variable L (incrément)
Dim NO As Byte 'déclare la variable NO (Nombre d'Occurrences)
Set E = Worksheets("Extraction ") 'définit l'onglet E
Set R = Worksheets("resultat") 'définit l'onglet R
Set TS = R.ListObjects(1) 'définit le tableau structuré TS
Set PL = E.Range("A1").CurrentRegion 'définit la plage PL
TV = PL 'définit le tableau des valeurs TV
For I = 1 To TS.DataBodyRange.Rows.Count 'boucle 1 : sur toutes les lignes I des données du tableau structuré TS (Résultat)
For J = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs TV (en partant de la seconde)(Extraction)
'condition 1 : si la donnée ligne J colonne 2 de TV (convertie en texte) est égale à l'identifiant en colonne 7 de TS
If CStr(TV(J, 2)) = TS.DataBodyRange(I, 7) Then
K = 0 'réinitialise la variable K
'définit le nombre NO d'occurrences de l'identifiant TV(J,2) dans la la colonne 2 de la plage PL
NO = Application.WorksheetFunction.CountIf(PL.Columns(2), TV(J, 2))
If NO > 1 Then 'condition 2 : si le nombre NO est supérieur à 1
For L = 2 To UBound(TV, 1) 'boucle 3 : sur toutes les lignes L du tableau des valeurs TV (en partant de la seconde) (Extraction)
'condition 3 : si la donnée ligne L colonne 2 de TV (convertie en texte) est égale la donnée ligne J colonne 2 de TV
If CStr(TV(L, 2)) = TV(J, 2) Then
K = K + 1 'incrémente K
Select Case K 'agit en fonction de K
Case 1 'si K vaut 1
'récupère dans la ligne de l'identifiant en colonne 12 la donnée ligne L colonne 5 de TV
TS.DataBodyRange(I, 12) = TV(L, 5)
Case NO 'si K est egale au nombre d'occurrences trouvées NO
'récupère dans la ligne de l'identifiant en colonne 17 la donnée ligne L colonne 5 de TV
TS.DataBodyRange(I, 17) = TV(L, 5)
'récupère dans la ligne de l'identifiant en colonne 18 la donnée ligne L colonne 9 de TV
TS.DataBodyRange(I, 18) = TV(L, 9)
'récupère dans la ligne de l'identifiant en colonne 19 la donnée ligne L colonne 10 de TV
TS.DataBodyRange(I, 19) = TV(L, 10)
End Select 'fin de l'action en fonction de K
End If 'fin de la condition 3
Next L 'prochaine ligne de la boucle 3
Else 'sinon (condition 2 si NO vaut 1)
'récupère dans la ligne de l'identifiant en colonne 17 la donnée ligne L colonne 5 de TV
TS.DataBodyRange(I, 17) = TV(J, 5)
'récupère dans la ligne de l'identifiant en colonne 18 la donnée ligne L colonne 9 de TV
TS.DataBodyRange(I, 18) = TV(J, 9)
'récupère dans la ligne de l'identifiant en colonne 19 la donnée ligne L colonne 10 de TV
TS.DataBodyRange(I, 19) = TV(J, 10)
End If 'fin de la condition 2
End If 'fin de la condition 1
Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
End Sub
Bonjour le forum, merci pour vos propositions, je teste cela avec les vrais fichier dans lansemzine
Bonjour,
Une proposition 365 et +.
Cdlt.