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 peloSomeArr
noNextOne
procedimento e, em seguida, é feita uma tentativa de redimensionarSomeArr
: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 aoTest
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.