IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[Excel 2019] erreur de compilation "Type d'arguments ByRef incompatible"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut [Excel 2019] erreur de compilation "Type d'arguments ByRef incompatible"
    [Excel 2019]
    Bonjour a tous,

    Je souhaite un éclaircissement, pour faire fonctionner se code.

    On m'a aidé, a écrire celui-ci, qui me permet de collecter des informations, dans une feuille "Etude statistique"

    les plages des données sont en colonne ( M, N, et O).

    Le code démarre, et bloque avec une erreur de compilation de type " type d'argument ByRef incompatible".

    Apres avoir fait plusieurs essais dans ma 'Function SortDictionaryByValue()' , je bloque a se niveau .

    Merci pour vos pistes, et aides, sur des mauvaises déclarations que je dois faires.

    Cordialement
    ci-joint le code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    Sub AnalyseNumeros()
        Dim ws As Worksheet
        Dim rng As Range
        Dim dict As Object
        Dim cell As Range
        Dim topNumbers() As String
        Dim bottomNumbers() As String
        Dim i As Integer
     
        ' Spécifiez la feuille de calcul à utiliser
        set ws= ThisWorkbook.Worksheets("Etude statistique")
     
        ' Spécifiez la plage de données (colonnes M, N, et O)
        Set rng = ws.Range("M2:O" & ws.Cells(ws.Rows.Count, "M").End(xlUp).Row)
     
        ' Créez un dictionnaire pour stocker les numéros et leurs occurrences
        Set dict = CreateObject("Scripting.Dictionary")
     
        ' Parcourez les données et remplissez le dictionnaire
        For Each cell In rng.Rows
            dict(cell.Cells(1, 1).Value) = cell.Cells(1, 2).Value
        Next cell
     
        ' Triez le dictionnaire par ordre décroissant d'occurrences
        Dim sortedDict As Object
        Set sortedDict = SortDictionaryByValue(dict, False)
     
        ' Initialisez les tableaux pour les numéros les plus tirés et les moins tirés
        ReDim topNumbers(1 To 10)
        ReDim bottomNumbers(1 To 10)
     
        ' Remplissez les tableaux avec les numéros correspondants
        i = 1
        Dim Key As Variant ' Déclaration de la variable Key
        For Each Key In sortedDict.keys
            If i <= 10 Then
                topNumbers(i) = Key
            End If
            If i > sortedDict.Count - 10 Then
                bottomNumbers(i - (sortedDict.Count - 10)) = Key
            End If
            i = i + 1
        Next Key
     
        ' Affichez les résultats dans la feuille de calcul
        ws.Cells(2, 2).Value = Join(bottomNumbers, ", ")
        ws.Cells(3, 2).Value = Join(topNumbers, ", ")
     
        ' Mettez en forme les cellules en vert pour les numéros les moins tirés
        For Each cell In ws.Range("B2").Resize(10)
            cell.Font.Color = RGB(0, 176, 80) ' Vert
        Next cell
     
        ' Mettez en forme les cellules en rouge pour les numéros les plus tirés
        For Each cell In ws.Range("B3").Resize(10)
            cell.Font.Color = RGB(255, 0, 0) ' Rouge
        Next cell
    End Sub
     
    Function SortDictionaryByValue(dict As Object, Optional descending As Boolean = False) As Object
        Dim keys() As Variant
    	Dim k As Variant
        Dim values() As Variant
        Dim i As Long, j As Long
        Dim tempKey As Variant, tempValue As Variant
     
        ' Mettez les clés et les valeurs dans des tableaux
        i = 0
        For Each k In dict.keys
            i = i + 1
            ReDim Preserve keys(1 To i)
            ReDim Preserve values(1 To i)
            keys(i) = k
            values(i) = dict(k)
        Next k
     
        ' Triez les tableaux en fonction des valeurs
        For i = 1 To UBound(values)
            For j = i + 1 To UBound(values)
                If (values(i) < values(j) And Not descending) Or (values(i) > values(j) And descending) Then
                    tempValue = values(i)
                    values(i) = values(j)
                    values(j) = tempValue
                    tempKey = keys(i)
                    keys(i) = keys(j)
                    keys(j) = tempKey
                End If
            Next j
        Next i
     
        ' Créez un nouveau dictionnaire trié
        Set SortDictionaryByValue = CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(keys)
            SortDictionaryByValue(keys(i)) = values(i)
        Next i
    End Function

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il faut passer ton dictionnaire en valeur (copie de l'objet) et non en référence (objet direct)

    et donc modifier les paramètres de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function SortDictionaryByValue(ByVal dict As Object, Optional descending As Boolean = False) As Object

  3. #3
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Quelle es le nom des colonnes M:O M1:O1?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut
    Merci a Thumb down pour sa remarque, grosse bêtise de ma part

    correction rapidement faite
    ' je Spécifie la plage de données (colonnes M5, N5, et O5)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
          Set rng = ws.Range("M5:O" & ws.Cells(ws.Rows.Count, "M").End(xlUp).Row)

    Merci a Joe.levrai pour la piste, sur la façon dont je dois passer, mon dictionnaire en valeur (en copie de l'objet) , je fais mes essais

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut

    Je dis merci , Thumb down, l'inattention e ma part, la collecte des données se fait très bien. (essai concluent)

    je dis merci, a joe.levrai , bravo très pertinente, puisque la prise en compte de ma fonction se fait correctement. (essai concluent )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] type d'arguments ByRef incompatible
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 14/04/2019, 19h31
  2. [XL-2010] Erreur de compilation; Type d'argument ByRef incompatible
    Par Toug19 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/05/2015, 16h01
  3. Type d'argument Byref incompatible
    Par Glherbier dans le forum VBA Access
    Réponses: 13
    Dernier message: 02/11/2010, 10h30
  4. [AC-2007] Type d'argument ByRef incompatible dans un module
    Par KIK83 dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/12/2009, 15h01
  5. [VB]type d'arguments byref incompatibles
    Par kantelise dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 30/04/2006, 08h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo