none
Erreur 1004: Impossible de définir la valeur d'une cellule RRS feed

  • Question

  • Bonjour,

    J'ai une fonction matricielle qui fonctionne bien

    J'ai essayé de la convertir en fonction non matricielle pour remplir la colonne d'un tableau (ListObject)

    Voici un exemple de macro qui reprend le principe (le vrai code de ma macro permet de discriminer les valeurs abberrantes)

    'fonction Matricielle
    Function maFonctionMatricielle(colonnePourCalcul As Variant) As Variant
        Dim monResultat() As Variant
        If (TypeOf colonnePourCalcul Is Range) Then
            ReDim monResultat(UBound(colonnePourCalcul.Value), 1)
        Else
            ReDim monResultat(UBound(colonnePourCalcul), 1)
        End If
        Dim i As Integer
        Randomize
        For i = 0 To UBound(monResultat)
            If (Int((10 * Rnd) + 1) <= 5) Then
                monResultat(i, 1) = True
                monResultat(i, 0) = True
            Else
                monResultat(i, 1) = False
                monResultat(i, 0) = False
            End If
        Next i
        maFonctionMatricielle = monResultat
    End Function
    
    'conversion de la fonction matricielle en fonction de remplissage d'un ListObject
    Function setValueInListObject(colonnePourCalcul As Variant, noDeColonneARemplir As Integer) As Boolean
        'J'ai une fonction qui remplit la variable résultat.
        'Cette fonction est utilisable dans une formule matricielle.
    InitResultat:
        Dim i As Integer
        Dim monResultat() As Variant
        
        monResultat = maFonctionMatricielle(colonnePourCalcul)
        Randomize
    'Je n'arrive pas à mettre une valeur dans la colonne résultat.
    'Je cherche à pallier à l'impossibilité d'utiliser des fonctions matricielles dans un tableau.
    'Tous les moyens utilisés pour définir la valeur de ma cellule se soldent par une erreur 1004
    debutDesProblemes:
        On Error GoTo uneErreurPourLaDouze
        Dim tableau As ListObject
        Set tableau = colonnePourCalcul.ListObject
        Dim curRange As Range
        Dim currentRow As ListRow
        For Each currentRow In tableau.ListRows
            i = currentRow.Index
            currentRow.Range(1, colonneResultat).FormulaR1C1 = CStr(monResultat(i, 0))
        Next currentRow
        donneLesValeursAberrantes = True
    uneErreurPourLaDouze:
        If (Err.Number <> 0) Then
            donneLesValeursAberrantesPourUnTableau = False
        End If
    
        
    End Function

    J'ai ajouté à ma feuille de calcul un tableau avec 2 colonnes (Insertion/Tableau sur la plage A1/A8)

    Sur les cellules E2:E8, j'appelle la fonction {=maFonctionMatricielle(Tableau1[Colonne1])} j'ai le résultat.

    Quand dans la cellule D1, j'appelle la fonction =setValueInListObject(Tableau1[Colonne1];2)

    J'ai une erreur.Je tourne en rond depuis des jours, je ne m'en sors pas.

    Merci pour votre aide.



    mercredi 22 août 2018 15:44

Toutes les réponses

  • Bonjour,

    Je ne touche plus à Excel depuis 15 ans et j'ai fait peu de calcul matriciel, mais en fonction de l'affluence actuelle sur les forums Microsoft, je vais essayer de voir si je ne pourrais pas par chance tomber sur la bonne question, qui pourrait alors aider à trouver la réponse.

    Pour commencer, si je ne m'abuse, A1:A8, ça fait une colonne, et non deux ?

    J'ai fait une recherche sur l'erreur 1004, apparemment on la rencontre quand des données appelées en référence manquent (lien vers un fichier absent par exemple).

    Des gens s'y sont trouvés confrontés en changeant de version d'Excel, c'est donc devenu un problème de migration. Par analogie on peut se dire que la nouvelle version a cherché à introduire de la souplesse en rendant une donnée modifiable, donc il faut qu'elle soit définie quelque part.

    Là, on cherche à modifier des données sur lesquelles sont basés des calculs matriciels. Est-ce que ça n'introduit pas un problème de cohérence ou de référence circulaire ? S'agissant d'une valeur en dur ça serait un peu étonnant, mais comme on n'a rien de solide il ne faut se priver d'aucune conjecture.

    Dans setValueInListObject je vois ça :


        For Each currentRow In tableau.ListRows
            i = currentRow.Index
            currentRow.Range(1, colonneResultat).FormulaR1C1 = CStr(monResultat(i, 0))
        Next currentRow

    monResultat est un tableau de valeurs booléennes, c'est bien ça ?

    Donc là on veut le convertir en chaîne de caractères, et en faire une formule pour une cellule Excel.

    Qu'est-ce que ça donne, exactement, comme formule ?


    • Modifié Gloops samedi 8 septembre 2018 10:37
    samedi 8 septembre 2018 10:15