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é.)
Où 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 réponses
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:
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 ?
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
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
De nouvelles questions
excel
Uniquement pour les questions sur la programmation contre des objets ou des fichiers Excel, ou le développement de formules complexes. Vous pouvez combiner la balise Excel avec VBA, VSTO, C #, VB.NET, PowerShell, l'automatisation OLE et d'autres balises et questions liées à la programmation, le cas échéant. Une aide générale concernant MS Excel pour les fonctions de feuille de calcul unique est disponible sur Super User.