Compartir vía


Esta matriz se ha fijado o está bloqueada temporalmente (error 10)

No todas las matrices pueden redimensionarse. Incluso las matrices que se han declarado específicamente como dinámicas y las matrices en las variables Variant se bloquean a veces temporalmente. Este error está provocado por las siguientes causas y tiene las siguientes soluciones:

  • Ha intentado usar ReDim para cambiar el número de elementos de una matriz de tamaño fijo. Por ejemplo, en el siguiente código, se recibe la matriz fija FixedArr mediante SomeArr en el procedimiento NextOney, a continuación, se realiza un intento de cambiar el tamaño de SomeArr:

      Sub FirstOne 
        Dim FixedArr(25) As Integer    ' Create a fixed-size array and 
        NextOne FixedArr()    ' pass it to another procedure. 
      End Sub 
    
      Sub NextOne(SomeArr() As Integer) 
        ReDim SomeArr(35)        ' Error 10 occurs here. 
        '. . . 
      End Sub 
    

    Haga que la matriz original sea dinámica en lugar de fija declarándola con ReDim (si la matriz se declara en un procedimiento) o declarándola sin especificar el número de elementos (si la matriz se declara en el nivel de módulo).

  • Ha intentado redimensionar una matriz dinámica de nivel de módulo en la que un elemento ha pasado como argumento a un procedimiento. Por ejemplo, en el código siguiente, ModArray es una matriz dinámica de nivel de módulo cuyo cuadragésimo quinto elemento se pasa por referencia al Test procedimiento:

      Dim ModArray () As Integer    ' Create a module-level dynamic array. 
      '. . . 
    
      Sub AliasError() 
        ReDim ModArray (1 To 73) As Integer 
      Test ModArray(45)    ' Pass an element of the module-level  
      ' array to the Test procedure. 
      End Sub 
    
      Sub Test(SomeInt As Integer) 
        ReDim ModArray (1 To 40) As Integer  ' Error occurs here. 
      End Sub 
    

    No hay necesidad de pasar un elemento de la matriz de nivel de módulo en este caso puesto que es visible en todos los procedimientos del módulo. Sin embargo, si se pasa un elemento, la matriz se bloquea para evitar la desasignación de memoria para el parámetro de referencia en el procedimiento, lo que provoca un comportamiento impredecible cuando el procedimiento vuelve.

  • Ha intentado asignar un valor a una variable Variant que contiene una matriz, pero la variable Variant está bloqueada actualmente. Por ejemplo, si el código usa un bucle For Each...Next para iterar en una variante que contiene una matriz, la matriz se bloquea al principio del bucle y se libera al final de él:

      SomeArray = Array(9,8,7,6,5,4,3,2,1) 
    
      For Each X In SomeArray 
        SomeArray = 301    ' Causes error since array is locked. 
      Next X 
    

    Use un bucle For...Next en lugar de uno For Each...Next para iterar. Cuando una matriz es el objeto de un bucle For Each...Next, puede leer la matriz, pero no escribir en ella.

Para más información, seleccione el elemento en cuestión y presione F1 (en Windows) o AYUDA (en Macintosh).

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.