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

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.

5edlede.xlsx (50.41 Ko)

Bonjour à tous,

Certainement inutile mais j'envoie quand même le code ci-dessous :

            

Une proposition n'est jamais inutile. C'est un partage par principe enrichissant.

Rechercher des sujets similaires à "recuperation donnee probleme nombre occurence"