Tenho um loop For para examinar se há algum resto quando divido os números de linha da coluna A por 10. Para esse propósito, uso a função MOD e defino uma variável aplicando Evaluate. Se o resultado dessa variável for zero, o código deve fazer tarefas adicionais que estão OK. Meu problema é que quando a rotina entra na instrução IF, recebo um erro de tempo de execução 13: incompatibilidade de tipo. Você pode me ajudar por quê? Aqui está meu código:
Sub copcol()
Dim nmr As Variant
Sheets(1).Activate
lrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To lrow
nmr = Evaluate("=MOD(ROW(A" & i & "),10)")
If nmr = 0 Then
'Do something
(1) O motivo da incompatibilidade de tipos é um pouco surpreendente: a fórmula retornará um array com um elemento, e você não pode verificar o valor de um array inteiro. Duas maneiras de consertar isso:
@
na frente da fórmula:Evaluate("=@MOD(ROW(A" & i & "),10)")
If nmr(1) = 0 Then
(2) Ambas as variantes são muito complicadas. Não há razão para usar a
Row
função - quando já temos o número emi
. A declaração a seguir já é um pouco mais fácil:(3) Não há razão para usar a
Evaluate
função - para chamar a versão Excel deMOD
. Use a função mod nativa do VBAMod
em vez disso:Não há praticamente nenhuma razão para usar
Evaluate
em VBA, exceto talvez se você precisar de fórmulas matemáticas complexas. Pessoalmente, não consigo me lembrar de usarEvaluate
mais do que talvez um punhado de vezes em toda a minha carreira em VBA.Evaluate
torna o código muito mais lento e abre a porta para erros difíceis de encontrar.(4) Se você realmente quiser fazer algo apenas a cada 10 linhas, você pode especificar isso já no seu
For
-loop (Scott Craner sugeriu isso nos comentários:)