Aide Index Equiv ? Sommeprod?

Bonjour, je suis déjà venu plusieurs fois pour la même raison.

Voici un fichier avec une base des actes médicaux dans un hôpital et la base des séjours dans ce même hôpital.

La base des actes médicaux présente en 1ère colonne les numéros de séjour et en 2è les dates (avec heure) des actes médicaux.

La base des séjours a les numéros de séjours (clé commune) et les dates d'entrée et de sortie en unité de soins (avec heure) puis les unités de soins en questions.

Le but est de retrouver les unités de soins sur la base des actes médicaux. Cependant, si ce n'était que ça, cela ne serait pas compliqué. Par exemple, si j'entre à l'hôpital aux urgences et que j'y reste 6 heures et que je subis 2 actes médicaux puis je suis transférer dans une autre unité de soins pour 3 jours (subissant par ex 4 actes médicaux), dans ma base séjour, il y aura une ligne avec mon séjour aux urgences et une autre ligne avec mon séjour dans cet autre unité de soins (tous avec le même n° de séjour). Il faut donc en fonction de l'heure de l'acte médical, retrouver les unités de soins correspondantes.

Des personnes de ce forum m'avaient donné une formule : =SIERREUR(INDEX(plage unité de soins; SOMMEPROD((plage n°séjour=n° séjour)*(plage date entrée unité soins <= date de l'acte médical)*(plage date sortie unité de soins >= date de l'acte médical)*LIGNE(plage n° séjour)));"")

Elle marchait sur une ancienne base de données mais voilà qu'elle ne marche plus et je ne sais pas pourquoi.

Merci d'avance pour votre aide

Bonjour

Un essai à tester. Te convient-il ?

Option Explicit

Dim tabloS, tabloB, tabloR(), dico
Dim b&, s&, flag&

Sub MettreAjour()

    Set dico = CreateObject("Scripting.Dictionary")
    tabloS = Sheets("Base séjour").Range("A1").CurrentRegion
    tabloB = Range("A1").CurrentRegion
    ReDim tabloR(1 To UBound(tabloB, 1), 1 To 1)
    For b = 2 To UBound(tabloB, 1)
        dico(tabloB(b, 1)) = DateValue(tabloB(b, 2))
    Next b
    For b = 2 To UBound(tabloB, 1)
        flag = 0
        For s = 2 To UBound(tabloS, 1)
            If tabloS(s, 1) = tabloB(b, 1) And dico(tabloB(b, 1)) >= DateValue(tabloS(s, 2)) _
                        And dico(tabloB(b, 1)) <= DateValue(tabloS(s, 3)) Then
                tabloR(b - 1, 1) = tabloS(s, 4)
                flag = 1
            End If
        Next s
        If flag = 0 Then tabloR(b - 1, 1) = "Urgence"
    Next b
    Range("C2").Resize(UBound(tabloR, 1), 1) = tabloR
End Sub

Bye !

Bonjour, il est presque bon mais étant mauvais en VBA je n'arrive pas à le transposer sur ma base réelle.

De plus, les séjours en urgence ne sont pas dans la base séjour (ils sont traité à part, c'était juste pour donner un exemple à comprendre).

En tout cas, merci beaucoup de votre aide a+.

L'idée de la macro est bonne, vous avez bien compris que l'unité médicale dans la base des actes correspondait à la date de l'acte situé dans l'intervalle de séjour.

je n'arrive pas à le transposer sur ma base réelle.

Alors, joins un fichier avec ta base réelle....

Bye !

Euh..

Je ne peux pas la transmettre car confidentielle, mais pourriez-vous m'indiquer à quoi correspondent les variables car j'ai du mal à les identifier.

De plus, ma base de donnée comporte 400 000 lignes, au niveau des données renvoyées avec la fonction Ubound, cela est possible ?

...indiquer à quoi correspondent les variables...

tabloS : Variable tableau qui représente toutes les valuers du tableau de la feuille ‘’Base de séjour’’

tabloB : Variable tableau qui représente toutes les vaeurs du tableau de la feuille ‘’Base’’

tabloR : Variable tableau qui représente toutes les valeurs du résultat qu’on mettra dans la colonne C de la feuille ‘’Base’’

dico : dictionnaire des valeurs des numéros de la colonnne 1 du tableau de la colonne A de la feuille ‘’Base ‘’

b : variable de ligne du tabloB

s : variable de ligne du tabloS

flag : variable qui permet de savoir si on a trouvé une unité de soin pour la ligne b du tabloB

...400 000 lignes, au niveau des données renvoyées avec la fonction Ubound, cela est possible ?

Pourquoi pas ? Il faut essayer !

Bye !

Re,

sur ma base officielle, la colonne "date des actes" est colonne n°5, mes numéros de séjour sur cette même base sont en colonne n°2.

Option Explicit

Sub CommandE()

Dim tabloS, tabloB, tabloR(), dico
Dim b&, s&, flag&

Set dico = CreateObject("Scripting.Dictionary")
tabloS = Sheets("Base séjour 2020").Range("A1").CurrentRegion
tabloB = Sheets("toutes les lignes d'activité CC").Range("B1").CurrentRegion
ReDim tabloR(1 To UBound(tabloB, 1), 1 To 1)
For b = 2 To UBound(tabloB, 2)
dico(tabloB(b, 2)) = DateValue(tabloB(b, 5))
Next b
For b = 2 To UBound(tabloB, 2)
flag = 0
For s = 2 To UBound(tabloS, 1)
If tabloS(s, 1) = tabloB(b, 2) And dico(tabloB(b, 5)) >= DateValue(tabloS(s, 2)) _
And dico(tabloB(b, 5)) <= DateValue(tabloS(s, 3)) Then
tabloR(b - 1, 1) = tabloS(s, 4)
flag = 1
End If
Next s
If flag = 0 Then tabloR(b - 1, 1) = ""
Next b
Range("C2").Resize(UBound(tabloR, 1), 1) = tabloR
End Sub

J'ai essaye de modifier mais sans succès, arrivez-vous à trouver l'erreur ? on met met erreur de type 13.

Bonne journée

En débogant, Excel me dit que l'erreur est à "If tabloS(s, 1) = tabloB(b, 2) And dico(tabloB(b, 5)) >= DateValue(tabloS(s, 2)) _
And dico(tabloB(b, 5)) <= DateValue(tabloS(s, 3)) Then"

De plus, la colonne à remplir (unité de soins) est en colonne 3 de la base des actes médicaux

Rechercher des sujets similaires à "aide index equiv sommeprod"