Calcul de moyenne sur des résultats obtenus par échelle de likert

Bonjour

je soumets à vos lumières un calcul automatique de moyenne de données numérique mais également des moyennes à obtenir à partir des réponses à une interrogation par échelle de likert. En plus la macro doit pouvoir concaténer du texte qui est soumis en réponse Pas simple mon explication! vous avez raison! Explication :

On part d'un fichier de données qui comporte plusieurs évaluations pour un même lieu de stage et il y a différents lieux de stage. Les données sont soit numériques, soit du texte ou encore une échelle de likert (dernière colonne). La répartition et la proportion de colonnes en textes ou en chiffres ou en échelle de likert n'est pas connue et variable de même que le nombre de lignes et le nombre de lieux de stage. Au final, on voudrait par lieu de stage, les moyennes sur les colonnes chiffrées, la concaténation des réponses en texte pour chaque lieu de stage et la moyenne des différentes réponses en échelle de likert pour chaque lieu de stage.

Je ne sais pas si cela faciliterait le travail mais j'ai nommé les différentes colonnes en commençant par N si ce sont des données numériques, T pour texte et L pour likert.

J' ai soumis à l'un d'entre vous mon problème. Les données sont dans l'onglet Feuil2. Le résultat de son travail de programmation est dans l'onglet restitution jusqu'aux colonnesAR. Le code VBA est dans le module 2. J'ai remarqué qu'il y a des valeurs numériques qui apparaissent dans les colonnes de textes concaténées en G et AN (Si cela peut être corrigé ce serait mieux). Tout le reste est correct sauf une difficulté sur les moyennes de valeurs obtenues par réponses à une échelle de likert. Les données Likert sont dans la colonne AR. Ce que je souhaite en plus, si c'est possible, c'est que la macro me fasse automatiquement les moyennes sur chacune des réponses pour chaque lieu de stage. J'ai fait les calculs manuellement avec NB.SI et les ai présenté sur l'onglet restitution en colonnes AS à AV pour vous montrer le résultat attendu.

Nb ; Information sur échelle de Likert : On utilise beaucoup cela pour obtenir des indices de satisfaction d'une action menée ou pour mesurer une adhésion à une idée, un concept. Une fois que les participants ont répondu, on fait des moyennes sur ceux qui ont répondu très satisfait, moyennement satisfait, pas du tout satisfait . Les terms d'une échelle de likert sont propre à chaque projet de recherche. Dans les études de consensus, on cote de 0 à 10 et on fait des moyennes pour sur chacune des notes pour savoir combien ont répondu 0, 1,...9,10. Pour calculer ces moyennes, on pourrait positionner l'echelle de Likert avec ses critères sur un autre onglet pour faciliter , peut-être, votre programmation.

Bon l'explication est fort longue mais la demande complexe bien que partiellement déjà résolue. J'espère que vous avez compris. Il ne s'agit pas de simples moyennes (enfin c'est ce que je trouve avec mes yeux de profane en VBA).

Merci de ce que vous pourrez faire comme miracle informatique

Cordialement

102essai-eval-2020.xlsm (76.37 Ko)

Bonjour,

Le code VBA est dans le module 2.

qui n'existe pas !

sauf une difficulté sur les moyennes de valeurs obtenues par réponses à une échelle de likert. Les données Likert sont dans la colonne AR. Ce que je souhaite en plus, si c'est possible, c'est que la macro me fasse automatiquement les moyennes sur chacune des réponses pour chaque lieu de stage.

ok, donc on peut cibler la réponse sur un extrait ne contenant que la cotation sur l'échelle de Likert.

Généralement on donne un résultat en barre colorée avec une valeur dépendant de ce que l'on veut afficher

Par exemple, pour ici et l'ensemble des établissements hospitaliers :

Je suis très satisfait19%
Je suis très satisfait + Satisfaction moyenne42%
Pas satisfait28%
Pas satisfait + Pas très satisfait58%
likert

Ceci s'obtient simplement par un TCD et pas forcément par une macro. Mais on peut l'inclure dans le calcul ... si tu veux une et une seule valeur il faut choisir entre les 4.

Bonjour Steelson, pbpb76

