Estoy trabajando con algunos legado de espagueti código que procesa algunos peludo EDI. La mayoría del código es indescifrable y no tiene sangría o comentarios, o incluso los buenos nombres de variable, pero hay una línea que me da problemas cuando me quite la On Error Resume Next declaración que hace que el script siempre el tiempo de espera.

If UBound(arylin) >= 1 Then
    Do Until arylin(0) = "PB" and arylin(1) = "DEF"
        ' Processing goes here - not relevant for this
    Loop
End If

La secuencia de comandos se ejecuta el condicional, pero los errores en el «Hasta» de la línea, diciendo:

De Microsoft VBScript en tiempo de ejecución error '800a0009' 

Subíndice fuera del intervalo: '[número: 0]' 

Ahora, ¿por qué en la Tierra esta dando un error si yo estoy probando el límite superior antes de comprobar, y es decir que el límite superior es de al menos 1?

Me pueden enviar más de el código si la tengo pero no quiero que mi predecesor era un hack y el código es muy feo.

  • realmente no estoy seguro, pero, no de las matrices en VBScript empieza con 1 y no con 0 ?
  • La mayoría de las colecciones en VBScript son 0, pero no todos.
  • Este es de base cero, porque he probado a cambiarlo a 1 y ahora se produjo un error en una parte posterior de el código que se accede arylin(2). No del todo seguro ya que nunca he mirado en este trozo de código antes; los usuarios se quejan de que dejó de funcionar de repente.
  • Básicamente he cambiado de arylin(0) y arylin(1) a arylin(1) y arylin(2) y me dijo que 2 estaba fuera de su alcance, pero haciendo UBound devuelve 2
  • También he probado a través de la Respuesta.Escribir los índices 0 y 1, justo antes del bucle, y ambos tienen valores!
  • Está usted seguro de que la variable de matriz no es modificado o re-asignado durante el procesamiento en el bucle?

InformationsquelleAutor Wayne Molina | 2009-10-02

2 Comentarios

  1. 3

    UBound() devuelve el índice del último elemento de la matriz. De forma predeterminada, las matrices en vb idiomas antes de vb.net comienzan en 1 en lugar de 0 (es decir, el recuento y el índice normalmente son la misma cosa, aunque usted puede cambiar el valor predeterminado con Option Base).

    Poner esos juntos vas a ver que está fallando aquí:

    arylin(0) = "PB"
    • Matrices de crear en VBScript siempre empiezan en 0 y VBScript no Opción de soporte de la Base. Sin embargo VBScript no admite SAFEARRAY de las variantes que puede tener distinto de cero LBound valores. Muchos de VB basado en componentes COM de retorno 1 basados en matrices.
  2. 3

    Ver AnthonyWJones comentario)
    (Con VB se puede establecer la base de las matrices para empezar en 0 o 1 – debe estar en o cerca de la parte superior de un módulo: buscar opciones de Base 1 o la Opción de Base de 0.)

    LBound siempre devolverá 0.(También puede utilizar LBound() para comprobar el límite inferior de la matriz.)

    (Solo se va a mostrar: no esperes MS para ser coherente!)

    Aunque se compruebe que la matriz de tamaño es >= 1 – que se asegurará de que arylin(0) es válido, pero no necesariamente arylin(1). El índice de base cero de modo que si un elemento existe, será en el indice=0, y el índice=1 será fuera de los límites.

    Debe comprobar que la matriz de tamaño >= 2 en este caso. Si utiliza dos entradas siguientes uno a otro constantemente, entonces el cheque debe ser hecho para (matriz de tamaño) mod 2 = 0.

    También asegúrese de que lo que el valor de UBound devuelve realmente. Busqué en google y recibió información contradictoria: este dice que devuelve el ‘contar’, mientras que este dice devuelve el límite físico (= ‘contar’ -1).

    Sobre el «On Error Resume Next’ cosa, tal vez debería quedarse allí

    • La opción de la Base que no se admite en VBScript
    • Re: UBound, directamente desde el fuente, «Devuelve el mayor subíndice disponible para la indicada en la dimensión de una matriz.» (el énfasis es mío)

Dejar respuesta

Please enter your comment!
Please enter your name here