Notifications
Clear all

Erro em tempo de execução 1004

6 Posts
3 Usuários
0 Reactions
1,265 Visualizações
(@junexr8)
Posts: 0
New Member
Topic starter
 

Boa tarde galera. Estou aqui fazendo uns testes para aprender mais sobre VBA.
Estou criando varias sub's cada uma fazendo uma coisa. Na planilha eu inseri um botão que vai executar cada uma dessas sub's em sequencia. Na sub abaixo estou encontrando problema:

Sub ProcuraCelulaVazia()
    'Seleciona a linha 1 até 1048576
    Range("N1048576").Select
    'Posiciona na última linha com valores
    Selection.End(xlDown).Select
    'Posiciona na última vazia
    ActiveCell.Offset(1, 0).Range("N1").Select
    ActiveCell.Value = "Encontrei a célula vazia!!"
End Sub

Quando chega em 'ActiveCell.Offset(1, 0).Range("N1").Select' aparece o seguinte erro:
Erro em tempo de execução 1004
Erro de definição de aplicativo ou de definição de objeto

Não consegui identificar o por que desse erro. Poderiam me ajudar?

 
Postado : 09/04/2015 12:29 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 
Sub ProcuraCelulaVazia()
'Primeiro erro, abaixo, esta linha só seleciona a última célula, lá embaixo na coluna N, não seleciona todo o intervalo N1:N1048576
    Range("N1048576").Select 

'pq somente N1048576 está selecionada, a linha abaixo tenta ir mais pra baixo e não consegue, mas funciona, mas a seleção continua na N1048576
    Selection.End(xlDown).Select

'aqui ocorre o erro, vc está tentando a partir da célula N1048576 selecionar a célula imediatamente abaixo, que não existe
    ActiveCell.Offset(1, 0).Range("N1").Select
    ActiveCell.Value = "Encontrei a célula vazia!!"

End Sub

A minha sugestão de solução, apesar de que existem outras maneiras melhores de fazer isso, seria:
Troque:

    Range("N1048576").Select 

Por:

    Range("N1:N1048576").Select 
 
Postado : 09/04/2015 12:36 pm
(@junexr8)
Posts: 0
New Member
Topic starter
 

Olá Fernando,

Obrigado pela ajuda. Realmente o erro parou de ocorrer, porém célula vazia desejada não esta recebendo o valor. As células de N1 a N7 tem itens.

ActiveCell.Value = "Encontrei a célula vazia!!" esta sendo inserido nem "AA8" e deveria se em "N8".

Debugando aqui vi que quando ele executa:

ActiveCell.Offset(1, 0).Range("N1").Select

Ele vai direto para "AA8".

Consegui me ajudar a saber porque ele vai para o lugar errado?

 
Postado : 09/04/2015 1:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

sim.. troque:

    ActiveCell.Offset(1, 0).Range("N1").Select

por:

    ActiveCell.Offset(1, 0).Select
 
Postado : 09/04/2015 1:24 pm
(@edcronos)
Posts: 1006
Noble Member
 

eu realmente não entendi oq vc quer
mas considero aprender com praticas reais muito mais facil

vai informar a primeira linha vazia de cima para baixo a partir de uma linha inicial "tem que entender o uso"
Sheets("Nome_aba").Cells(linhainicial, Coluna).End(xlDown).Row+1
Row é a linha onde o comando para +1 é a linha logo abaixo

função que retorna numero da primeira linha que tem valor depois depois de certa linha inicial

Public Function PLinhaRange(ByVal Linha_inicial_de_Busca As Long, ByVal Letra_Coluna_ini As String, ByVal Letra_Coluna_Fim As String, Optional Nome_aba As String) As Long   'ultima linha com dados
    'Application.Volatile
    Dim C As Long, fLC As Long
    If Nome_aba = "" Then Nome_aba = ActiveSheet.Name
    cir = Cells(1, Letra_Coluna_ini).Column: cfr = Cells(1, Letra_Coluna_Fim).Column
    fLC = Linha_inicial_de_Busca
    For C = cir To cfr
        fl1 = Sheets(Nome_aba).Cells(fLC, C).End(xlDown).Row
        If fl1 > fLC And fl1 < Rows.Count Then fL2 = fl1
    Next
    PLinhaRange = fL2
End Function

indica a primeira linha vazia depois de uma linha preenchida ( de baixo para cima )
Sheets("Nome_aba").Cells(Rows.Count, Coluna).End(xlUp).Row+1

função que retorna ultima linha com dados de uma range

Public Function ULinhaRange(ByVal Letra_Coluna_ini As String, ByVal Letra_Coluna_Fim As String, Optional Nome_aba As String) As Long   'ultima linha com dados
    'Application.Volatile
    Dim C As Long, fLC As Long
    If Nome_aba = "" Then Nome_aba = ActiveSheet.Name
    fLC = 105
    For C = Cells(1, Letra_Coluna_ini).Column To Cells(1, Letra_Coluna_Fim).Column
        If Sheets(Nome_aba).Cells(Rows.Count, C).End(xlUp).Row > fLC Then fLC = Sheets(Nome_aba).Cells(Rows.Count, C).End(xlUp).Row
    Next
    ULinhaRange = fLC
End Function

desculpe as minha macros complicadas, infelizmente só sei fazer assim

 
Postado : 09/04/2015 1:38 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

JunexR8, se a resposta te ajudou, clique na mãozinha das respostas que te atenderam, e marque o tópico como resolvido, clicando no botãozinho verde acima da msg que solucionou seu problema.

 
Postado : 09/04/2015 1:53 pm