C'est assez frustrant que je semble déjà faire quelque chose de mal dans la première ligne de mon premier projet VBA. Essentiellement, mon projet a déjà été bloqué parce que je ne comprends pas pourquoi cela fonctionne:

Function TestF(Values As Variant, Dates As Variant)
    TestF = Values(2)
End Function

Mais cela fait:

Function TestF(Values As Variant, Dates As Variant)
    TestF = UBound(Values)
End Function

(Je veux juste voir que UBound fonctionne. Donc, j'ai supprimé du projet tout ce qui n'est pas lié.)

Values et Dates sont chacun supposés être un tableau à une dimension. (Ou les plages? Ou est-ce le problème?)

Comment corriger le premier bit de code?

J'ai googlé et j'ai googlé, mais je n'ai pas trouvé ma réponse.

L'erreur (Excel) est get est #VALUE! de =testf(A2:A10,B2:B10), où les plages sont comme:

-1000 31-Dec-13 -10 31-Dec-14 30 13-Mar-15 1200 17-Mar-15 -40 30-Jun-15 1300 30-Sep-16 1200 31-Oct-17 1250 30-Nov-18 1500 31-Dec-18

3
Řídící 28 nov. 2017 à 15:32

3 réponses

Meilleure réponse

Le problème lors de votre passage de tableau à UDF est votre compréhension du tableau et des plages. En général, les plages sont présentées sous la forme d'un tableau à deux dimensions même lorsqu'elles ne comportent qu'une seule ligne ou colonne.

Pour faire fonctionner votre code, essayez la "Double Transpose Trick" qui est à peu près la suivante:

Public Sub TestMe()

    Dim k As Variant

    k = Range("A2:F2")
    Debug.Print k(1)

    With WorksheetFunction
        k = .Transpose(.Transpose(k))
        Debug.Print k(1)
    End With

End Sub

Nous espérons que le code ci-dessus entraînera une erreur dans la partie Debug.Print k(1). C'est parce que k est un tableau à deux dimensions, bien qu'il soit sur une seule ligne:

enter image description here

Commentez cette partie ou changez-la en Debug.Print k(1, 1) et continuez avec le .Transpose. Cela changera votre tableau en une seule dimension et cela fonctionnera.

Ainsi, si vous voulez que votre formule non fonctionnelle fonctionne, voici une façon possible de le faire:

Public Function TestFormula(myValues As Variant) As String

    Dim myArr As Variant

    With WorksheetFunction
        myArr = .Transpose(.Transpose(myValues))
        TestFormula = myArr(UBound(myArr))
    End With

End Function

Quelques remarques importantes: l '"Astuce de double transposition" fonctionne sur des plages d'une ligne, lorsque celles-ci doivent être transférées vers un tableau. Si vous avez une plage d'une colonne, utilisez "Transposition simple":

myArr = .Transpose(myValues)

Avec plus d'une colonne ou d'une ligne, n'utilisez pas la transposition car elle ne peut pas être mappée à un tableau à une dimension.

De plus, si vous passez une plage d'une cellule, cela ne fonctionnera pas. Mais vous trouverez un moyen de le contourner.

Comme mentionné par @cyboashu dans les commentaires, le tableau myArr() prendrait des valeurs jusqu'à la colonne 65536, car le Transpose() est fait de cette façon, probablement pour des raisons de compatibilité avec Excel 2003. Pour faire un plus grand tableau - Mettre la colonne entière (chaque valeur dans la colonne) dans un tableau ?

2
Vityata 28 nov. 2017 à 13:32

Vous vouliez probablement:

TestF=Values(Ubound(Values))

Aussi, vous devez déclarer ce que votre fonction est censée retourner, comme

Function TestF(Values As Variant, Dates As Variant) as String
0
MarcinSzaleniec 28 nov. 2017 à 12:37

Vous devez transmettre les bons paramètres à votre UDF .

Les deux paramètres sont Range.

Function TestF(Rng1 As Range, DatesRng As Range) As Long

    Dim C As Range
    Dim x As Long

    For Each C In Rng1
        If Trim(C.Value) <> "" Then ' make sure there isn't a blank cell in the middle of your Range
            x = x + 1
        End If
    Next C
    TestF = x - 1

End Function

Si vous n'avez pas de cellules vides au milieu de votre Range, le code suivant sera suffisant:

Function TestF(Rng1 As Range, DatesRng As Range) As Long

    Dim C As Range
    TestF = Rng1.Cells.Count - 1

End Function
1
Shai Rado 28 nov. 2017 à 12:53
47531727