En Feuil2, colonne AS, si j'ai bien compris, c'est ce genre de formule que vous souhaitez.

=NB.SI.ENS($A$2:$A$192;$A2;$AR$2:$AR$192;$AR2)/NB.SI($A$2:$A$192;$A2)

En AS2, à recopier vers le bas : format pourcentage

klin89

re pbpb76,

Essayez ceci :

En Feuil2, , ajoutez au préalable une colonne supplémentaire en bout de tableau (P_44) et recopier la formule comme indiqué ci-dessus.

=NB.SI.ENS($A$2:$A$192;$A2;$AR$2:$AR$192;$AR2)/NB.SI($A$2:$A$192;$A2)

Le code :

Option Explicit
Sub test1()
    Dim a, b(), w(), i As Long, j As Long, n As Long, dico As Object, e
    Set dico = CreateObject("Scripting.Dictionary")
    dico.comparemode = 1
    'feuille source
    With Sheets("Feuil2").Cells(1).CurrentRegion
        a = .Value: n = 1
        ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
        b(n, 1) = a(1, 1): b(n, 2) = "Nbre"
        For j = 2 To UBound(a, 2) - 1
            b(n, j + 1) = a(1, j)
        Next
        For i = 2 To UBound(a, 1)
            If Not dico.exists(a(i, 1)) Then
                ReDim w(1 To 2)
                Set w(1) = CreateObject("Scripting.Dictionary")
                w(1).comparemode = 1
                n = n + 1: w(2) = n
                b(w(2), 1) = a(i, 1)
            Else
                w = dico.Item(a(i, 1))
            End If
            b(w(2), 2) = b(w(2), 2) + 1
            For j = 2 To UBound(a, 2) - 1
                Select Case True
                Case a(1, j) Like "N*"
                    b(w(2), j + 1) = b(w(2), j + 1) + a(i, j)
                Case a(1, j) Like "T*"
                    If Not IsEmpty(a(i, j)) Then
                        If IsEmpty(b(w(2), j + 1)) Then
                            b(w(2), j + 1) = a(i, j)
                        Else
                            b(w(2), j + 1) = b(w(2), j + 1) & vbLf & a(i, j)
                        End If
                    End If
                Case a(1, j) Like "L*"
                    If Not w(1).exists(a(i, j)) Then
                        w(1)(a(i, j)) = Empty
                        b(w(2), j + 1) = IIf(IsEmpty(b(w(2), j + 1)), a(i, j) & "  " & Format(a(i, j + 1), "0.0%"), _
                                             b(w(2), j + 1) & vbLf & a(i, j) & "  " & Format(a(i, j + 1), "0.0%"))
                    End If
                Case Else
                End Select
            Next
            dico.Item(a(i, 1)) = w
        Next
        For Each e In dico.keys
            For j = 3 To UBound(b, 2)
                If b(1, j) Like "N*" Then
                    b(dico.Item(e)(2), j) = b(dico.Item(e)(2), j) / b(dico.Item(e)(2), 2)
                End If
            Next
        Next
    End With
    'Restitution
    Application.ScreenUpdating = False
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("restitution1").Delete
    Sheets.Add().Name = "restitution1"
    On Error GoTo 0
    With Sheets("restitution1").Cells(1)
        With .Resize(n, UBound(b, 2))
            .Value = b
            .Font.Name = "calibri"
            .Font.Size = 10
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .Borders(xlInsideHorizontal).Weight = xlThin
            .VerticalAlignment = xlCenter
            With .Rows(1)
                .BorderAround Weight:=xlThin
                .Interior.Color = 4697456
                .HorizontalAlignment = xlCenter
            End With
            '.Columns.AutoFit
            With .Offset(, 2).Resize(, .Columns.Count - 2)
                .Columns.NumberFormat = "0.00"
            End With
        End With
        .Parent.Activate
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

klin89

re pbpb76,

Essayez cette nouvelle version :

Pas besoin d'ajouter une colonne supplémentaire dans la feuille source comme indiqué précédemment.

