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áveisVariant às vezes são bloqueadas temporariamente. Esse erro tem as seguintes causas e soluções:

  • Você tentou usar 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 por 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 fixa 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 de nível de módulo, na qual um elemento foi passado como um argumento para um procedimento. Por exemplo, no código a seguir, ModArray está uma matriz dinâmica de nível de módulo cujo quadragésimo Test quinto elemento está sendo passado por referência ao 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 há necessidade de passar um elemento da matriz de nível de módulo nesse caso, pois ele é visível em todos os procedimentos do módulo. No entanto, se um elemento for passado, a matriz será bloqueada para evitar uma desalocação de memória para o parâmetro de referência dentro do procedimento, causando um comportamento imprevisível quando o procedimento retornar.

  • Você tentou atribuir um valor a uma variável Variant contendo uma matriz, mas a Variant está bloqueada no momento. Por exemplo, se o seu código usa um For Each... Próximo loop Para iterar sobre uma variante contendo uma matriz, a matriz é bloqueada na entrada no loop e, em seguida, liberada no final 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 
    

    Use um para... Próximo , em vez de um Para Cada... Próximo loop para iterar. Quando uma matriz é o objeto de um evento 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.