Share via


Essa matriz foi corrigida ou bloqueada temporariamente (Erro 10)

Nem todas as matrizes podem ser redimensionadas. Mesmo matrizes especificamente declaradas como dinâmicas e matrizes dentro de variáveis Variant às vezes são bloqueadas temporariamente. Esse erro tem as seguintes causas e soluções:

  • Você tentou usar o ReDim para alterar o número de elementos de uma matriz de tamanho fixo . Por exemplo, no código a seguir, a matriz FixedArr fixa é recebida pelo SomeArr no procedimento e, em NextOne seguida, é feita uma tentativa de redimensionar 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 
    

    Torne a matriz original dinâmica em vez de fixada declarando-a com ReDim (se a matriz for declarada dentro de um procedimento) ou declarando-a sem especificar o número de elementos (se a matriz for declarada no nível do módulo).

  • Você tentou redimensionar uma matriz dinâmica no nível do módulo, na qual um elemento foi passado como argumento para um procedimento. Por exemplo, no código a seguir, ModArray está uma matriz dinâmica no nível do módulo cujo elemento 45 está sendo passado por referência ao Test procedimento:

      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 
    

    Não é necessário passar um elemento da matriz no nível do módulo nesse caso, pois ele está visível em todos os procedimentos no módulo. No entanto, se um elemento for passado, a matriz será bloqueada para impedir uma desalocação da memória para o parâmetro de referência dentro do procedimento, causando um comportamento imprevisível quando o procedimento retorna.

  • Você tentou atribuir um valor a uma variável Variant que contém uma matriz, mas a Variant está bloqueada no momento. Por exemplo, se o código usar um For Each... Próximo loop para iterar em uma variante que contém uma matriz, a matriz é bloqueada na entrada no loop e, em seguida, lançada no término do loop:

      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 
    

    Usar um For... Em seguida , em vez de um para cada... Próximo loop para iterar. Quando uma matriz é o objeto de um For Each... No próximo loop, você pode ler a matriz, mas não gravar nela.

Saiba mais selecionando o item em questão e pressionando F1 (no Windows) ou HELP (no Macintosh).

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.