Compartilhar via


Essa matriz foi corrigida ou bloqueada temporariamente (Erro 10)

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

  • Tentou utilizar ReDim para alterar o número de elementos de uma matriz de tamanho fixo. Por exemplo, no código seguinte, a matriz FixedArr fixa é recebida pelo SomeArr no NextOne procedimento e, em 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 ao declará-la com ReDim (se a matriz for declarada dentro de um procedimento) ou ao declará-la sem especificar o número de elementos (se a matriz for declarada ao nível do módulo).

  • Tentou redimensionar uma matriz dinâmica ao nível do módulo, na qual um elemento foi transmitido como um argumento para um procedimento. Por exemplo, no seguinte código, ModArray está uma matriz dinâmica ao nível do módulo cujo 45 elemento está a ser transmitido 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 transmitir um elemento da matriz ao nível do módulo neste caso, uma vez que está visível em todos os procedimentos no módulo. No entanto, se um elemento for transmitido, a matriz é bloqueada para impedir uma desalocada de memória para o parâmetro de referência no procedimento, causando um comportamento imprevisível quando o procedimento é devolvido.

  • Tentou atribuir um valor a uma variável variante que contém uma matriz, mas a Variante está atualmente bloqueada. Por exemplo, se o código utilizar um para cada... Ciclo seguinte para iterar sobre uma variante que contém uma matriz, a matriz é bloqueada na entrada no ciclo e, em seguida, libertada na terminação do ciclo:

      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 
    

    Utilizar um Para... Seguinte em vez de um Para Cada... Próximo ciclo para iterar. Quando uma matriz é o objeto de um Para Cada... No ciclo seguinte , pode ler a matriz, mas não escrever na mesma.

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.