2010-11-04 23 views
6

Je suis en train d'écrire un script qui va passer en revue ma feuille de calcul Excel et trouver s'il y a des doublons des cellules sélectionnées. s'il y a dups alors la fonction retournera un tableau dont les lignes sont dups et créer un commentaire dites-moi quelles lignes sont dups. J'ai été capable de gérer l'erreur 0 mais maintenant j'obtiens l'erreur 9 quand je vérifie le tableau s'il y a des éléments dedans en utilisant la fonction UBound. Est-ce que quelqu'un sait comment valider le tableau des entiers si c'est vide ou pas parce que mon code semble ne pas faire le travail. Voici mon codeVBA Handle Empty Array Erreur

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 

Répondre

5

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 

HTH!

+2

Je ne revendique aucune connaissance particulière, mais apparemment cette méthode de vérification d'un tableau vide exploite un bogue dans VBA et ne devrait pas être utilisée: http://stackoverflow.com/questions/183353/how-do-i- déterminer-si-un-tableau-est-initialisé-en-vb6/183356 # 183356 – jtolle

+0

@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 à Q. Q. – hawbsl

+0

@jtolle Peut être. J'ai utilisé cette chose auparavant, mais comme je ne l'ai pas créée, je ne revendique aucune vertu à ce sujet. –

6

Votre fonction échoue parce que s'il n'y a pas d'erreur soulevée par UBound() (à savoir le tableau est dimensionné) puis Err.Number est 0 et:

Case 0 
    IsArrayEmpty = True 

est exécuté renvoyer un résultat incorrect.

La façon la plus simple est de piéger juste l'erreur:

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 
+0

cela a fonctionné mieux mais je reçois toujours le script d'erreur # 9 hors des limites – Talguy

+1

'Dim a(): Debug.Print IsArrayEmpty (a)' fonctionne bien pour moi ... Assurez-vous que vous n'avez pas Outils> Options> Général> Rompre toutes les erreurs –

+0

Fonctionne pour moi aussi. –

1

.. I am still getting error #9 script out of bounds

si vous obtenez l'erreur # 9 .... ne pas que cela signifie que vous Geting les informations que vous avez besoin (array est vide)?

+0

c'est l'information que je veux mais le programme ne saute pas au gestionnaire d'erreur à la place je reçois le pop qui dit erreur 9 – Talguy

+0

Salut Talguy, as-tu essayé Alex K. sugestion? Selon ce lien si vous le changez dans un programme de bureau, il pourrait être transféré à l'autre. – CaBieberach

+0

Vérifiez également ce lien . Section "Blocage des erreurs et sur l'erreur". (Multiple instruction "sur erreur" dans la même procédure, ne pas attraper correctement.) – CaBieberach

3

Votre variante de tableau est-elle vide ou vide()? 'Empty' est une variante non initialisée: IsEmpty (myVar) retournera vrai ... Et vous pourriez être dupé en pensant que vous avez un tableau vide (qui est 'Empty()', pas 'Empty' - essayez de continuez, il y aura un court test après cette classe) car IsEmpty (myArray) renvoie True, aussi.

 
Dim myVar as Variant  ' this is currently Empty, and Ubound returns an error
Dim myArray() as variant ' this is currently Empty(), and Ubound returns an error

Redim myVar(0 to 0) ' this is no longer empty, and has a valid Ubound
Redim myArray(0 to 0) ' this is no longer empty, and has a valid Ubound

Un moyen fiable de vérifier myVar est TypeName (maVar) - si elle est un tableau, le nom contient des crochets:

 
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 

La réponse complète est « La détection d'une variante de tableau dans Excel VBA 'au Excellerando.

0

Vous pouvez vérifier si le tableau est vide en récupérant des éléments Comptage en utilisant l'objet VBArray() de JScript (fonctionne avec des tableaux de type variant, simple ou multidimensionnelle):

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 

Pour moi, il faut environ 0,3 mksec pour chaque élément + 15 ms d'initialisation, donc le tableau des éléments 10M prend environ 3 sec. La même fonctionnalité peut être implémentée via ScriptControl ActiveX (elle n'est pas disponible dans les versions MS Office 64 bits, vous pouvez donc utiliser une solution de contournement telle que this).