Comment tester si un tableau dynamique est vide ?
Lors de l'emploi de la fonction UBound, si le tableau passé en paramètre est vide, Visual Basic génère une erreur. Il est donc parfois important de savoir si le tableau que l'on va traiter est vide. Une des possibilités, pour ce faire, consiste justement à récupérer cette erreur : Public Function IsArrayEmpty(ByVal V As Variant) As Boolean
On Error Resume Next
Err.Clear V = UBound(V) IsArrayEmpty = (Err.Number = 9) Err.Clear
End Function
Private Sub Form_Load()
Dim tbl()
MsgBox IsArrayEmpty(tbl)
ReDim tbl(5)
MsgBox IsArrayEmpty(tbl)
End Sub
Tout le monde ne s'accorde cependant pas sur l'importance d'une erreur, certains le voyant comme un simple nombre indiquant le résultat d'une opération, d'autres le voyant comme un manquement au niveau de tests préalables amenant à une situation indésirable. Une autre possibilité se base sur la fonction VarPtrArray de la runtime Visual Basic et de quelques manipulations mémoire. Il est à remarquer que l'utilisation de cette fonction n'est que peu documentée et non supportée par Microsoft. L'usage de cette méthode est donc à vos risques et périls. Les déclarations suivantes sont requises : Private Declare Function VarPtrArray _ Lib "msvbvm60.dll" _ Alias "VarPtr" _ ( _ ByRef ArrayVar() As Any _ ) _ As Long Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" _ ( _ ByRef pDst As Any, _ ByRef pSrc As Any, _ ByVal ByteLen As Long _ ) La fonction suivante détermine si un tableau est vide, à partir de son pointeur : Private Function IsEmptyArray(ppsa As Long) As Boolean Dim psa As Long
CopyMemory psa, ByVal ppsa, LenB(psa) MyIsEmpty = psa = 0 End Function
A noter que la déclaration de la fonction MyIsEmpty ne dépend absolument pas du type de donnée du tableau, le pointeur étant indépendant du type de données. Ce pointeur sera déterminé à l'appel, comme le montre l'exemple suivant : Private Sub Test() Dim Array1(3) As Long Dim Array2() As Byte Dim Array3() As Double ReDim Array3(0 To 8)
Debug.Print IsEmptyArray (VarPtrArray(Array1)) Debug.Print IsEmptyArray (VarPtrArray(Array2)) Debug.Print IsEmptyArray (VarPtrArray(Array3)) End Sub
Cette méthode ne fonctionne pas pour les tableaux de chaînes de caractères, pour lesquels il faudra utiliser VarPtrStringArray. En réalisant l'implémentation dans une DLL standard en C, il est néanmoins possible de supprimer les appels aux fonctions VarPtrArray et VarPtrStringArray, tout en profitant de la simplicité de manipulation des pointeurs inhérente au langage C. Pour aller plus loin Voir aussi : |