2010-11-04 27 views
6

Estoy escribiendo un script que recorrerá toda la hoja de cálculo y encontrará si hay algún duplicado de las celdas seleccionadas. si hay dups, la función devolverá una matriz cuyas filas son dups y creará un comentario que diga qué filas son dups. Pude manejar el error 0, pero ahora obtengo el error 9 cuando reviso la matriz si hay elementos en ella usando la función UBound. ¿Alguien sabe cómo validar la matriz de enteros si está vacía o no, porque mi código parece no estar haciendo el trabajo? A continuación se muestra el códigoVBA Manejar error de matriz vacía

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 

Respuesta

5

Prueba esto para comprobar una matriz vacía:

Dim arr() As String 

If (Not arr) = -1 Then 
    Debug.Print "empty" 
Else 
    Debug.Print "UBound is " & UBound(X) 
End If 

HTH!

+2

No me consta que tenga un conocimiento especial, pero aparentemente este método de comprobar si hay una matriz vacía está explotando un error en VBA y no debería utilizarse: http://stackoverflow.com/questions/183353/how-do-i- determine-si-una-matriz-es-inicializada-en-vb6/183356 # 183356 – jtolle

+0

@jtolle - seguramente su enlace es la discusión definitiva de esta pregunta. quizás esta Q debería marcar un dup. o al menos su enlace debería ser la respuesta a Q de Talguy. – hawbsl

+0

@jtolle Puede ser. Usé esto antes, pero como no lo creé, no reclamo ninguna virtud al respecto. –

6

Su función está fallando porque si no hay error planteada por UBound() (es decir, la matriz está dimensionada), entonces Err.Number es 0 y:

Case 0 
    IsArrayEmpty = True 

se ejecuta devolver un resultado incorrecto.

La forma más sencilla es simplemente para atrapar el error:

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

que funcionó mejor, pero todavía estoy obteniendo el script de error 9 fuera de los límites – Talguy

+1

'Dim a(): Debug.Print IsArrayEmpty (a)' funciona bien para mí ... Hacer Asegúrese de que no tiene Herramientas> Opciones> General> Romper todos los errores configurados –

+0

Funciona para mí también. –

1

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

si se obtiene el error # 9 .... ¿no significa que usted está Consiguiendo la información que necesita (array esta vacio)?

+0

esa es la información que quiero, pero el programa no salta al controlador de errores, en su lugar obtengo el pop que dice el error 9 – Talguy

+0

Hola Talguy, ¿has probado la sugestión de Alex K.? De acuerdo con este enlace si lo cambia en un programa de oficina, podría ser transferido al otro. – CaBieberach

+0

Consulte también este enlace . Sección "Error al manejar bloques y en error Goto". (La declaración múltiple "En caso de error" en el mismo procedimiento, no captará correctamente). – CaBieberach

3

¿Su variante de matriz es Vacía o Vacía()?

'vacío' es una variante sin inicializar: IsEmpty (miVar) devolverá verdadero ... Y usted podría ser engañado en pensar que tiene una matriz vacía (que es 'vacío()', no 'vacío' - tratan de sigue, habrá una breve prueba después de esta clase) porque IsEmpty (myArray) también es True.

 
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

Una forma fiable para comprobar miVar es TypeName (miVar) - si se trata de una matriz, el nombre contiene paréntesis:

 
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 respuesta completa es 'Detección de una variante de matriz en Excel VBA 'en Excellerando.

0

Puede comprobar si la matriz está vacía mediante la recuperación de elementos de cuentas totales usando VBArray() objeto de JScript (funciona con matrices de tipo variante, simple o multidimensional):

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 

Para mí se tarda aproximadamente 0,3 mksec para cada elemento + inicialización de 15 mseg, por lo que la matriz de elementos 10M tarda aproximadamente 3 segundos. La misma funcionalidad podría implementarse a través de ScriptControl ActiveX (no está disponible en versiones de 64 bits de MS Office, por lo que puede usar una solución alternativa como this).