Aide VBA/Formule Excel

Bonjour,

je reviens encore une fois, après différentes discussions sur le forum j'ai eu des débuts de réponse à ce que je recherchais.

Je travaille en hôpital et plus précisément sur les actes médicaux qu'il y a eu en 2020.

Le but est de retrouver des unités de soins sur ma feuille "Base". Enfaite, ma feuille "base" comporte les dates (avec heure) des actes médicaux en fonction des numéros de séjours.

Sur la feuille "base séjour", ce sont les séjours passés en 2020 avec les intervalles de date pour une unité de soins en question. Par exemple, je possède le numéro de séjour 11278908 et du 02/02/2020 00:00 au 04/02/2020 00:00, j'étais dans l'unité médicale MEH puis du 04/02/2020 00:01 au 06/02/2020 00:00 en MGH.

Pour chaque intervalle, j'ai peut être reçu un ou plusieurs actes médicaux. De ce fait, dans ma "Base", mes actes ayant eu lien dans l'intervalle où j'étais en MEH doivent me renvoyer l'unité de soins MEH et de même pour MGH.

J'ai eu un super début de réponse en VBA mais j'ai du mal à le transposer à ma base de 400 000 actes, je mets donc le code ici si quelqu'un arrive à me le modifier.

Option Explicit

Sub CommandButton1_Click()

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, 3), 1 To 1)

For b = 2 To UBound(tabloB, 2)

dico(tabloB(b, 2)) = 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)) >= tabloS(s, 2) And dico(tabloB(b, 5)) <= 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

De plus, je vous indique à quoi font référence 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

Si quelqu'un a une solution avec une formule Excel (j'en avais une qui marchait mais bizarrement elle me décale d'une cellule la bonne unité de soins ce que je ne comprends pas) je suis preneur.

Merci d'avance

Voici le fichier, désolé du double message

Bonjour

Tu as certainement changé quelque chose car la macro est au poil

J'ai fait une modif car il y avait une erreur (dû certainement aux colonnes vides)

Sub MettreAjour()
    Dim dl As Long
    dl = Range("B" & Rows.Count).End(xlUp).Row
    Set dico = CreateObject("Scripting.Dictionary")
    tabloS = Sheets("Base séjour").Range("A1").CurrentRegion
    tabloB = Range("B2:F" & dl)
    ReDim tabloR(1 To UBound(tabloB, 1), 1 To 1)
    For b = 2 To UBound(tabloB, 1)
        dico(tabloB(b, 1)) = DateValue(tabloB(b, 4))
    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

A+ François

Re,

Je n'arrive pas à la transposer à ma table j'ai une erreur de type 9.

Bonjour

Tu lances bien la macro en étant sur la feuille Base?

la 2ème feuille s'appelle bien Base séjour?

Tes données sont bien en colonnes B à F sur la feuille Base?

Il faut que le fichier que tu fait suivre soit identique au tien

A+ François

Oui c'est bien cela sur mon fichier réèlle

Bonjour

On a souvent cette erreur à cause d'un espace après le nom de la feuille...

exemple: "Base séjour "

As tu activer (dans VBA) Microsoft Scripting Runtime

Pour utiliser le dictionnaire VBA, nous devons activer la fonction Microsoft Scripting Runtime qui est disponible dans l'option de menu Outil sous Références.

est ce que tu as l'erreur avec le fichier joint?

A+ François

Re,

Oui j'ai toujours une erreur d'indice 9, mais c'est peut être que je n'ai pas de bouton associé au code VBA ?

Re,

sur votre fichier joint, cela marche.

Cependant, sur mon fichier réèl la seule chose qui change est le nom de la feuille "Base séjour" que j'ai remplacé par "Base séjour 2020" (sur ma feuille originale) et j'ai bien activé le dictionnaire comme vous me l'avez dit (effectivement, il n'était pas activé avant). Lorsque j'exécute, cela met beaucoup plus de temps à charger qu'avant (ce qui veut dire qu'il réfléchit) mais affiche toujours une erreur de type 13.

Ah oui, la feuille "Base" sur le fichier anonyme ne s'appelle pas comme ça sur mon fichier réel, serait-ce dû à cela ?

Bonjour

En cliquant sur Débogage tu as la ligne où il y a l'erreur

Pour ajouter un bouton sur la feuille qui doit être traitée (Base dans l'exemple)

insertion/illustrations/formes

clic sur la feuille et (sans relâcher le bouton gauche de la souris) étirer

Dans cette forme, faire un double clic et saisir le texte

Clic droit et choisir affecter une macro

J'ai ajouté une gestion d'erreur sur le fichier joint

A+ François

Merci à vous bonne journée

Rechercher des sujets similaires à "aide vba formule"