Option Explicit
Sub test1()
    Dim a, b, w(), e, s, p, arr, i As Long, j As Long, n As Long, ub As Byte, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.comparemode = 1
    'feuille source
    With Sheets("Feuil2").Cells(1).CurrentRegion
        a = .Value: n = 1
        arr = Array("Je suis très satisfait", "Satisfaction moyenne", "Pas très satisfait", "Pas satisfait")
        ub = UBound(arr)
        ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2) + ub + 1)
        b(n, 1) = a(1, 1): b(n, 2) = "Nbre"
        For j = 2 To UBound(a, 2) - 1: b(n, j + 1) = a(1, j): Next
        For j = LBound(arr) To UBound(arr): b(n, UBound(b, 2) - ub + j) = arr(j): Next
        For i = 2 To UBound(a, 1)
            If Not dico.exists(a(i, 1)) Then
                ReDim w(1 To 2)
                Set w(1) = CreateObject("Scripting.Dictionary")
                w(1).comparemode = 1
                n = n + 1: w(2) = n
                b(w(2), 1) = a(i, 1)
            Else
                w = dico.Item(a(i, 1))
            End If
            b(w(2), 2) = b(w(2), 2) + 1
            For j = 2 To UBound(a, 2)
                Select Case True
                Case a(1, j) Like "N*"
                    b(w(2), j + 1) = b(w(2), j + 1) + a(i, j)
                Case a(1, j) Like "T*"
                    If Not IsEmpty(a(i, j)) Then
                        If IsEmpty(b(w(2), j + 1)) Then
                            b(w(2), j + 1) = a(i, j)
                        Else
                            b(w(2), j + 1) = b(w(2), j + 1) & vbLf & a(i, j)
                        End If
                    End If
                Case a(1, j) Like "L*"
                    w(1)(a(i, j)) = w(1)(a(i, j)) + 1
                Case Else
                End Select
            Next
            dico.Item(a(i, 1)) = w
        Next
        For Each e In dico.keys
            For j = 3 To UBound(b, 2) - ub - 1
                If b(1, j) Like "N*" Then
                    b(dico.Item(e)(2), j) = b(dico.Item(e)(2), j) / b(dico.Item(e)(2), 2)
                End If
            Next
            For Each s In dico.Item(e)(1)
                p = Application.Match(s, arr, 0)
                If Not IsError(p) Then
                    b(dico.Item(e)(2), UBound(b, 2) - ub + p - 1) = dico.Item(e)(1)(s) / b(dico.Item(e)(2), 2)
                End If
            Next
        Next
    End With
    'Restitution
    Application.ScreenUpdating = False
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("restitution2").Delete
    Sheets.Add().Name = "restitution2"
    On Error GoTo 0
    With Sheets("restitution2").Cells(1)
        With .Resize(n, UBound(b, 2))
            .Value = b
            .Font.Name = "calibri"
            .Font.Size = 10
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .Borders(xlInsideHorizontal).Weight = xlThin
            .VerticalAlignment = xlCenter
            With .Rows(1)
                .BorderAround Weight:=xlThin
                .Interior.Color = 4697456
                .HorizontalAlignment = xlCenter
            End With
            With .Offset(, UBound(b, 2) - ub - 1).Resize(, ub + 1)
                .Rows(1).Interior.Color = 52428
                On Error Resume Next
                .SpecialCells(4).Value = 0
                On Error GoTo 0
                .Columns.NumberFormat = "0.0 %"
            End With
            With .Offset(, 2).Resize(, UBound(b, 2) - ub - 3)
                .Columns.NumberFormat = "0.00"
            End With
            .Columns.AutoFit
        End With
        .Parent.Activate
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

Illustration du tableau final restitué :

capture 12

klin89

Bonjour Klin,

c'est bien d'être persévérant

mais pbpb76 n'a pas fait d'apparition depuis le 05 mai 2020, 22:48

pas de retour, pas de critique, pas de remerciements ... espérons que cela serve quand même à lui et d'autres !

2 solutions, une avec TCD et une en VBA

Bonjour Steelson,

Ne t'inquiète pas, elle va revenir, je pense qu'elle a beaucoup de travail et n'est peut-être pas très disponible en ce moment

klin89

Rechercher des sujets similaires à "calcul moyenne resultats obtenus echelle likert"