J'écris un script qui bougera via une feuille de calcul Excel et trouvera s'il existe des doublons de cellules sélectionnées. S'il y a des doublons, la fonction retourne une matrice de quelles lignes sont dupliquées et créera un commentaire pour me dire les lignes.
J'ai pu gérer l'erreur 0 mais je reçois maintenant l'erreur 9 lorsque je vérifie s'il y a Éléments de la matrice à l'aide de la fonction Ubound. p>
Comment puis-je valider si le tableau des entiers est vide? p>
Function IsArrayEmpty(anArray As Variant) As Boolean Dim i As Integer On Error Resume Next i = UBound(anArray, 1) Select Case (Err.Number) Case 0 IsArrayEmpty = True Case 9 IsArrayEmpty = True Case Else IsArrayEmpty = False End Select End Function
8 Réponses :
Essayez ceci pour vérifier un tableau vide:
Dim arr() As String If (Not arr) = -1 Then Debug.Print "empty" Else Debug.Print "UBound is " & UBound(X) End If
Je ne prétends aucune connaissance particulière, mais apparemment, cette méthode de vérification d'un tableau vide exploite un bug dans VBA et ne doit pas être utilisé: Stackoverflow.com/questions/183353/... a >
@jtolle - Votre lien est sûrement la discussion définitive de cette question. Peut-être que ce q devrait marquer un DUP. ou au moins votre lien devrait être la réponse à la Q.
@jtolle peut être. J'ai déjà utilisé cette chose avant, mais comme je ne l'ai pas créé, je ne prétends aucune vertu à ce sujet.
Votre fonction échoue car s'il n'y a pas d'erreur soulevée par ubound () code> (c'est-à-dire que le tableau est dimensionné) puis
err.Number code> est 0 et:
Function IsArrayEmpty(anArray As Variant) As Boolean
On Error GoTo IS_EMPTY
If (UBound(anArray) >= 0) Then Exit Function
IS_EMPTY:
IsArrayEmpty = True
End Function
cela a fonctionné mieux, mais je reçois toujours l'erreur n ° 9 Script hors des limites
Dim A (): Debug.Print Isarrayempty (A) Code> Fonctionne bien pour moi ... Assurez-vous de ne pas avoir d'outils> Options> Général> Pause sur toutes les erreurs Set
.. je reçois toujours l'erreur n ° 9 Script hors limites p> blockQuote>
Si vous obtenez une erreur n ° 9 ... N'est-ce que cela signifie que vous obtenez les informations dont vous avez besoin (tableau est vide)? P>
C'est l'information que je veux, mais le programme informatique ne saute pas au gestionnaire d'erreurs à la place, je reçois la pop qui dit l'erreur 9
Salut Talguy, avez-vous essayé Alex K. Subetion? Selon ce lien << a href = "http://www.pcreview.co.uk/forums/thread-3387988.php" rel = "nOfollow noreferrer"> pcreview.co.uk/forums/thread-3387988.php > Si vous le modifiez dans un programme Office, cela pourrait être transféré à l'autre.
Vérifiez également ce lien << a href = "http://www.cpearsarson.com/excel/errorhandling.htm" rel = "nofollow noreferrer"> Cpearson.com/excel/errorhandling.htm >. Section "Blocs de manipulation des erreurs et sur erreur goto". (Plusieurs instructions "sur l'erreur" dans la même procédure, ne prennent pas correctement.)
est votre variante de matrice vide ou vide ()?
'vide' est une variante ininitialisée: ISPTY (myvar) retournera vrai ... et vous pourriez être dupe en pensant que vous avez un tableau vide (qui est ' Vide () ', pas' vide '- essayez de suivre de la hauteur, il y aura un court test après cette classe) car Isempty (myarray) revient aussi vrai aussi. P>
P>
If Instr(Typename(myVar), "(") > 0 then ' we now know it is an array If Not IsEmpty(myVar) Then ' We can now check its dimensions If Ubound(myVar) > 0 ' insert error-free code here Endif Endif Endif
Vous pouvez vérifier si le tableau est vide en récupérant le nombre total d'éléments en utilisant l'objet VBARRAY () CODE> de JScript (Fonctionne avec des tableaux de type variant, unique ou multidimensionnel):
Sub Test()
Dim a() As Variant
Dim b As Variant
Dim c As Long
' Uninitialized array of variant
' MsgBox UBound(a) ' gives 'Subscript out of range' error
MsgBox GetElementsCount(a) ' 0
' Variant containing an empty array
b = Array()
MsgBox GetElementsCount(b) ' 0
' Any other types, eg Long or not Variant type arrays
MsgBox GetElementsCount(c) ' -1
End Sub
Function GetElementsCount(aSample) As Long
Static oHtmlfile As Object ' instantiate once
If oHtmlfile Is Nothing Then
Set oHtmlfile = CreateObject("htmlfile")
oHtmlfile.parentWindow.execScript ("function arrlength(arr) {try {return (new VBArray(arr)).toArray().length} catch(e) {return -1}}"), "jscript"
End If
GetElementsCount = oHtmlfile.parentWindow.arrlength(aSample)
End Function
L'UBOUD et LBound retourneront les limites supérieure et inférieure d'un tableau donné. Donc, si Ubound (arr) est égal à LBound (arr), il est vide.
Dim arr() As String If UBound(arr) = LBound(arr) Or UBound(arr) <= 0 Then Debug.Print "empty" Else Debug.Print "not empty" End If
Un cas de "comportement étrange" commenté peut être vu dans l'évaluation de la matrice de résultat après Split () code> de la chaîne vide:
ubound (divisé (diviseur ") = -1 < / Code>,
lbound (divisé ("", "séparateur")) = 0 code>. Peut-être que c'est juste une façon (maladroite) d'indiquer une erreur à partir des fonctions de base de la chaîne, de la même manière que certaines fonctions de chaîne renvoient traditionnellement -1 dans différentes langues et plates-formes.
Vous pouvez toujours utiliser "Isarray ()" fonction
Dim yourArray as variant if not isArray(your_array) then msgbox("empty") else msgbox("with data") end if